<div style="font-size:16px;">
<p>此贴能起到的作用</p>
<p>通过这个帖子,能了解到如何用Python调用海康SDK,实现业务逻辑需要结合哪些资料,这些接口的参数是怎么样的,如何翻译成Python,如何传参,参数中的一些变量,常量可以怎样查找。</p>
<p>开发资源</p>
<p>SDK只有对linux和windows的支持,没有对mac的支持,所以mac开发比较累</p>
<p>基于SDK开发</p>
<p>从官方给到的SDK中有.chm的文件,是一个接口文档,里面详细的介绍了该SDK的所有描述。</p>
<p>SDK中给到了基于Java,C#等demo,但是没有python。(这些demo可以帮我们理解一些比较晦涩难懂的逻辑,但是demo写的也没有很严格,部分变量类型定义不是完全按照文档来的,需要自己消化)</p>
<p>linux和windows的SDK中分别是.so和.dll,对于python我们需要ctypes库来完成二次开发</p>
<p>硬件产品开发文档,这里有详细硬件功能调用链,很详细,不过demo是c++的,另外demo中的一些变量或者常量不能查看引用,所以可以与第一项中提到的文档结合,如果两者描述不符,以当前SDK中的.chm文件优先。</p>
<p>代码实践</p>
<p>目前开源库以更新迭代,以下为原始代码,如果需要用到用到Python开发,可以直接使用开源库。</p>
<p>基础SDK调用实现</p>
<p>from ctypes import *</p>
<p>import os</p>
<p>import logging</p>
<p>import hkws.model.login as login</p>
<p>import hkws.model.preview as preview</p>
<p>from hkws.callback import hikFunc</p>
<p>from hkws.callback import g_real_data_call_back</p>
<p>class HKAdapter:</p>
<p>so_list = []</p>
<p># 加载目录下所有so文件</p>
<p>def add_lib(self, path, suffix):</p>
<p>files = os.listdir(path)</p>
<p>for file in files:</p>
<p>if not os.path.isdir(path + file):</p>
<p>if file.endswith(suffix):</p>
<p>self.so_list.append(path + file)</p>
<p>else:</p>
<p>self.add_lib(path + file + "/", suffix)</p>
<p># python 调用 sdk 指定方法</p>
<p>def call_cpp(self, func_name, *args):</p>
<p>for so_lib in self.so_list:</p>
<p>try:</p>
<p>lib = cdll.LoadLibrary(so_lib)</p>
<p>try:</p>
<p>value = eval("lib.%s" % func_name)(*args)</p>
<p>logging.info("调用的库:" + so_lib)</p>
<p>logging.info("执行成功,返回值:" + str(value))</p>
<p>return value</p>
<p>except:</p>
<p>continue</p>
<p>except:</p>
<p>continue</p>
<p># logging.info("库文件载入失败:" + so_lib )</p>
<p>logging.error("没有找到接口!")</p>
<p>return False</p>
<p>初始化SDK及释放SDK</p>
<p># 初始化海康微视 sdk</p>
<p>def init_sdk(self):</p>
<p>init_res = self.call_cpp("NET_DVR_Init") # SDK初始化</p>
<p>if init_res:</p>
<p>logging.info("SDK初始化成功")</p>
<p>return True</p>
<p>else:</p>
<p>error_info = self.call_cpp("NET_DVR_GetLastError")</p>
<p>logging.error("SDK初始化错误:" + str(error_info))</p>
<p>return False</p>
<p># 释放sdk</p>
<p>def sdk_clean(self):</p>
<p>result = self.call_cpp("NET_DVR_Cleanup")</p>
<p>logging.info("释放资源", result)</p>
<p>用户设备登录</p>
<p>请求所用参数,这里需要用python ctypes参照https://open.hikvision.com/hardware/definitions/NET_DVR_Login_V40.html 所给出的结构写出对应的python类,有些常量具体数值是没有的,需要结合之前所说的Java,C#的demo看。</p>
<p>class NET_DVR_USER_LOGIN_INFO(Structure):</p>
<p>_fields_ = [</p>
<p>("sDeviceAddress", c_byte * 129), # 设备地址,IP或者普通域名</p>
<p>("byUseTransport", c_byte), # 是否启用能力透传 0:不启动,默认 1:启动</p>
<p>("wPort", c_uint16), # 设备端口号</p>
<p>("sUserName", c_byte * 64), # 登录用户名</p>
<p>("sPassword", c_byte * 64), # 登录密码</p>
<p># ("fLoginResultCallBack",) #</p>
<p>("bUseAsynLogin", c_bool), # 是否异步登录, 0:否 1:是</p>
<p>("byProxyType", c_byte), # 代理服务器类型:0- 不使用代理,1- 使用标准代理,2- 使用EHome代理</p>
<p># 是否使用UTC时间:</p>
<p># 0 - 不进行转换,默认;</p>
<p># 1 - 输入输出UTC时间,SDK进行与设备时区的转换;</p>
<p># 2 - 输入输出平台本地时间,SDK进行与设备时区的转换</p>
<p>("byUseUTCTime", c_byte),</p>
<p># 登录模式(不同模式具体含义详见“Remarks”说明):</p>
<p># 0- SDK私有协议,</p>
<p># 1- ISAPI协议,</p>
<p># 2- 自适应(设备支持协议类型未知时使用,一般不建议)</p>
<p>("byLoginMode", c_byte),</p>
<p># ISAPI协议登录时是否启用HTTPS(byLoginMode为1时有效):</p>
<p># 0 - 不启用,</p>
<p># 1 - 启用,</p>
<p># 2 - 自适应(设备支持协议类型未知时使用&# |
|