Как настроить параметры камеры Hikvision с помощью PHP curl

Я пытаюсь автоматизировать настройку камеры Hikvision с помощью XML-API Hikvision IPMD. Я могу получить данные камеры, используя любую из документированных служб, но мои попытки изменить значения полей не удаются. Вот код, который я использую deviceInfo для изменения имени системного устройства.

define('_EOL', "\n");

// Set device name
$url='http://192.168.6.12/System/deviceInfo';
$creds='admin:password';
$body='<?xml version="1.0" encoding="UTF-8"?>'.
    '<DeviceInfo xmlns="http://www.hikvision.com/ver10/XMLSchema" version="1.0">'.
    '<deviceName>Cam 7 AAAA</deviceName>'.
    '<deviceID>88</deviceID>'.
    '</DeviceInfo> ';
$tmpFile='temp.txt';
file_put_contents($tmpFile, $body);
$bytes=filesize($tmpFile);
$stream=fopen($tmpFile, 'r');
echo('Bytes='.$bytes.', handle='.$stream._EOL);

$session=curl_init(); // initialize a curl session
curl_setopt($session,CURLOPT_URL, $url);
curl_setopt($session,CURLOPT_USERPWD, $creds);
curl_setopt($session,CURLOPT_HEADER,TRUE);
curl_setopt($session,CURLOPT_RETURNTRANSFER, TRUE);
//curl_setopt($session,CURLOPT_PUT, TRUE);
curl_setopt($session,CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($session,CURLOPT_CUSTOMREQUEST, 'Content-Type: application/xml; charset="UTF-8"');
curl_setopt($session,CURLOPT_INFILE, $stream);  // XML block
curl_setopt($session,CURLOPT_INFILESIZE, $bytes); // size in bytes

$page=curl_exec($session);
$info=curl_getinfo($session);
$err='curl error: '.curl_errno($session).' '.curl_error($session);

curl_close($session);

print_r($info);
echo($err._EOL);
echo($page._EOL);

А вот информация о скручивании по запросу. Кажется, камера не отвечает на запрос.

Bytes=185, handle=Resource id #6
Array
(
    [url] => http://192.168.6.12/System/deviceInfo
    [content_type] => 
    [http_code] => 0
    [header_size] => 0
    [request_size] => 197
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.016
    [namelookup_time] => 0
    [connect_time] => 0.016
    [pretransfer_time] => 0.016
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => 185
    [starttransfer_time] => 0.016
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [primary_ip] => 192.168.6.12
    [primary_port] => 80
    [local_ip] => 192.168.6.99
    [local_port] => 2903
    [redirect_url] => 
)
curl error: 52 Empty reply from server

Кстати, это ответ камеры на GET /System/deviceInfo:

<?xml version="1.0" encoding="UTF-8"?>
<DeviceInfo version="1.0" xmlns="http://www.hikvision.com/ver10/XMLSchema">
<deviceName>Cam 2 DEMO</deviceName>
<deviceID>88</deviceID>
<deviceDescription>IPCamera</deviceDescription>
<deviceLocation>hangzhou</deviceLocation>
<systemContact>Hikvision.China</systemContact>
<model>DS-2CD2042WD-I</model>
<serialNumber>DS-2CD2042WD-I20170519BBWR764768522</serialNumber>
<macAddress>18:68:cb:76:48:ce</macAddress>
<firmwareVersion>V5.4.5</firmwareVersion>
<firmwareReleasedDate>build 170124</firmwareReleasedDate>
<bootVersion>V1.3.4</bootVersion>
<bootReleasedDate>100316</bootReleasedDate>
<hardwareVersion>0x0</hardwareVersion>
</DeviceInfo>

Ранее я пытался использовать все три типа EOL (Mac, Linux, DOS), прежде чем удалить их все, как в коде выше. Я знаю, что аутентификация работает, потому что я могу читать что-нибудь с камеры. Я также могу успешно отправлять команды PUT, для которых нет требований к данным или блокам XML, например, для перезагрузки. Поэтому я подозреваю, что у меня возникли проблемы с отправкой XML через curl. Кроме того, я могу изменить имя устройства через веб-браузер при входе в систему. Затем, когда я читаю информацию об устройстве, изменения отображаются в ответе XML. Есть идеи, где я ошибся? Благодарю.

ОБНОВЛЕНИЕ 30/08/2018

Я отказался от использования API камеры для настройки. Я нашел только несколько команд, которые действительно работали (например, перезагрузка и некоторые запросы только для чтения). Вместо этого я использовал Watir и Ruby для доступа к камере через ее веб-интерфейс. Это оказалось очень надежным способом автоматизации конфигурации камеры.

0 ответов

Спустя почти два с половиной года модель камеры Hikvision, которую я использовал, теперь устарела, и API снова изменился. Поскольку я купил камеры у Amazon, Hikvision не оказал никакой поддержки, даже не указал мне на действующий документ по API. Поэтому я обратился к другому решению.

Я перешел на Ruby и Watir для работы с камерой через веб-интерфейс. Неудивительно, что это оказалось трудным, потому что в HTML на каждой странице конфигурации не хватало уникальной информации для выбора элементов формы. Тем не менее, приложив достаточно усилий, я смог написать сценарий, который полностью автоматизировал настройку камеры. Вот несколько ключевых фрагментов этого сценария.

require 'watir-webdriver'
require "watir-webdriver/extensions/alerts"

  @browser = Watir::Browser.new :chrome # chrome @browser window

  # Select Time Zone, index 1
  @browser.select_list(:index, 1).select_value('CST+0:00:00')

Первые два загружают Watir Webdriver, основное программное обеспечение, которое взаимодействует с браузером. Средняя строка открывает браузер Chrome. Последние два показывают пример того, как выбрать поле и установить значение, когда поле не имеет уникальных идентифицирующих меток, таких как идентификатор.

Посетите веб-сайт Watir в Watir, чтобы получить подробную информацию.

Другие вопросы по тегам