如何使用PHP curl设置海康威视摄像头参数
How to set Hikvision camera parameters using PHP curl
我正在尝试使用 Hikvision IPMD XML API 自动配置 Hikvision 摄像头。我能够使用任何记录的服务检索相机数据,但我尝试更改字段值失败了。这是我使用 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 的方式有问题。此外,我可以在登录时通过网络浏览器更改设备名称。然后,当我读取设备信息时,更改会显示在 XML 响应中。我哪里出错了?谢谢
2018 年 8 月 30 日更新
我放弃了使用摄像头API进行配置。我只发现了一些实际有效的命令(比如重启和一些只读请求)。相反,我使用 Watir 和 Ruby 通过其网络界面访问相机。事实证明,这是一种非常可靠的自动配置相机的方法。
差不多两年半过去了,我用的海康威视相机型号现在已经过时了,API又变了。因为我是从亚马逊买的摄像头,海康威视不提供任何支持,甚至不给我指点 API 上的有效文件。所以我转向了不同的解决方案。
我转而使用 Ruby 和 Watir 通过 Web 界面使用相机。毫不奇怪,这被证明是困难的,因为每个配置页面上的 HTML 缺少 select 表单元素的唯一信息。尽管如此,通过足够的工作,我还是能够编写一个完全自动化相机配置的脚本。以下是该脚本的一些关键片段。
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 浏览器。最后两个示例显示了如何 select 字段并在字段没有唯一标识标签(如 id)时设置值。
前往 Watir 的 Watir 网站获取详细信息。
我正在尝试使用 Hikvision IPMD XML API 自动配置 Hikvision 摄像头。我能够使用任何记录的服务检索相机数据,但我尝试更改字段值失败了。这是我使用 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 的方式有问题。此外,我可以在登录时通过网络浏览器更改设备名称。然后,当我读取设备信息时,更改会显示在 XML 响应中。我哪里出错了?谢谢
2018 年 8 月 30 日更新
我放弃了使用摄像头API进行配置。我只发现了一些实际有效的命令(比如重启和一些只读请求)。相反,我使用 Watir 和 Ruby 通过其网络界面访问相机。事实证明,这是一种非常可靠的自动配置相机的方法。
差不多两年半过去了,我用的海康威视相机型号现在已经过时了,API又变了。因为我是从亚马逊买的摄像头,海康威视不提供任何支持,甚至不给我指点 API 上的有效文件。所以我转向了不同的解决方案。
我转而使用 Ruby 和 Watir 通过 Web 界面使用相机。毫不奇怪,这被证明是困难的,因为每个配置页面上的 HTML 缺少 select 表单元素的唯一信息。尽管如此,通过足够的工作,我还是能够编写一个完全自动化相机配置的脚本。以下是该脚本的一些关键片段。
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 浏览器。最后两个示例显示了如何 select 字段并在字段没有唯一标识标签(如 id)时设置值。
前往 Watir 的 Watir 网站获取详细信息。