Python实现海康威视SDK⼆次开发(开源库)
此贴能起到的作⽤
通过这个帖⼦,能了解到如何⽤Python调⽤海康SDK,实现业务逻辑需要结合哪些资料,这些接⼝的参数是怎么样的,如何翻译成Python,如何传参,参数中的⼀些变量,常量可以怎样查。
开源库通道,如果帮助到了您,希望给该库标星,顶上去,谢谢
开发资源
SDK只有对linux和windows的⽀持,没有对mac的⽀持,所以mac开发⽐较累
基于SDK开发
1. 从官⽅给到的SDK中有.chm的⽂件,是⼀个接⼝⽂档,⾥⾯详细的介绍了该SDK的所有描述。
2. SDK中给到了基于Java,C#等demo,但是没有python。(这些demo可以帮我们理解⼀些⽐较晦涩难懂的逻辑,但是demo写的也没有很严
格,部分变量类型定义不是完全按照⽂档来的,需要⾃⼰消化)
3. linux和windows的SDK中分别是.so和.dll,对于python我们需要ctypes库来完成⼆次开发
4. 硬件产品开发⽂档,这⾥有详细硬件功能调⽤链,很详细,不过demo是c++的,另外demo中的⼀些变量或者常量不能查看引⽤,所以可以与
第⼀项中提到的⽂档结合,如果两者描述不符,以当前SDK中的.chm⽂件优先。
5. open.hikvision/hardware/definitions/接⼝或实体.html
,这个是在线接⼝详细⽂档。
代码实践
⽬前开源库以更新迭代,以下为原始代码,如果需要⽤到⽤到Python开发,可以直接使⽤开源库。
1. 基础SDK调⽤实现
class NET_DVR_USER_LOGIN_INFO(Structure):
_fields_ = [
("sDeviceAddress", c_byte * 129), # 设备地址,IP或者普通域名
("byUseTransport", c_byte), # 是否启⽤能⼒透传 0:不启动,默认 1:启动
("wPort", c_uint16), # 设备端⼝号
("sUserName", c_byte * 64), # 登录⽤户名
("sPassword", c_byte * 64), # 登录密码
# ("fLoginResultCallBack",) #
("bUseAsynLogin", c_bool), # 是否异步登录, 0:否 1:是
("byProxyType", c_byte), # 代理服务器类型:0- 不使⽤代理,1- 使⽤标准代理,2- 使⽤EHome代理
# 是否使⽤UTC时间:
# 0 - 不进⾏转换,默认;
# 1 - 输⼊输出UTC时间,SDK进⾏与设备时区的转换;
# 2 - 输⼊输出平台本地时间,SDK进⾏与设备时区的转换
("byUseUTCTime", c_byte),
# 登录模式(不同模式具体含义详见“Remarks”说明):
# 0- SDK私有协议,
# 1- ISAPI协议,
# 2- ⾃适应(设备⽀持协议类型未知时使⽤,⼀般不建议)
("byLoginMode", c_byte),
# ISAPI协议登录时是否启⽤HTTPS(byLoginMode为1时有效):
# 0 - 不启⽤,
# 1 - 启⽤,
# 2 - ⾃适应(设备⽀持协议类型未知时使⽤,⼀般不建议)
("byHttps", c_byte),
# 代理服务器序号,添加代理服务器信息时相对应的服务器数组下表值
("iProxyID", c_long),
# 保留,置为0
("byRes3", c_byte * 120),
]
# 设备参数结构体。
class NET_DVR_DEVICEINFO_V30(Structure):
_fields_ = [
("sSerialNumber", c_byte * 48), # 序列号
("byAlarmInPortNum", c_byte), # 模拟报警输⼊个数
("byAlarmOutPortNum", c_byte), # 模拟报警输出个数
("byDiskNum", c_byte), # 硬盘个数
("byDVRType", c_byte), # 设备类型,详见下⽂列表
("byChanNum", c_byte), # 设备模拟通道个数,数字(IP)通道最⼤个数为byIPChanNum + byHighDChanNum*256
("byStartChan", c_byte), # 模拟通道的起始通道号,从1开始。数字通道的起始通道号见下⾯参数byStartDChan
("byAudioChanNum", c_byte), # 设备语⾳对讲通道数
("byIPChanNum", c_byte),
# 设备最⼤数字通道个数,低8位,搞8位见byHighDChanNum. 可以根据ip通道个数是否调⽤NET_DV
R_GetDVRConfig (配置命令NET_DVR_GET_IPPARACFG_V40)获得 ("byZeroChanNum", c_byte), # 零通道编码个数
("byMainProto", c_byte), # 主码流传输协议类型: 0 - private, 1 - rtsp, 2- 同时⽀持私有协议和rtsp协议去留(默认采⽤私有协议取流)
("bySubProto", c_byte), # 字码流传输协议类型: 0 - private , 1 - rtsp , 2 - 同时⽀持私有协议和rtsp协议取流(默认采⽤私有协议取流)
# 能⼒,位与结果为0表⽰不⽀持,1
# 表⽰⽀持
# bySupport & 0x1,表⽰是否⽀持智能搜索
# bySupport & 0x2,表⽰是否⽀持备份
# bySupport & 0x4,表⽰是否⽀持压缩参数能⼒获取
# bySupport & 0x8, 表⽰是否⽀持双⽹卡
# bySupport & 0x10, 表⽰⽀持远程SADP
# bySupport & 0x20, 表⽰⽀持Raid卡功能
# bySupport & 0x40, 表⽰⽀持IPSAN⽬录查
# bySupport & 0x80, 表⽰⽀持rtp over rtsp
("bySupport", c_byte),
# 能⼒集扩充,位与结果为0表⽰不⽀持,1
# 表⽰⽀持
# bySupport1 & 0x1, 表⽰是否⽀持snmp
# v30
# bySupport1 & 0x2, 表⽰是否⽀持区分回放和下载
# bySupport1 & 0x4, 表⽰是否⽀持布防优先级
# bySupport1 & 0x8, 表⽰智能设备是否⽀持布防时间段扩展
# bySupport1 & 0x10, 表⽰是否⽀持多磁盘数(超过33个)
# bySupport1 & 0x20, 表⽰是否⽀持rtsp over http
# bySupport1 & 0x80, 表⽰是否⽀持车牌新报警信息,且还表⽰是否⽀持NET_DVR_IPPARACFG_V40配置
("bySupport1", c_byte),
# 能⼒集扩充,位与结果为0表⽰不⽀持,1
# 能⼒集扩充,位与结果为0表⽰不⽀持,1
# 表⽰⽀持
# bySupport2 & 0x1, 表⽰解码器是否⽀持通过URL取流解码
# bySupport2 & 0x2, 表⽰是否⽀持FTPV40
# bySupport2 & 0x4, 表⽰是否⽀持ANR(断⽹录像)
# bySupport2 & 0x20, 表⽰是否⽀持单独获取设备状态⼦项
# bySupport2 & 0x40, 表⽰是否是码流加密设备
("bySupport2", c_byte),
("wDevType", c_uint16), # 设备型号,详见下⽂列表
# 能⼒集扩展,位与结果:0 - 不⽀持,1 - ⽀持
# bySupport3 & 0x1, 表⽰是否⽀持多码流
# bySupport3 & 0x4, 表⽰是否⽀持按组配置,具体包含通道图像参数、报警输⼊参数、IP报警输⼊ / 输出接⼊参数、⽤户参数、设备⼯作状态、JPEG抓图、定时和时间抓图 # bySupport3 & 0x20,表⽰是否⽀持通过DDNS域名解析取流
("bySupport3", c_byte),
# 是否⽀持多码流,按位表⽰,位与结果:0 - 不⽀持,1 - ⽀持
# byMultiStreamProto & 0x1, 表⽰是否⽀持码流3
# byMultiStreamProto & 0x2, 表⽰是否⽀持码流4
# byMultiStreamProto & 0x40, 表⽰是否⽀持主码流
# byMultiStreamProto & 0x80, 表⽰是否⽀持⼦码流
("byMultiStreamProto", c_byte),
("byStartDChan", c_byte), # 起始数字通道号,0表⽰⽆数字通道,⽐如DVR或IPC
("byStartDTalkChan", c_byte), # 起始数字对讲通道号,区别于模拟对讲通道号,0表⽰⽆数字对讲通道
("byHighDChanNum", c_byte), # 数字通道个数,⾼8位
# 能⼒集扩展,按位表⽰,位与结果:0 - 不⽀持,1 - ⽀持
# bySupport4 & 0x01, 表⽰是否所有码流类型同时⽀持RTSP和私有协议
# bySupport4 & 0x10, 表⽰是否⽀持域名⽅式挂载⽹络硬盘
("bySupport4", c_byte),
# ⽀持语种能⼒,按位表⽰,位与结果:0 - 不⽀持,1 - ⽀持
# byLanguageType == 0,表⽰⽼设备,不⽀持该字段
# byLanguageType & 0x1,表⽰是否⽀持中⽂
# byLanguageType & 0x2,表⽰是否⽀持英⽂
("byLanguageType", c_byte),
("byVoiceInChanNum", c_byte), # ⾳频输⼊通道数
("byStartVoiceInChanNo", c_byte), # ⾳频输⼊起始通道号,0表⽰⽆效
("byRes3", c_byte * 2), # 保留,置为0
("byMirrorChanNum", c_byte), # 镜像通道个数,录播主机中⽤于表⽰导播通道
("wStartMirrorChanNo", c_uint16), # 起始镜像通道号
("byRes2", c_byte * 2)] # 保留,置为0
class NET_DVR_DEVICEINFO_V40(Structure):
_fields_ = [
("struDeviceV30", NET_DVR_DEVICEINFO_V30), # 设备参数
("bySupportLock", c_byte), # 设备是否⽀持锁定功能,bySuportLock 为1时,dwSurplusLockTime和byRetryLoginTime有效
("byRetryLoginTime", c_byte), # 剩余可尝试登陆的次数,⽤户名,密码错误时,此参数有效
# 密码安全等级: 0-⽆效,1-默认密码,2-有效密码,3-风险较⾼的密码,
# 当管理员⽤户的密码为出⼚默认密码(12345)或者风险较⾼的密码时,建议上层客户端提⽰⽤户名更改密码
sdk("byPasswordLevel", c_byte),
("byProxyType", c_byte), # 代理服务器类型,0-不使⽤代理,1-使⽤标准代理,2-使⽤EHome代理
# 剩余时间,单位:秒,⽤户锁定时次参数有效。在锁定期间,⽤户尝试登陆,不算⽤户名密码输⼊
对错
# 设备锁定剩余时间重新恢复到30分钟
("dwSurplusLockTime", c_ulong),
# 字符编码类型(SDK所有接⼝返回的字符串编码类型,透传接⼝除外):
# 0 - ⽆字符编码信息(⽼设备)
# 1 - GB2312
("byCharEncodeType", c_byte),
# ⽀持v50版本的设备参数获取,设备名称和设备类型名称长度扩展为64字节
("bySupportDev5", c_byte),
# 登录模式(不同的模式具体含义详见"Remarks"说明:0- SDK私有协议,1- ISAPI协议)
("byLoginMode", c_byte),
# 保留,置为0
("byRes2", c_byte * 253),
]
class NET_DVR_Login_V40(Structure):
_fields_ = [
("pLoginInfo", NET_DVR_USER_LOGIN_INFO),
("lpDeviceInfo", NET_DVR_DEVICEINFO_V40)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论