#ifndef _HVDEVICEUTILS_H_ #define _HVDEVICEUTILS_H_ #include "tinyxml.h" #include "HvDeviceEx.h" #include "HvCameraType.h" #include "HVAPI_HANDLE_CONTEXT_EX.h" #include #include #include #define PROTOCOL_MERCURY 1 #define PROTOCOL_EARTH 2 #ifndef SAFE_DELETE #define SAFE_DELETE(p) if (p) {delete p; p = NULL ; } #endif #define IVN_MAX_SIZE 128 #ifndef SAFE_DELETE_ARG #define SAFE_DELETE_ARG(p) if ( p ) {delete[] p; p = NULL; } #endif //结果图片信息结构体 typedef struct _RECORD_IMAGE_INFO_EX { RECT rcPlate; RECT rcFacePos[20]; int nFaceCount; DWORD32 dwCarID; DWORD32 dwWidth; DWORD32 dwHeight; DWORD64 dw64TimeMs; }_RECORD_IMAGE_INFO_EX; //结果图片结构体 typedef struct _RECORD_IMAGE_EX { _RECORD_IMAGE_INFO_EX cImgInfo; PBYTE pbImgInfo; PBYTE pbImgData; DWORD dwImgInfoLen; DWORD dwImgDataLen; }RECORD_IMAGE_EX; //视频结构体 typedef struct _RECORD_VIDEO_ILLEGAL { PBYTE pbVideoInfo; PBYTE pbVideoData; DWORD dwVideoInfoLen; DWORD dwVideoDataLen; DWORD dwCarID; DWORD dwWidth; DWORD dwHeight; DWORD64 dw64TimeMS; }RECORD_VIDEO_ILLEGAL; //结果图片集结构体 typedef struct _RECORD_IMAGE_GROUP_EX { RECORD_IMAGE_EX cBestSnapshot; RECORD_IMAGE_EX cLastSnapshot; RECORD_IMAGE_EX cBeginCapture; RECORD_IMAGE_EX cBestCapture; RECORD_IMAGE_EX cLastCapture; RECORD_IMAGE_EX cPlatePicture; RECORD_IMAGE_EX cPlateBinary; RECORD_VIDEO_ILLEGAL cIllegalVideo; }RECORD_IMAGE_GROUP_EX; // 水星协议命令输入/输出的类型 typedef enum { XML_CMD_TYPE_NULL, // 既无入参也无出参 XML_CMD_TYPE_CUSTOM, // 由代码自行定义参数格式 XML_CMD_TYPE_INT, XML_CMD_TYPE_DOUBLE, XML_CMD_TYPE_FLOAT, XML_CMD_TYPE_BOOL, XML_CMD_TYPE_DWORD, XML_CMD_TYPE_STRING, XML_CMD_TYPE_BIN, XML_CMD_TYPE_INTARRAY1D, XML_CMD_TYPE_INTARRAY2D } XML_CMD_TYPE; //命令解析辅助用结构体 typedef struct _CXmlParseInfo { CHAR szKeyName[128]; CHAR szKeyValue[128]; INT nKeyValueLen; XML_CMD_TYPE eKeyType; _CXmlParseInfo() { szKeyName[0]='\0'; szKeyValue[0]='\0'; nKeyValueLen = 128; eKeyType = XML_CMD_TYPE_NULL; } }CXmlParseInfo; //XML协议关键字宏 #define HX_TYPE "TYPE" #define HX_TYPE_INT "INT" #define HX_TYPE_STRING "STRING" #define HX_TYPE_BIN "BIN" #define HX_TYPE_FLOAT "FLOAT" #define HX_CMDNAME "CmdName" #define HX_VALUE "Value" #define HX_RECODE "Value" #define HX_RETMSG "RetMsg" /** * sock服务的初始化 * @return [成功:TRUE 失败:FALSE] */ bool InitWSA(); /** * sock服务的卸载 * @return [成功:TRUE 失败:FALSE] */ bool UnInitWSA(); /** * 创建SOCKET * @param[in] af 地址族 * @param[in] type sock类型 * @param[in] protocol 套接口所用的协议 * @return [成功:返回套接字 失败:返回NULL ] */ SOCKET HvCreateSocket(int af=AF_INET, int type=SOCK_STREAM, int protocol=0); /** * [HvSetRecvTimeOut 设置接收超时] * @param hSocket [套接字] * @param iMS [超时 毫秒] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvSetRecvTimeOut(const SOCKET& hSocket, int iMS); /** * [HvSetSendTimeOut 设置发送超时] * @param hSocket [套接字] * @param iMS [超时 毫秒] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvSetSendTimeOut(const SOCKET& hSocket, int iMS); /** * [HvListen 监听一体机连接] * @param hSocket [套接字] * @param nPort [端口] * @param backlog [返回日志] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvListen(const SOCKET& hSocket, int nPort, int backlog); /** * [HvAccept 等待一体机连接] * @param hSocket [本地套接字] * @param hNewSocket [远程套接字] * @param iTimeout [超时时间 单位:毫秒] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvAccept(const SOCKET& hSocket, SOCKET& hNewSocket, int iTimeout/*=-1*/); /** * 输出日志 * @param pszLog [日志内容] */ void WriteLog(const char *pszLog); /** * [RecvAll 完整接收socket上的数据] * @param socket [套接字] * @param pBuffer [接收数据缓冲区] * @param iRecvLen [缓冲区长度] * @return [实际接收的数据长度] */ int RecvAll( int socket, char *pBuffer, int iRecvLen ); /** * [RecvAll 完整接收socket上的数据] * @param socket [套接字] * @param pBuffer [接收数据缓冲区] * @param iRecvLen [缓冲区长度] * @param iRealRecvLen [实际接收的数据长度] * @return [实际接收的数据长度] */ int RecvAll(int socket, char *pBuffer, int iRecvLen , int& iRealRecvLen) ; /** * [ExecXmlExtCmd 发送执行xml协议命令] * @param szIP [设备IP] * @param szXmlCmd [发送的xml数据] * @param szRetBuf [返回的xml数据] * @param nBufLen [返回的xml数据长度] * @return [成功:TRUE 失败:FALSE] */ bool ExecXmlExtCmd(char* szIP, char* szXmlCmd, char* szRetBuf, int& nBufLen); /** * [ExecXmlExtCmd 发送执行xml协议命令] * @param szXmlCmd [发送的xml数据] * @param szRetBuf [返回的xml数据] * @param iBufLen [返回的xml数据长度] * @param sktSend [设备套接字] * @return [成功:TRUE 失败:FALSE] */ bool ExecXmlExtCmd(char* szXmlCmd, char* szRetBuf, int& iBufLen, SOCKET sktSend); /** * [IsNewProtocol 是否为支持的设备新协议] * @param szIP [设备IP] * @return [成功:TRUE 失败:FALSE] */ bool IsNewProtocol(char *szIP); /** * [SearchHVDeviceCount 获取局域网内的设备数] * @param pdwCount [设备数] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT SearchHVDeviceCount(DWORD32 *pdwCount); /** * [GetHVDeviceAddr 根据索引查询设备网络参数] * @param iIndex [索引号] * @param pdw64MacAddr [网卡物理地址] * @param pdwIP [设备IP] * @param pdwMask [子网掩码] * @param pdwGateway [网关] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT GetHVDeviceAddr(int iIndex, DWORD64 *pdw64MacAddr, DWORD32 *pdwIP, DWORD32 *pdwMask, DWORD32 *pdwGateway); /** * [SetIPFromMac 通过MAC修改IP] * @param dw64MacAddr [网卡物理地址] * @param dwIP [修改后的IP] * @param dwMask [修改后的子网] * @param dwGateway [修改后的网关] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT SetIPFromMac(DWORD64 dw64MacAddr, DWORD dwIP,DWORD dwMask, DWORD dwGateway); /** * [BuildHvCmdXml 生成xml数据] * @param pXmlBuf [保存xml数据的缓冲区地址] * @param pCmdName [命令] * @param iArgCount [命令个数] * @param rgszName [参数名数组] * @param rgszValue [参数所带的值数组] * @return [生成的xml长度] */ int BuildHvCmdXml( char* pXmlBuf, char* pCmdName, int iArgCount, const char rgszName[][IVN_MAX_SIZE], const char rgszValue[][IVN_MAX_SIZE] ); /** * [GetParamStringFromXml 从HvXml协议信息中 获取指定参数的 Vaule(String)] * @param pCmdArgElement [xml对象] * @param pszParamName [参数名] * @param pszParamValue [参数值] * @param nParamValueSize [参数值长度] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT GetParamStringFromXml( const TiXmlElement* pCmdArgElement, const char *pszParamName, char *pszParamValue, int nParamValueSize ); /** * [GetParamIntFromXml 从HvXml协议信息中 获取指定参数的 Vaule(int)] * @param pCmdArgElement [xml对象] * @param pszParamName [参数名] * @param pnParamValue [参数值] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT GetParamIntFromXml( const TiXmlElement* pCmdArgElement, const char *pszParamName, int *pnParamValue ); /** * [HvGetDeviceExteInfo 获取设备扩展信息] * @param iIndex [设备索引号] * @param lpExtInfo [获取的扩展信息] * @param iBufLen [获取的扩展信息长度] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvGetDeviceExteInfo(int iIndex, LPSTR lpExtInfo, int iBufLen); /** * [HvGetXmlProtocolVersion 获取协议版本] * @param szIP [设备IP] * @param pdwVersionType [设备类型枚举] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvGetXmlProtocolVersion(char* szIP, DWORD *pdwVersionType); /** * [ConnectCamera 连接设备] * @param szIp [设备IP] * @param wPort [端口] * @param hSocket [套接字] * @param iTryTimes [重试次数] * @param iReceiveTimeOutMs [接收超时 单位:毫秒] * @return [成功:S_OK;失败:E_FAIL] */ bool ConnectCamera( char *szIp, WORD wPort, int &hSocket, int iTryTimes=0, int iReceiveTimeOutMs = 20000); /** * [HvGetRecordImage 从结果数据解析图片集到结果图片集结构体] * @param pbRecordData [结果数据] * @param dwRecordDataLen [结果数据长度] * @param pRecordImag [结果图片集结构体] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvGetRecordImage(PBYTE pbRecordData, DWORD dwRecordDataLen, RECORD_IMAGE_GROUP_EX* pRecordImag); /** * [HvGetRecordImage_Mercury 根据图片附加信息,从结果数据解析图片集到结果图片集结构体] * @param szAppendInfo [输出图片附加信息] * @param pbRecordData [结果数据] * @param dwRecordDataLen [结果数据长度] * @param pcRecordImage [结果图片集结构体] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvGetRecordImage_Mercury(const char* szAppendInfo, PBYTE pbRecordData, DWORD dwRecordDataLen, RECORD_IMAGE_GROUP_EX* pcRecordImage); /** * [HvMakeXmlInfoByString 判断及解析Xml或Xml字符串命令,并生成Xml数据] * @param fNewProtocol [是否新的协议类型] * @param inXmlOrStrBuf [输入的命令字或xml] * @param nInlen [命令字长度] * @param szOutXmlBuf [xml数据缓存区] * @param nOutlen [xml数据缓冲区长度] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvMakeXmlInfoByString(bool fNewProtocol, const char*inXmlOrStrBuf, int nInlen, char* szOutXmlBuf, int &nOutlen); /** * [HvMakeXmlCmdByString 判断及解析Xml或Xml字符串命令,并生成Xml数据] * @param fNewProtocol [是否新的协议类型] * @param inXmlOrStrBuf [输入的命令字或xml] * @param nInlen [命令字长度] * @param szOutXmlBuf [xml数据缓存区] * @param nOutlen [xml数据缓冲区长度] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvMakeXmlCmdByString(bool fNewProtocol, const char* inXmlOrStrBuf, int nInlen, char *szOutXmlBuf, int &nOutlen); /** * [HvMakeXmlCmdByString 判断及解析Xml或Xml字符串命令,并生成Xml数据] * @param inXmlOrStrBuf [输入的命令字或xml] * @param nInlen [命令字长度] * @param szOutXmlBuf [xml数据缓存区] * @param nOutlen [xml数据缓冲区长度] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvMakeXmlCmdByString( const char* inXmlOrStrBuf, int nInlen, char *szOutXmlBuf, int &nOutlen); /** * [HvParseXmlCmdRespRetcode2 从XML2.0协议信息命令执行返回的结果中解析出指定信息] * @param szXmlBuf [输入设备端返回的xml] * @param szCmdName [命令名] * @param nInfoValueName [参数名] * @param szInfoValueText [参数值] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvParseXmlCmdRespRetcode2(char*szXmlBuf, char* szCmdName, char* nInfoValueName, char* szInfoValueText); /** * [HvParseXmlCmdRespRetcode 从HvXml协议命令执行返回的结果中解析出返回码] * @param szXmlBuf [输入设备端返回的xml] * @param szCommand [命令字] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvParseXmlCmdRespRetcode(char* szXmlBuf, char* szCommand); /** * [HvParseXmlInfoRespValue 从HvXml协议信息获取执行返回的结果中解析出指定信息] * @param szXmlBuf [输入设备端返回的xml] * @param szInfoName [命令字] * @param nCmdValueName [参数名] * @param szCmdValueText [参数值] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvParseXmlInfoRespValue(char*szXmlBuf, char* szInfoName, char* nCmdValueName, char* szCmdValueText); /** * [HvSendXmlCmd 向设备发送xml命令] * @param szIP [设备IP] * @param szCmd [含命令的xml] * @param szRetBuf [设备返回xml数据缓冲区] * @param iBufLen [缓冲区长度] * @param piRetLen [实际返回长度] * @param sktSend [发送套接字] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvSendXmlCmd(char *szIP, LPCSTR szCmd, LPSTR szRetBuf, INT iBufLen, INT *piRetLen, int sktSend); /** * [HvSendXmlCmd 向设备发送xml命令] * @param szCmd [含命令的xml] * @param szRetBuf [设备返回xml数据缓冲区] * @param iBufLen [缓冲区长度] * @param piRetLen [实际返回长度] * @param dwXmlVersion [xml协议版本 保留] * @param sktSend [发送套接字] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvSendXmlCmd(LPCSTR szCmd, LPSTR szRetBuf, INT iBufLen, INT* piRetLen, DWORD dwXmlVersion, SOCKET sktSend); /** * [ExecXmlExtCmdEx 向设备发送xml命令] * @param szIP [设备IP] * @param szXmlCmd [含命令的xml] * @param szRetBuf [缓冲区长度] * @param iBufLen [缓冲区长度] * @param sktSend [发送套接字] * @return [成功: TRUE 失败: FALSE] */ bool ExecXmlExtCmdEx(char *szIP, char *szXmlCmd, char *szRetBuf, int &iBufLen, int sktSend); /** * [ExecXmlExtCmdMercury 向设备发送xml命令] * @param szIP [设备IP] * @param szXmlCmd [含命令的xml] * @param szRetBuf [缓冲区长度] * @param iBufLen [缓冲区长度] * @param sktSend [发送套接字] * @return [成功: TRUE 失败: FALSE] */ bool ExecXmlExtCmdMercury(char* szIP, char* szXmlCmd, char* szRetBuf, int& iBufLen, int sktSend); /** * [ExecXmlExtCmd 通过指定的SOCKET执行Xml命令] * @param szXmlCmd [含命令的xml] * @param szRetBuf [缓冲区长度] * @param iBufLen [缓冲区长度] * @param sktSend [发送套接字] * @return [成功: TRUE 失败: FALSE] */ bool ExecXmlExtCmd(char* szXmlCmd, char* szRetBuf, int& iBufLen, SOCKET sktSend); /** * [HvSafeCloseThread 安全关闭线程] * @param pthreadHandle [线程句柄] */ void HvSafeCloseThread(pthread_t &pthreadHandle); /** * [ForceCloseSocket 强制关闭套接字] * @param iNetSocket [套接字] * @return [成功 0 失败 SOCKET_ERROR] */ int ForceCloseSocket(int &iNetSocket); /** * [Yuv2BMP Yuv数据转为bmp格式] * @param pbDest [输出BMP数据的缓冲区指针] * @param iDestBufLen [输出缓冲区大小] * @param piDestLen [实际输出数据大小] * @param pbSrc [输入YUV数据的缓冲区指针] * @param iSrcWidth [图像宽度] * @param iSrcHeight [图像高度;] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT Yuv2BMP( BYTE *pbDest, int iDestBufLen, int *piDestLen, BYTE *pbSrc, int iSrcWidth, int iSrcHeight ); /** * [Bin2BMP 二值图数据转换为BMP格式] * @param pbBinData [二值图数据] * @param pbBmpData [bmp数据] * @param nBmpLen [bmp实际长度] */ void Bin2BMP(PBYTE pbBinData, PBYTE pbBmpData, INT& nBmpLen); /** * [HvEnhanceTrafficLight 设置红灯加红] * @param pbSrcImg [源图片] * @param dwiSrcImgDataLen [源图片数据长度] * @param iRedLightCount [红灯数量] * @param pbRedLightPos [红灯位置] * @param pbDestImgBuf [目的图片缓存区] * @param dwDestImgBufLen [目的图片缓冲区长度] * @param iBrightness [图片亮度增强] * @param iHueThreshold [红灯加红色度阀值] * @param iCompressRate [回红后图片压缩率] * @return [description] */ HRESULT HvEnhanceTrafficLight(PBYTE pbSrcImg, DWORD dwiSrcImgDataLen, int iRedLightCount, PBYTE pbRedLightPos, PBYTE pbDestImgBuf, DWORD& dwDestImgBufLen, INT iBrightness, INT iHueThreshold, INT iCompressRate); /** * [HvMakeXmlCmdByString1 制作协议1的xml] * @param inXmlOrStrBuf [命令字] * @param nInlen [命令长度] * @param szOutXmlBuf [输出xml缓冲] * @param nOutlen [输出xml缓冲长度] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvMakeXmlCmdByString1(const char* inXmlOrStrBuf, int nInlen, char* szOutXmlBuf, int& nOutlen); /** * [HvMakeXmlCmdByString2 制作协议2的xml] * @param inXmlOrStrBuf [命令字] * @param nInlen [命令长度] * @param szOutXmlBuf [输出xml缓冲] * @param nOutlen [输出xml缓冲长度] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvMakeXmlCmdByString2(const char* inXmlOrStrBuf, int nInlen, char* szOutXmlBuf, int& nOutlen); /** * [HvMakeXmlCmdByString3 制作协议3的xml] * @param inXmlOrStrBuf [命令字] * @param nInlen [命令长度] * @param szOutXmlBuf [输出xml缓冲] * @param nOutlen [输出xml缓冲长度] * @return [成功:S_OK;失败:E_FAIL] */ HRESULT HvMakeXmlCmdByString3(const char* inXmlOrStrBuf, int nInlen, char* szOutXmlBuf, int& nOutlen); /** * [GetProtocolVersion 根据IP获取设备协议类型] * @param szIP [设备IP] * @return [协议类型枚举] */ PROTOCOL_VERSION GetProtocolVersion(char* szIP); HRESULT HvGetDeviceType(LPCSTR szDeviceIp, WORD wAddPort, PROTOCOL_VERSION sProtocol, CHAR* szDeviceType); #endif // _HVDEVICEUTILS_H_