如何使用PHP curl设置海康威视摄像头参数

时间:2017-08-17 17:00:53

标签: php xml put ip-camera hikvision

我正在尝试使用海康威视IPMD XML API自动化海康威视相机配置。我能够使用任何记录的服务检索相机数据,但我尝试更改字段值失败。这是我正在使用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),然后将其全部删除,如上面的代码所示。我知道认证有效,因为我可以从相机中读取任何内容。我也可以成功发送没有数据或XML块要求的PUT命令,例如重启。所以我怀疑我是如何通过curl发送XML的。此外,我可以在登录时通过Web浏览器更改设备名称。然后,当我读取设备信息时,更改将显示在XML响应中。我出错的任何想法?感谢。

更新8/30/2018

我放弃使用相机API进行配置。我只找到了一些实际工作的命令(如重启和一些只读请求)。相反,我使用Watir和Ruby通过其Web界面访问相机。事实证明,这是一种自动化摄像机配置的非常可靠的方法。

1 个答案:

答案 0 :(得分:0)

将近两年半后,我使用的海康威视摄像机型号现在已过时,API再次更改。因为我是从亚马逊购买相机的,所以海康威视不会提供任何支持,甚至无法指向我指向API上的有效文档。所以我转向了另一个解决方案。

我改用Ruby和Watir通过Web界面与相机配合使用。毫不奇怪,事实证明这很困难,因为每个配置页上的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浏览器。最后两个示例显示了如何在没有唯一标识标签(例如ID)的字段中选择字段并设置值的示例。

访问{@ 3}的Watir网站以获取详细信息。