import os import ctypes import datetime import time #获取所有的库文件到一个列表 path = "/home/caobin/chike/chike/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/" so_list = [] def add_so(path,so_list): files = os.listdir(path) for file in files: if not os.path.isdir(path+file): if file.endswith(".so"): so_list.append(path+file) else: add_so(path+file+"/",so_list) add_so(path,so_list) for lib in so_list: print(lib) lUserID = 0 m_lAlarmHandle = 0 def callCpp(func_name,*args): for so_lib in so_list: # print(so_lib) try: lib = ctypes.cdll.LoadLibrary(so_lib) try: value = eval("lib.%s"%func_name)(*args) print("调用的库:"+so_lib) print("执行成功,返回值:"+str(value)) return value except: continue except: print("库文件载入失败:"+so_lib) continue print("没有找到接口!") return False #定义结构体 class LPNET_DVR_DEVICEINFO_V30(ctypes.Structure): _fields_ = [ ("sSerialNumber", ctypes.c_byte * 48), ("byAlarmInPortNum", ctypes.c_byte), ("byAlarmOutPortNum", ctypes.c_byte), ("byDiskNum", ctypes.c_byte), ("byDVRType", ctypes.c_byte), ("byChanNum", ctypes.c_byte), ("byStartChan", ctypes.c_byte), ("byAudioChanNum", ctypes.c_byte), ("byIPChanNum", ctypes.c_byte), ("byZeroChanNum", ctypes.c_byte), ("byMainProto", ctypes.c_byte), ("bySubProto", ctypes.c_byte), ("bySupport", ctypes.c_byte), ("bySupport1", ctypes.c_byte), ("bySupport2", ctypes.c_byte), ("wDevType", ctypes.c_uint16), ("bySupport3", ctypes.c_byte), ("byMultiStreamProto", ctypes.c_byte), ("byStartDChan", ctypes.c_byte), ("byStartDTalkChan", ctypes.c_byte), ("byHighDChanNum", ctypes.c_byte), ("bySupport4", ctypes.c_byte), ("byLanguageType", ctypes.c_byte), ("byVoiceInChanNum", ctypes.c_byte), ("byStartVoiceInChanNo", ctypes.c_byte), ("byRes3", ctypes.c_byte * 2), ("byMirrorChanNum", ctypes.c_byte), ("wStartMirrorChanNo", ctypes.c_uint16), ("byRes2", ctypes.c_byte * 2)] #报警设备信息结构体 class NET_DVR_ALARMER(ctypes.Structure): _fields_ = [ ("byUserIDValid", ctypes.c_byte), ("bySerialValid", ctypes.c_byte), ("byVersionValid", ctypes.c_byte), ("byDeviceNameValid", ctypes.c_byte), ("byMacAddrValid", ctypes.c_byte), ("byLinkPortValid", ctypes.c_byte), ("byDeviceIPValid", ctypes.c_byte), ("bySocketIPValid", ctypes.c_byte), ("lUserID", ctypes.c_long), ("sSerialNumber", ctypes.c_byte * 48), ("dwDeviceVersion", ctypes.c_uint32), ("sDeviceName", ctypes.c_char * 32), ("byMacAddr", ctypes.c_char * 6), ("wLinkPort", ctypes.c_uint16), ("sDeviceIP", ctypes.c_char * 128), ("sSocketIP", ctypes.c_char * 128), ("byIpProtocol", ctypes.c_byte), ("byRes2", ctypes.c_byte * 11) ] #####布防 class NET_DVR_SETUPALARM_PARAM(ctypes.Structure): _fields_ = [ ("dwSize",ctypes.c_uint32), ("beLevel",ctypes.c_byte), ("byAlarmInfoType",ctypes.c_byte), ("byRetAlarmTypeV40",ctypes.c_byte), ("byRetDevInfoVersion",ctypes.c_byte), ("byRetVQDAlarmType",ctypes.c_byte), ("byFaceAlarmDetection",ctypes.c_byte), ("bySupport",ctypes.c_byte), ("byBrokenNetHttp",ctypes.c_byte), ("wTaskNo",ctypes.c_uint16), ("byDeployType",ctypes.c_byte), ("byRes1",ctypes.c_byte*3), ("byAlarmTypeURL",ctypes.c_byte), ("byCustomCtrl",ctypes.c_byte) ] #用户注册设备 def NET_DVR_Login_V30(sDVRIP = "192.168.1.63",wDVRPort = 8000,sUserName = "admin",sPassword = "guoji123"): init_res = callCpp("NET_DVR_Init")#SDK初始化 if init_res: print("SDK初始化成功") else: error_info = callCpp("NET_DVR_GetLastError") print("SDK初始化错误:" + str(error_info)) return False set_overtime = callCpp("NET_DVR_SetConnectTime",5000,4)#设置超时 if set_overtime: print("设置超时时间成功") else: error_info = callCpp("NET_DVR_GetLastError") print("设置超时错误信息:" + str(error_info)) return False #用户注册设备 #c++传递进去的是byte型数据,需要转成byte型传进去,否则会乱码 sDVRIP = bytes(sDVRIP,"ascii") sUserName = bytes(sUserName,"ascii") sPassword = bytes(sPassword,"ascii") DeviceInfo = LPNET_DVR_DEVICEINFO_V30() DeviceInfoRef = ctypes.byref(DeviceInfo) lUserID = callCpp("NET_DVR_Login_V30",sDVRIP,wDVRPort,sUserName,sPassword,DeviceInfoRef) print("登录结果:"+str(lUserID)) if lUserID == -1: error_info = callCpp("NET_DVR_GetLastError") print("登录错误信息:" + str(error_info)) return error_info else: return lUserID ##设置回调,由于在回调函数这里char*指针传不过去,因此改成了由C++去实现 def NET_DVR_SetDVRMessageCallBack_V30(): CALLFUNC = ctypes.CFUNCTYPE(ctypes.c_void_p,ctypes.c_long,ctypes.POINTER(NET_DVR_ALARMER))#,ctypes.c_char if callCpp("NET_DVR_SetDVRMessageCallBack_V30",CALLFUNC(MsgCallback),None):print("设置回调函数成功!") else:print("回调函数设置错误:"+ str(callCpp("NET_DVR_GetLastError"))) # iListenHandle = callCpp("NET_DVR_StartListen_V30", sLocalIP,wLocalPort,CALLFUNC(MSGCallBack),pUserData) #回调函数接口 def MsgCallback(lCommand,net_dvr_alarm): print("回调函数目前的问题:参数中参数不完整,char*数据不能传递,进行中的工作是把char*传递并转成结构体") print("回调函数执行,lcommand的值:"+str(lCommand)) print("返回的结构体") print(net_dvr_alarm) print("结构体中的变量,byUserIDValid输出:"+str(net_dvr_alarm.contents.byUserIDValid)) print(datetime.datetime.now()) print("\n") return 0 #####布防 def NET_DVR_SetupAlarmChan_V41(): struAlarmParam = NET_DVR_SETUPALARM_PARAM() struAlarmParamSize = ctypes.sizeof(struAlarmParam) print("结构体大小:"+str(struAlarmParamSize)) struAlarmParam.dwSize = struAlarmParamSize#结构体大小 struAlarmParam.beLevel = 1#0 一级布防,1 二级布防 # struAlarmParam.byAlarmInfoType = 1#智能交通设备有效 struAlarmParam.byFaceAlarmDetection = 1#人脸侦测报警 struAlarmParam_p = ctypes.byref(struAlarmParam) m_lAlarmHandle = callCpp("NET_DVR_SetupAlarmChan_V41",lUserID,struAlarmParam_p) print("布防结果:"+str(m_lAlarmHandle)) if m_lAlarmHandle < 0: print("错误信息:"+str(callCpp("NET_DVR_GetLastError"))) return False else:print("布防成功") #撤防 def NET_DVR_CloseAarmChan_V30(): res = callCpp("NET_DVR_CloseAarmChan_V30",m_lAlarmHandle) if res<0: print("撤防失败:"+str(callCpp("NET_DVR_GetLastError"))) else: print("撤防成功") #释放SDK 资源 def NET_DVR_Cleanup(): res = callCpp("NET_DVR_Cleanup") if res<0: print("SDK资源释放失败:"+str(callCpp("NET_DVR_GetLastError"))) else: print("SDK资源成功释放!!") ####用户追注销 def NET_DVR_Logout_V30(): if callCpp("NET_DVR_Logout_V30",lUserID): print("用户已经成功注销") else: print("注销失败:"+str(callCpp("NET_DVR_GetLastError"))) init_res = callCpp("NET_DVR_Cleanup")#释放SDK资源 if init_res: print("SDK资源释放成功") else: error_info = callCpp("NET_DVR_GetLastError") print("错误信息:" + str(error_info)) return False NET_DVR_Login_V30() NET_DVR_SetDVRMessageCallBack_V30() time.sleep(100)##sleep一会儿,等待SDK回调 NET_DVR_SetupAlarmChan_V41() NET_DVR_CloseAarmChan_V30() NET_DVR_Logout_V30() NET_DVR_Cleanup()