You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

595 lines
16 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef _HVDEVICEUTILS_H_
#define _HVDEVICEUTILS_H_
#include "tinyxml.h"
#include "HvDeviceEx.h"
#include "HvCameraType.h"
#include "HVAPI_HANDLE_CONTEXT_EX.h"
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#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_