181 lines
6.6 KiB
Python
181 lines
6.6 KiB
Python
import ctypes
|
||
import os
|
||
import platform
|
||
import time
|
||
import tkinter
|
||
import json
|
||
from ctypes import *
|
||
from HCNetSDK import *
|
||
|
||
# 系统环境标识
|
||
WINDOWS_FLAG = True
|
||
|
||
# 获取当前系统环境
|
||
def GetPlatform():
|
||
sysstr = platform.system()
|
||
print('' + sysstr)
|
||
if sysstr != "Windows":
|
||
global WINDOWS_FLAG
|
||
WINDOWS_FLAG = False
|
||
|
||
# 设置SDK初始化依赖库路径
|
||
def SetSDKInitCfg():
|
||
# 设置HCNetSDKCom组件库和SSL库加载路径
|
||
# print(os.getcwd())
|
||
strPath = os.getcwd().encode('gbk')
|
||
sdk_ComPath = NET_DVR_LOCAL_SDK_PATH()
|
||
sdk_ComPath.sPath = strPath
|
||
sdkTest.NET_DVR_SetSDKInitCfg(2, byref(sdk_ComPath))
|
||
if WINDOWS_FLAG:
|
||
sdkTest.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'\libcrypto-1_1-x64.dll'))
|
||
sdkTest.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'\libssl-1_1-x64.dll'))
|
||
else:
|
||
sdkTest.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'\libcrypto.so.1.1'))
|
||
sdkTest.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'\libssl.so.1.1'))
|
||
|
||
def LoginDev():
|
||
# 设备登录信息
|
||
struLoginInfo = NET_DVR_USER_LOGIN_INFO()
|
||
struLoginInfo.bUseAsynLogin = 0 # 同步登录方式
|
||
struLoginInfo.sDeviceAddress = bytes("10.17.35.231", "ascii") # 设备IP地址
|
||
struLoginInfo.wPort = 8000 # 设备服务端口
|
||
struLoginInfo.sUserName = bytes("admin", "ascii") # 设备登录用户名
|
||
struLoginInfo.sPassword = bytes("abcd1234", "ascii") # 设备登录密码
|
||
|
||
# 设备信息, 输出参数
|
||
struDeviceInfoV40 = NET_DVR_DEVICEINFO_V40()
|
||
sdkTest.NET_DVR_Login_V40.restype = c_long
|
||
sdkTest.NET_DVR_GetLastError.restype = c_uint
|
||
|
||
#登录设备
|
||
iUserID = sdkTest.NET_DVR_Login_V40(byref(struLoginInfo), byref(struDeviceInfoV40))
|
||
if iUserID < 0:
|
||
print('登录失败, 错误码: %d' % sdkTest.NET_DVR_GetLastError())
|
||
else:
|
||
print('登录成功,设备序列号:%s' % str(struDeviceInfoV40.struDeviceV30.sSerialNumber, encoding="utf8"))
|
||
return iUserID
|
||
|
||
def Close(lUserID):
|
||
if lUserID >= 0:
|
||
# 注销用户
|
||
sdkTest.NET_DVR_Logout(lUserID)
|
||
# 释放SDK资源
|
||
sdkTest.NET_DVE_Cleanup()
|
||
|
||
def getShowString(lUserID):
|
||
xmlInput = NET_DVR_XML_CONFIG_INPUT()
|
||
xmlInput.dwSize = sizeof(xmlInput)
|
||
url = create_string_buffer(b'GET /ISAPI/System/Video/inputs/channels/1/overlays/text/1')
|
||
xmlInput.lpRequestUrl = addressof(url)
|
||
# print(xmlInput.lpRequestUrl)
|
||
xmlInput.dwRequestUrlLen = len(url)
|
||
# print(len(url))
|
||
xmlInput.lpInBuffer = None # 获取参数时输入为空
|
||
xmlInput.dwInBufferSize = 0
|
||
xmlInput.dwRecvTimeOut = 5000 # 超时时间
|
||
xmlInput.byForceEncrpt = 0
|
||
|
||
xmlOutput = NET_DVR_XML_CONFIG_OUTPUT() # 输出参数
|
||
xmlOutput.dwSize = sizeof(xmlOutput)
|
||
xmlOutput.dwOutBufferSize = 8 * 1024
|
||
xmlOutput.dwStatusSize = 1024
|
||
M1 = 8 * 1024
|
||
buff1 = (c_ubyte * M1)()
|
||
M2 = 1024
|
||
buff2 = (c_ubyte * M2)()
|
||
|
||
xmlOutput.lpOutBuffer = addressof(buff1)
|
||
xmlOutput.lpStatusBuffer = addressof(buff2)
|
||
|
||
if sdkTest.NET_DVR_STDXMLConfig(lUserID, byref(xmlInput), byref(xmlOutput)) == 1:
|
||
print('---获取成功---')
|
||
# 获取成功,输出结果
|
||
Bbytes_Out = string_at(xmlOutput.lpOutBuffer, xmlOutput.dwOutBufferSize)
|
||
strOutput = str(Bbytes_Out, 'UTF-8')
|
||
print(strOutput + '\n')
|
||
# 状态信息
|
||
'''Bbytes_Status = string_at(xmlOutput.lpStatusBuffer, xmlOutput.dwStatusSize)
|
||
strStatus = str(Bbytes_Status)
|
||
print(strStatus + '\n')'''
|
||
else:
|
||
# 接口返回失败,错误号错误号判断原因
|
||
print('NET_DVR_STDXMLConfig接口调用失败,错误码:%d,登录句柄:%d' % (sdkTest.NET_DVR_GetLastError(), lUserID))
|
||
|
||
|
||
def setShowString(lUserID):
|
||
xmlInput = NET_DVR_XML_CONFIG_INPUT()
|
||
|
||
xmlInput.dwSize = sizeof(xmlInput)
|
||
url = create_string_buffer(b'PUT /ISAPI/System/Video/inputs/channels/1/overlays/text/1')
|
||
|
||
xmlInput.lpRequestUrl = addressof(url)
|
||
xmlInput.dwRequestUrlLen = len(url)
|
||
# 输入参数
|
||
str_bytes = bytes('<TextOverlay xmlns=\"http://www.hikvision.com/ver20/XMLSchema\" version=\"2.0\">'
|
||
'<id>1</id>'
|
||
'<enabled>true</enabled>'
|
||
'<positionX>100</positionX>'
|
||
'<positionY>200</positionY>'
|
||
'<displayText>1234567测试abc</displayText></TextOverlay>', encoding="utf-8")
|
||
|
||
iLen = len(str_bytes)
|
||
xmlInput.lpInBuffer = cast(str_bytes, c_void_p)
|
||
xmlInput.dwInBufferSize = iLen
|
||
xmlInput.dwRecvTimeOut = 5000
|
||
xmlInput.byForceEncrpt = 0
|
||
|
||
xmlOutput = NET_DVR_XML_CONFIG_OUTPUT()
|
||
xmlOutput.dwSize = sizeof(xmlOutput)
|
||
xmlOutput.dwOutBufferSize = 8 * 1024
|
||
xmlOutput.dwStatusSize = 1024
|
||
M1 = 8 * 1024
|
||
buff1 = (c_ubyte * M1)()
|
||
M2 = 1024
|
||
buff2 = (c_ubyte * M2)()
|
||
|
||
xmlOutput.lpOutBuffer = addressof(buff1)
|
||
xmlOutput.lpStatusBuffer = addressof(buff2)
|
||
|
||
reValue = sdkTest.NET_DVR_STDXMLConfig(lUserID, byref(xmlInput), byref(xmlOutput))
|
||
if reValue == 1:
|
||
print('---设置成功---')
|
||
# 设置成功,输出结果
|
||
'''Bbytes_Out = string_at(xmlOutput.lpOutBuffer, xmlOutput.dwOutBufferSize)
|
||
strOutput = str(Bbytes_Out)
|
||
print(strOutput + '\n')'''
|
||
# 状态信息
|
||
Bbytes_Status = string_at(xmlOutput.lpStatusBuffer, xmlOutput.dwStatusSize)
|
||
strStatus = str(Bbytes_Status, 'UTF-8')
|
||
print(strStatus + '\n')
|
||
else:
|
||
# 接口返回失败,错误号错误号判断原因
|
||
print('NET_DVR_STDXMLConfig接口调用失败,错误码:%d,登录句柄:%d' % (sdkTest.NET_DVR_GetLastError(), lUserID))
|
||
|
||
|
||
if __name__ == '__main__':
|
||
# 获取系统平台
|
||
GetPlatform()
|
||
|
||
# 加载库,先加载依赖库
|
||
if WINDOWS_FLAG:
|
||
os.chdir(r'./lib/win')
|
||
sdkTest = ctypes.CDLL(r'./HCNetSDK.dll')
|
||
else:
|
||
os.chdir(r'./lib/linux')
|
||
sdkTest = cdll.LoadLibrary(r'./libhcnetsdk.so')
|
||
|
||
SetSDKInitCfg() # 设置组件库和SSL库加载路径
|
||
|
||
# 初始化
|
||
sdkTest.NET_DVR_Init()
|
||
# 启用SDK写日志
|
||
sdkTest.NET_DVR_SetLogToFile(3, bytes('C:\\SdkLog_Python\\', encoding="gbk"), False)
|
||
|
||
# 注册登录设备
|
||
iUserID = LoginDev()
|
||
if iUserID < 0:
|
||
print('登录失败,退出')
|
||
else:
|
||
setShowString(iUserID) # 透传方式设置通道字符叠加参数
|
||
getShowString(iUserID) # 透传方式获取通道字符叠加参数
|