1、下载SDK
海康开放平台SDK下载,下载自己对应系统的SDK,根据里面说明进行配置SDK
2、选好HCNetSDK.py文件
最好直接使用 Demo示例\5- Python开发示例\6-参数配置Demo 路径下的HCNetSDK.py,确保文件里有NET_DVR_SHOWSTRINGINFO以及NET_DVR_SHOWSTRING_V30两个结构体,还有两个字符结构参数,见下面代码。
# 叠加字符结构参数 (NET_DVR_SHOWSTRING_V30结构)
NET_DVR_GET_SHOWSTRING_V30 = 1030
NET_DVR_SET_SHOWSTRING_V30 = 1031
# 叠加字符
class NET_DVR_SHOWSTRINGINFO(Structure):
pass
LPNET_DVR_SHOWSTRINGINFO = POINTER(NET_DVR_SHOWSTRINGINFO)
NET_DVR_SHOWSTRINGINFO._fields_ = [
('wShowString', c_ushort),
('wStringSize', c_ushort),
('wShowStringTopLeftX', c_ushort),
('wShowStringTopLeftY', c_ushort),
('sString', c_ubyte * 44),
]
# 叠加字符
class NET_DVR_SHOWSTRING_V30(Structure):
pass
LPNET_DVR_SHOWSTRING_V30 = POINTER(NET_DVR_SHOWSTRING_V30)
NET_DVR_SHOWSTRING_V30._fields_ = [
('dwSize', c_uint32),
('struStringInfo', NET_DVR_SHOWSTRINGINFO * 8),
]
3、获取OSD参数
对照SDK手册查看各个参数
def GetOSDString(UserID):
str_osd_cfg = NET_DVR_SHOWSTRING_V30()
str_osd_cfg.dwSize = sizeof(str_osd_cfg)
p_str_osd_cfg = byref(str_osd_cfg)
l_channel = c_int(1)
p_int = c_int(0)
b_get_osd_cfg = sdk.NET_DVR_GetDVRConfig(UserID, NET_DVR_GET_SHOWSTRING_V30, l_channel.value, p_str_osd_cfg, sizeof(str_osd_cfg), byref(p_int))
if not b_get_osd_cfg:
print("获取图像参数失败,错误码:", sdk.NET_DVR_GetLastError())
return
LenOSDString = len(str_osd_cfg.struStringInfo)
# print(str_osd_cfg.struStringInfo[0].wShowString)
OSDStrings = []
for i in range(LenOSDString):
if str_osd_cfg.struStringInfo[i].wShowString == 1:
print('第几个osd:',i)
# OSDStrings.append(cfg.struStringInfo[i].sString)
OSDStrings.append(bytes(str_osd_cfg.struStringInfo[i].sString).rstrip(b'\x00').decode('gbk'))
return OSDStrings
4、设置OSD参数
def SetOSDString(UserID):
str_osd_cfg = NET_DVR_SHOWSTRING_V30()
str_osd_cfg.dwSize = sizeof(str_osd_cfg)
p_str_osd_cfg = byref(str_osd_cfg)
l_channel = c_int(1)
p_int = c_int(0)
i = 1
str = r'测试5' # 显示文本
byte_str = str.encode('gbk') # 编码方式,和上面解码方式保持一致
c_ubyte_array = (c_ubyte * 44).from_buffer_copy(byte_str.ljust(44, b'\x00'))
str_osd_cfg.struStringInfo[i].wShowString = 1
str_osd_cfg.struStringInfo[i].sString = c_ubyte_array
str_osd_cfg.struStringInfo[i].wStringSize = len(c_ubyte_array)
str_osd_cfg.struStringInfo[i].wShowStringTopLeftX = 80
str_osd_cfg.struStringInfo[i].wShowStringTopLeftY = 20
b_set_osd_cfg = sdk.NET_DVR_SetDVRConfig(UserID, NET_DVR_SET_SHOWSTRING_V30, l_channel.value, p_str_osd_cfg, sizeof(str_osd_cfg), byref(p_int))
if not b_set_osd_cfg:
print("设置图像参数失败,错误码:", sdk.NET_DVR_GetLastError())
return
5、整体代码
所有代码以及上传我的资源,可以查看
# --*-- conding:utf-8 --*--
# @Time : 2024/5/11 15:06
# @Author : wangchao124
# @Email : wangchao124@hikvision.com
# @File : ParameterConfigurator.py
# @Software : PyCharm
import os
import platform
import time
from HCNetSDK import *
import re
# 系统环境标识
WINDOWS_FLAG = True
def GetPlatform():
"""
获取当前系统环境
@return:
"""
sysstr = platform.system()
print('' + sysstr)
if sysstr != "Windows":
global WINDOWS_FLAG
WINDOWS_FLAG = False
def SetSDKInitCfg():
"""
设置SDK初始化依赖库路径
@return:
"""
# print(os.getcwd())
if WINDOWS_FLAG:
strPath = os.getcwd().encode('gbk')
sdk_ComPath = NET_DVR_LOCAL_SDK_PATH()
sdk_ComPath.sPath = strPath
sdk.NET_DVR_SetSDKInitCfg(2, byref(sdk_ComPath))
sdk.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'\\libcrypto-1_1-x64.dll'))
sdk.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'\\libssl-1_1-x64.dll'))
else:
strPath = os.getcwd().encode('utf-8')
sdk_ComPath = NET_DVR_LOCAL_SDK_PATH()
sdk_ComPath.sPath = strPath
sdk.NET_DVR_SetSDKInitCfg(2, byref(sdk_ComPath))
sdk.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'/libcrypto.so.1.1'))
sdk.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'/libssl.so.1.1'))
def login_v40(ip, port, username, password):
"""
设备登录V40 与V30功能一致
@param ip:
@param port:
@param username:
@param password:
@return:
"""
# 用户注册设备
# c++传递进去的是byte型数据,需要转成byte型传进去,否则会乱码
# 登录参数,包括设备地址、登录用户、密码等
struLoginInfo = NET_DVR_USER_LOGIN_INFO()
struLoginInfo.bUseAsynLogin = 0 # 同步登录方式 0- 否,1- 是
struLoginInfo.sDeviceAddress = bytes(ip, "ascii") # 设备IP地址
struLoginInfo.wPort = port # 设备服务端口
struLoginInfo.sUserName = bytes(username, "ascii") # 设备登录用户名
struLoginInfo.sPassword = bytes(password, "ascii") # 设备登录密码
struLoginInfo.byLoginMode = 0
# 设备信息, 输出参数
struDeviceInfoV40 = NET_DVR_DEVICEINFO_V40()
UserID = sdk.NET_DVR_Login_V40(byref(struLoginInfo), byref(struDeviceInfoV40))
if UserID < 0:
print("Login failed, error code: %d" % sdk.NET_DVR_GetLastError())
sdk.NET_DVR_Cleanup()
else:
print(ip + '登录成功,设备序列号:%s' % str(struDeviceInfoV40.struDeviceV30.sSerialNumber, encoding="utf8"))
return UserID
def get_device_status(UserId):
"""
获取设备在线状态
@param UserId:
@return:
"""
devStatus = sdk.NET_DVR_RemoteControl(UserId, NET_DVR_CHECK_USER_STATUS, None, 0)
if devStatus:
print("设备在线")
else:
print("设备不在线")
def GetOSDString(UserID):
str_osd_cfg = NET_DVR_SHOWSTRING_V30()
str_osd_cfg.dwSize = sizeof(str_osd_cfg)
p_str_osd_cfg = byref(str_osd_cfg)
l_channel = c_int(1)
p_int = c_int(0)
b_get_osd_cfg = sdk.NET_DVR_GetDVRConfig(UserID, NET_DVR_GET_SHOWSTRING_V30, l_channel.value,
p_str_osd_cfg, sizeof(str_osd_cfg), byref(p_int))
if not b_get_osd_cfg:
print("获取图像参数失败,错误码:", sdk.NET_DVR_GetLastError())
return
LenOSDString = len(str_osd_cfg.struStringInfo)
# print(str_osd_cfg.struStringInfo[0].wShowString)
OSDStrings = []
for i in range(LenOSDString):
if str_osd_cfg.struStringInfo[i].wShowString == 1:
print('第几个osd:',i)
# OSDStrings.append(cfg.struStringInfo[i].sString)
OSDStrings.append(bytes(str_osd_cfg.struStringInfo[i].sString).rstrip(b'\x00').decode('gbk'))
return OSDStrings
def SetOSDString(UserID):
str_osd_cfg = NET_DVR_SHOWSTRING_V30()
str_osd_cfg.dwSize = sizeof(str_osd_cfg)
p_str_osd_cfg = byref(str_osd_cfg)
l_channel = c_int(1)
p_int = c_int(0)
i = 1
str = r'测试5'
byte_str = str.encode('gbk')
c_ubyte_array = (c_ubyte * 44).from_buffer_copy(byte_str.ljust(44, b'\x00'))
str_osd_cfg.struStringInfo[i].wShowString = 1
str_osd_cfg.struStringInfo[i].sString = c_ubyte_array
str_osd_cfg.struStringInfo[i].wStringSize = len(c_ubyte_array)
str_osd_cfg.struStringInfo[i].wShowStringTopLeftX = 80
str_osd_cfg.struStringInfo[i].wShowStringTopLeftY = 20
b_set_osd_cfg = sdk.NET_DVR_SetDVRConfig(UserID, NET_DVR_SET_SHOWSTRING_V30, l_channel.value,
p_str_osd_cfg, sizeof(str_osd_cfg), byref(p_int))
if not b_set_osd_cfg:
print("设置图像参数失败,错误码:", sdk.NET_DVR_GetLastError())
return
if __name__ == '__main__':
# 获取系统平台
GetPlatform()
# 加载库,先加载依赖库
if WINDOWS_FLAG:
os.chdir(r'./lib/win')
sdk = ctypes.CDLL(r'./HCNetSDK.dll')
else:
os.chdir(r'./lib/linux')
sdk = cdll.LoadLibrary(r'./libhcnetsdk.so')
SetSDKInitCfg() # 设置组件库和SSL库加载路径
# 初始化
sdk.NET_DVR_Init()
# 启用SDK写日志
sdk.NET_DVR_SetLogToFile(3, bytes('./SdkLog_Python/', encoding="utf-8"), False)
# 通用参数配置
sdkCfg = NET_DVR_LOCAL_GENERAL_CFG()
sdkCfg.byAlarmJsonPictureSeparate = 1
sdk.NET_DVR_SetSDKLocalCfg(17, byref(sdkCfg))
# 登录设备
UserID = login_v40("127.254.11.1", 8000, "admin", "Hik12345")
get_device_status(UserID) # 获取设备在线状态
# 设置字符串
SetOSDString(UserID)
print('字符串', GetOSDString(UserID)) # 获取OSD字符串
# 注销用户,退出程序时调用
if sdk.NET_DVR_Logout(UserID):
print("注销成功")
# 释放SDK资源,退出程序时调用
sdk.NET_DVR_Cleanup()