1、智能交通设备开发说明文档 一、产品概述 智能交通设备主要用在交通卡口、闯红灯等的车辆信息的分析及记录。在安装好智能设备之后需要根据实际的应用场景对智能交通设备场景,待检测物体,及事件规则进行配置。在完成配置后,设备会根据配置,进行图片抓拍,并分析检测物体信息。用户可通过订阅智能报警事件,获得抓拍到的图片及物体信息,具体代码实现见下文说明。 二、产品方案示意图 图2.1 三、智能交通配置说明及相关SDK接口说明 3.1智能交通配置SDK接口: 3.1.1 获取智能交通设备配置信息接口 1) BOOL CALL_METHOD CLIENT_GetNewDevConfig(LO
2、NG lLoginID, char* szCommand, int nChannelID, char* szOutBuffer, DWORD dwOutBufferSize, int *error, int waittime); 函数说明:获取配置,按照字符串格式,各个字符串包含的信息由CLIENT_ParseData解析。 参数说明: [in]lLoginID,CLIENT_Login的返回值 [in]szCommand,命令参数,见CLIENT_ParseData命令参数说明。 [in]nChannelID,通道号 [out]szOutBuffer,输出缓冲, [out
3、]dwOutBufferSize,输出缓冲大小 [out]error,错误码 0 成功 1 失败 2 数据不合法 3 暂时无法设置 4 没有权限 [in]waittime,等待超时时间 2) BOOL CLIENT_ParseData(char *szCommand, char *szInBuffer, LPVOID lpOutBuffer, DWORD dwOutBufferSize, void* pReserved); 函数说明:此接口配合CLIENT_GetNewDevConfig使用,在使用CLIENT_GetNewDevConfig获取字符串
4、配置信息后,使用此接口从配置信息中提取想要的信息。 参数说明: [in]szCommand,命令参数。 命令参数 相应结构体 CFG_CMD_ANALYSEGLOBAL 智能交通设备场景配置,对应结构体CFG_ANALYSEGLOBAL_INFO CFG_CMD_ANALYSEMODULE 待检测物体模块配置,对应结构体CFG_ANALYSEMODULES_INFO CFG_CMD_ANALYSERULE 智能交通设备事件规则配置,对应结构体CFG_ANALYSERULES_INFO [in]szInBuffer,输入缓冲,字符配置缓冲。 [out]lpOutBu
5、ffer ,输出缓冲,交通结构体类型 [out]dwOutBufferSize ,输出缓冲的大小 [in]pReserved,保留参数 3.1.2设置智能交通设备配置信息接口 1) BOOL CLIENT_PacketData(char *szCommand, LPVOID lpInBuffer, DWORD dwInBufferSize, char *szOutBuffer, DWORD dwOutBufferSize); 函数说明:此接口配合CLIENT_SetNewDevConfig使用,使用CLIENT_PacketData后,将打包的信息通过CLIENT_Se
6、tNewDevConfig设置到设备上。 参数说明: [out]szCommand 命令参数,参见CLIENT_ParseData中表格 [in]lpInBuffer 输入缓冲,结构体类型参见CLIENT_ParseData中表格 [in]dwInBufferSize 输入缓冲大小 [out]szOutBuffer 输出缓冲 [in]dwOutBufferSize 输出缓冲大小 2)BOOL CLIENT_SetNewDevConfig(LONG lLoginID, char* szCommand, int nChannelID, char* s
7、zInBuffer, DWORD dwInBufferSize, int *error, int *restart, int waittime=500); 函数说明:设置配置,按照字符串格式,各个字符串包含的信息由CLIENT_PacketData组包。 参数说明: [in]lLoginID CLIENT_Login的返回值 [in]szCommand,请参考CLIENT_ParseData中的说明。 [in]nChannelID,通道号。 [in]szInBuffer,输入缓冲。 [in]dwInBufferSize,输入缓冲大小。 [out]error,错误码。 0
8、 成功 1 失败 2 数据不合法 3 暂时无法设置 4 没有权限 [out]restart,配置设置后是否需要重启设备,1表示需要重启,0表示不需要重启。 [in]waittime,等待超时时间。 3.1.3 获取智能交通设备能力集信息接口 BOOL CLIENT_QueryNewSystemInfo(LONG lLoginID, char* szCommand, int nChannelID, char* szOutBuffer, DWORD dwOutBufferSize, int *error, int waittime=1000); 函数说明:查询
9、系统能力信息,按字符串格式 [in]lLoginID,CLIENT_Login的返回值。 [in]szCommand,查询能力类型。(CFG_CAP_CMD_VIDEOANALYSE, 智能交通设备能力集,对应结构体为CFG_CAP_ANALYSE_INFO) [in]nChannelID,通道号。 [out]szOutBuffer,接收的能力集字符串缓冲区。 [in]dwOutBufferSize,接收的总字节数(单位字节)。 [out]error,错误号。 [in]waittime,等待时间。 3.2 智能交通配置具体说明 智能交通配置过程分为三个步骤: 首先是
10、智能交通场景配置,包括场景类型,及对应场景的相关信息。比如智能交通场景配置的相关信息包括:摄像头高度,摄像头水平距,近景点位置,远景点位置,近景点距摄像头水平距,远景点距摄像头水平距及车道线; 然后是不同区域各种类型物体的检测模块配置,包括物体类型,检测区域信息,检测算法模块的参数; 最后是智能交通规则配置,智能交通规则是用来描述一些条件,在某个物体满足这些条件后,会触发设备检测该物体,并上报这个物体的相关信息,不同规则有不同参数。如一个交通卡口规则,包括参数车道线,检测线,速度上下限等信息,当规则描述的车道上有车经过检测线时就会触发设备检测该车辆,返回车辆的速度,车牌,车身等信息。 3
11、2.1 智能交通场景配置: 智能交通场景配置参数包括摄像头高度,摄像头水平距,近景点位置,远景点位置,近景点距摄像头水平距,远景点距摄像头水平距及车道线,具体描述如下: 如图3.1所示,摄像头高度,是指摄像头离地面的垂直距离,摄像头水平距是指摄像头垂直线到摄像头视野区域中心点的距离。近景点是指摄像头抓拍的图片的底部中心位置,一般取值为(4096,8192),远近点是指图片的中心位置,一般取值为(4096,4096)。近景点距摄像头水平距是指近景点在实景场景中对应位置到摄像头垂直线的水平距离,远景点距摄像头水平距是指远景点在实景场景中对应位置到摄像头垂直线的水平距离。 图3.
12、1 车道线是根据摄像头实际拍摄到的图片中的车道得到的车道线信息,如图3.2所示(车道线的相关坐标点是图片上的对应像素点位置)。车道号由用户自己定义。车道方向是指当前车道上车辆行驶的方向。 图3.2 获取智能交通设备场景配置信息代码示例: int nErr = 0; char szOutBuffer[32*1024] = {0}; CFG_ANALYSEGLOBAL_INFO stuAnalysGlobalInfo = {0}; // get global info BOOL bSuccess = CLIENT_GetNewDevConfig(m_
13、lLoginID, CFG_CMD_ANALYSEGLOBAL, nChannel, szOutBuffer, 32*1024, &nErr); if (bSuccess) { int nRetLen = 0; BOOL bRet = CLIENT_ParseData(CFG_CMD_ANALYSEGLOBAL, szOutBuffer, (char*)&stuAnalysGlobalInfo, sizeof(CFG_ANALYSEGLOBAL_INFO), &nRetLen); if (bRet == FALSE) { MessageBox("Pars
14、er data error", "Prompt"); return FALSE; } }//if(bSuccess) else { MessageBox("Get TrafficScene failed", "Prompt"); return FALSE; } 获取智能交通设备场景配置信息代码示例: int nRestart = 0; int nError = 0; char szOutBuffer[32*1024] = {0}; CFG_ANALYSEGLOBAL_INFO stuAnalysGlobalInfo = {0};
15、 // save global info BOOL bRet = CLIENT_PacketData(CFG_CMD_ANALYSEGLOBAL, (char*)&stuAnalysGlobalInfo, sizeof(CFG_ANALYSEGLOBAL_INFO), szOutBuffer, 32*1024); if (bRet == FALSE) { MessageBox("Pack data failed!"), "Prompt"); } else { BOOL bSuccess = CLIENT_SetNewDevConfig(m_lLogi
16、nID, CFG_CMD_ANALYSEGLOBAL, nChannelId, szOutBuffer, 32*1024, &nError, &nRestart, 3000); if (bSuccess) { MessageBox("Save successfully!", "Prompt"); } else { MessageBox("Save TrafficScene failed!"), "Prompt"); } } 智能分析设备配置演示程序中交通场景配置界面展示: 车道线设置界面展示: 3.2
17、2 检测物体模块配置 待检测物体模块配置参数包括待检测物体类型,检测区域,跟踪区域,待检测物体的最大,最小尺寸,具体描述如下: 带检测物体类型由当前设备的能力集决定,智能交通设备通常支持对车辆、车牌等物体的检测。 检测区域,跟踪区域是指在摄像头实际拍摄到的图片中画出的检测区和跟踪区的位置如图3.3所示(这两个区域坐标点是图片上的对应像素点位置)。 图3.3 待检测的物体最小,最大尺寸也是指物体在图片中的呈现的最小最大尺寸,以像素为单位。在待检测物体是车牌时,有一个最佳检测尺寸范围:长(50 – 240), 宽(10 – 100)。 获取设备能力集代码示例: CFG
18、CAP_ANALYSE_INFO stuChannelCap = {0}; char szOutBuffer[32*1024] = {0}; int nErr = 0; BOOL bSuccess = CLIENT_QueryNewSystemInfo(m_lLoginID, CFG_CAP_CMD_VIDEOANALYSE, nChannel, szOutBuffer, 32*1024, &nErr); if (bSuccess) { int nRetLen = 0; BOOL bRet = CLIENT_ParseData(CFG_CAP_CMD_V
19、IDEOANALYSE, szOutBuffer, (char*)&stuChannelCap, sizeof(CFG_CAP_ANALYSE_INFO), &nRetLen); if (bRet == FALSE) { MessageBox(ConvertString("Parser data error"), ConvertString("Prompt")); return; } } else { MessageBox(ConvertString("get device cap failed!"), ConvertString("Prom
20、pt")); } 获取智能交通设备带检测物体模块配置信息代码示例: int nErr = 0; char szOutBuffer[32*1024] = {0}; CFG_ANALYSEMODULES_INFO stuAnalysModuleInfo = {0}; BOOL bSuccess = CLIENT_GetNewDevConfig(m_lLoginID, CFG_CMD_ANALYSEMODULE, nChannel, szOutBuffer, 32*1024, &nErr); if (bSuccess) { int nRetL
21、en = 0; BOOL bRet = CLIENT_ParseData(CFG_CMD_ANALYSEMODULE, szOutBuffer, (char*)&stuAnalysModuleInfo, sizeof(CFG_ANALYSEMODULES_INFO), &nRetLen); if (bRet == FALSE) { MessageBox("Parser data error", "Prompt"); return FALSE; } }//if(bSuccess) else { MessageBox(Get Module
22、info failed!", "Prompt"); return FALSE; } 设置智能交通设备带检测物体模块配置信息代码示例: int nRestart = 0; int nError = 0; char szOutBuffer[32*1024] = {0}; CFG_ANALYSEMODULES_INFO stuAnalysModuleInfo = {0}; BOOL bRet = CLIENT_PacketData(CFG_CMD_ANALYSEMODULE, (char*)&stuAnalysModuleInfo, sizeof(CFG_AN
23、ALYSEMODULES_INFO), szOutBuffer, 32*1024); if (bRet == FALSE) { MessageBox("Pack data failed!", "Prompt"); } else { BOOL bSuccess = CLIENT_SetNewDevConfig(m_lLoginID, CFG_CMD_ANALYSEMODULE, nChannelId, szOutBuffer, 32*1024, &nError, &nRestart, 3000); if (bSuccess) { Me
24、ssageBox("Save successfully!", "Prompt"); } else { MessageBox("Save Module info failed!", "Prompt"); } } 智能分析设备配置演示程序中检测物体模块配置界面展示: 检测区及跟踪区设置界面展示: 3.2.3 事件规则配置 事件规则是对触发某个事件报警条件的描述,当智能设备检测到符合某个事件规则的情况发生时就会触发事件报警,并记录事件信息。一个智能交通设备上的一个事件可以对应多个规则,每个设备能够支持的规则数是有限的,可通过设备能力集获得
25、设备支持的最大规则数。 目前以交通卡口事件规则为例,对规则参数进行说明,交通卡口事件规则参数包括:规则名,规则使能,检测物体类型,速度上限,速度下限,车道号,车道线,检测线,具体说明如下: 规则名,是指当前规则的名字,不能与当前设备的其他规则重名。 规则使能,是指当前规则是否生效。 检测物体类型,是指当前规则能够检测的物体的类型,此处设置的类型必须是设备能力集中支持的物体类型。 速度上限,速度下限,是检测物体的运动速度上下限,单位:千米/小时。 车道号,是指当前规则所适用的车道。 车道线,是指当前规则所适用的车道位置,如下图所示,是指在摄像头实际拍摄到的图片中的位置,此处的车道
26、线与场景配置中的车道不会相互影响。 检测线,是指物体触发报警的位置,如图3.4所示,是指在摄像头实际拍摄到的图片中的位置。 图3.4 获取智能设备能力集代码示例见3.2.2。 获取智能设备规则配置信息代码示例: int nErr = 0; char szOutBuffer[32*1024] = {0}; CFG_ANALYSERULES_INFO stuAnalysRuleInfo = {0}; // nMaxRuleStructSize指设备支持的规则对应的最大规则结构体大小 // nMaxRuleNum指设备支持的最大规则数 in
27、t nBufLen = (sizeof(CFG_RULE_INFO) + nMaxRuleStructSize) * nMaxRuleNum; stuAnalysRuleInfo.pRuleBuf = new char[nBufLen]; stuAnalysRuleInfo.nRuleLen = nBufLen; BOOL bSuccess = CLIENT_GetNewDevConfig(m_lLoginID, CFG_CMD_ANALYSERULE, nChannel, szOutBuffer, 32*1024, &nErr, 2000); if (bSuccess)
28、 { int nRetLen = 0; BOOL bRet = CLIENT_ParseData(CFG_CMD_ANALYSERULE, szOutBuffer, (char*)&stuAnalysRuleInfo, sizeof(CFG_ANALYSERULES_INFO), &nRetLen); if (bRet == FALSE) { MessageBox("Parser data error", "Prompt"); return FALSE; } }//if(bSuccess) else { MessageBox("
29、Get Rule info error!", "Prompt"); return FALSE; } 设置智能设备规则配置信息代码示例: int nRestart = 0; int nError = 0; char szOutBuffer[32*1024] = {0}; CFG_ANALYSERULES_INFO stuAnalysRuleInfo = {0}; BOOL bRet = CLIENT_PacketData(CFG_CMD_ANALYSERULE, (char*)&stuAnalysRuleInfo, sizeof(CFG_ANALYSERU
30、LES_INFO), szOutBuffer, 32*1024); if (bRet == FALSE) { MessageBox("Pack data failed!", "Prompt"); } else { BOOL bSuccess = CLIENT_SetNewDevConfig(m_lLoginID, CFG_CMD_ANALYSERULE, nChannelId, szOutBuffer, 32*1024, &nError, &nRestart, 3000); if (bSuccess) { MessageBox("S
31、ave successfully!", "Prompt"); } else { MessageBox("Save Rule info failed!", "Prompt"); } } 智能分析设备配置演示程序中事件规则配置界面展示: 具体规则信息界面展示: 四、智能交通信息实时上传记相关SDK接口说明 4.1 智能交通信息实时上传SDK接口 4.1.1 智能交通设备实时上传接口说明 LONG CLIENT_RealLoadPicture(LONG lLoginID, int nChannelID, DWORD dwAlarmTyp
32、e, fAnalyzerDataCallBack cbAnalyzerData, DWORD dwUser); 函数说明:设置设备的实时上传事件的功能。调用该函数之后,当设备检测到交通违章等事件的时候,将通知给客户端。 参数说明: [in]lLoginID,CLIENT_Login的返回值 [in] nChannelID,需要设置的通道号 [in] dwAlarmType,需要设置的事件类型 类型 含义 EVENT_IVS_ALL 所有事件 EVENT_IVS_TRAFFICCONTROL 交通管制事件 EVENT_IVS_TRAFFICACCIDENT 交
33、通事故事件 EVENT_IVS_TRAFFICJUNCTION 交通路口事件 EVENT_IVS_TRAFFICGATE 交通卡口事件 EVENT_TRAFFICSNAPSHOT 交通抓拍事件 EVENT_IVS_TRAFFICJAM 交通拥堵事件 EVENT_IVS_TRAFFIC_RUNREDLIGHT 交通违章-闯红灯事件 EVENT_IVS_TRAFFIC_OVERLINE 交通违章-压车道线事件 EVENT_IVS_TRAFFIC_RETROGRADE 交通违章-逆行事件 EVENT_IVS_TRAFFIC_TURNLEFT 交通违章-违章左转
34、 EVENT_IVS_TRAFFIC_TURNRIGHT 交通违章-违章右转 EVENT_IVS_TRAFFIC_UTURN 交通违章-违章掉头 EVENT_IVS_TRAFFIC_OVERSPEED 交通违章-超速 EVENT_IVS_TRAFFIC_UNDERSPEED 交通违章-低速 EVENT_IVS_TRAFFIC_PARKING 交通违章-违章停车 EVENT_IVS_TRAFFIC_WRONGROUTE 交通违章-不按车道行驶 EVENT_IVS_TRAFFIC_CROSSLANE 交通违章-违章变道 EVENT_IVS_TRAFFIC_OVERYEL
35、LOWLINE 交通违章-压黄线 EVENT_IVS_TRAFFIC_DRIVINGONSHOULDER 交通违章-路肩行驶事件 EVENT_IVS_TRAFFIC_YELLOWPLATEINLANE 交通违章-黄牌车占道事件 [out] cbAnalyzerData,事件回调函数,用户可以在该回调函数中受到设备上传的事件。 [out] dwUser,用户在这里设置的参数,将在回调函数中传回。 返回值: 0 :设置失败。 其他:一个整数代表本次设置的句柄。 BOOL CLIENT_StopLoadPic(LONG lAnalyzerHandle); 函数说明
36、停止实时上传事件。 参数说明: lAnalyzerHandle, CLIENT_RealLoadPicture的返回值。 返回值: TRUE: 成功。 FALSE: 失败。 typedef int (CALLBACK *fAnalyzerDataCallBack)(LONG lAnalyzerHandle, DWORD dwAlarmType, void* pAlarmInfo, BYTE *pBuffer, DWORD dwBufSize, DWORD dwUser, int nSequence, void *reserved); 函数说明: 事件回调函数。
37、 函数参数: lAnalyzerHandle, CLIENT_RealLoadPicture的返回值。 dwAlarmType,事件类型,用户根据不同的事件类型,将pAlarmInfo转化不同结构体的。 事件类型 事件对应的结构体 EVENT_IVS_TRAFFICCONTROL DEV_EVENT_TRAFFICCONTROL_INFO EVENT_IVS_TRAFFICACCIDENT DEV_EVENT_TRAFFICACCIDENT_INFO EVENT_IVS_TRAFFICJUNCTION DEV_EVENT_TRAFFICJUNCTION_INFO EVE
38、NT_IVS_TRAFFICGATE DEV_EVENT_TRAFFICGATE_INFO EVENT_TRAFFICSNAPSHOT DEV_EVENT_TRAFFICSNAPSHOT_INFO EVENT_IVS_TRAFFICJAM DEV_EVENT_TRAFFICJAM_INFO EVENT_IVS_TRAFFIC_RUNREDLIGHT DEV_EVENT_TRAFFIC_RUNREDLIGHT_INFO EVENT_IVS_TRAFFIC_ OVERLINE DEV_EVENT_TRAFFIC_ OVERLINE_INFO EVENT_IVS_TRAFFIC_
39、RETROGRADE DEV_EVENT_TRAFFIC_ RETROGRAD _INFO EVENT_IVS_TRAFFIC_ TURNLEFT DEV_EVENT_TRAFFIC_ TURNLEFT_INFO EVENT_IVS_TRAFFIC_ TURNRIGHT DEV_EVENT_TRAFFIC_ TURNRIGHT_INFO EVENT_IVS_TRAFFIC_ UTURN DEV_EVENT_TRAFFIC_ UTURN_INFO EVENT_IVS_TRAFFIC_OVERSPEED DEV_EVENT_TRAFFIC_ OVERSPEED_INFO EVE
40、NT_IVS_TRAFFIC_UNDERSPEED DEV_EVENT_TRAFFIC_ UNDERSPEED_INFO EVENT_IVS_TRAFFIC_PARKING DEV_EVENT_TRAFFIC_ PARKING _INFO EVENT_IVS_TRAFFIC_WRONGROUTE DEV_EVENT_TRAFFIC_ WRONGROUTE _INFO EVENT_IVS_TRAFFIC_CROSSLANE DEV_EVENT_TRAFFIC_ CROSSLANE _INFO EVENT_IVS_TRAFFIC_OVERYELLOWLINE DEV_EVENT_
41、TRAFFIC_ OVERYELLOWLINE _INFO EVENT_IVS_TRAFFIC_DRIVINGONSHOULDER DEV_EVENT_TRAFFIC_ DRIVINGONSHOULDER _INFO EVENT_IVS_TRAFFIC_YELLOWPLATEINLANE DEV_EVENT_TRAFFIC_ YELLOWPLATEINLANE _INFO pAlarmInfo, 事件的详细信息。需要转为为对应的结构体。 pBuffer,事件对应的图片。 dwBufSize,事件对应的图片的大小。 dwUser,CLIENT_RealLoadPicture中
42、设置的dwUser。 nSequence, 表示上传的图片的情况,为0时表示是第一次出现,为1时表示此次之后还有一次,为2时表示最后一次出现或仅出现一次。 reserved,保留字节。 4.2 智能分析设备演示程序具体说明 智能分析设备演示程序包含了两部分的功能。 1. 设置设备上传的事件,并且实时的显示事件的详细内容。每次设置对应一个通道,并且对应一种类型的事件,如果要设置该通道上传所有类型的事件,可以将参数dwAlarmType设置为EVENT_IVS_ALL. 但是如果需要设置一个通道上传两种事件,那么请调用两次CLIENT_RealLoadPicture,并且传入不同的事
43、件类型。 一般的操作顺序如下: 1. 在区域 1 中输入设备的地址,端口,用户名,密码,然后点击登录 2. 在区域 2 中选择一个通道,可以实时的监视该通道,用户也可以不监视,监视和事件的上传没有关系。 3. 在区域 4 中选择需要上传事件的通道。 4. 在区域 5 中选择通道需要上传的事件类型。 5. 在区域 9 中选择列表中要显示的事件类型,在10中选择列表中收到的事件的排列方式。 6. 点击开始。事件详细信息就会显示在区域8中,图片显示在区域6中,牌照或文字显示在7中;7中左边的图片是程序从实际收到图片中根据事件信息里给的车牌位置信息抠出来的。 7. 点击停止。设备将
44、不在上传事件。 其中点击 【开始】, 设置设备上传事件的代码主要如下: void CDialogEventRule::OnButtonStart() { //判断用户是否已经登录 if (m_lLoginID == 0) { MessageBox(ConvertString("Please login first!"),ConvertString("Prompt")); return; } //遍历所有的通道,如果用户选择了该通道,那么设置该通道的上传事件 for (int nChn = 0; nChn < m_netDevInfo.by
45、ChanNum; nChn++) { if ( m_lstEventChannel.GetCheck(nChn) == 0 ) { continue; } //判断是否选择了所有的事件,如果选择了所有的事件,dwAlarmType可以使用EVENT_IVS_ALL, //否则需要通过循环来实现各个类型事件的订阅。 int i = 0; int nAlarmTypeCount = m_lstEventType.GetCount(); bool isALLChecked = true; for (i = 0; i < nAl
46、armTypeCount; i++) { int nCheck = m_lstEventType.GetCheck(i); if (nCheck == 0) { isALLChecked = false; break; } } if (isALLChecked)//使用EVENT_IVS_ALL来设置上传所有事件 { LONG lRet = CLIENT_RealLoadPicture(m_lLoginID, nChn, EVENT_IVS_ALL, CDialogEventRule::RealLoad
47、PicCallback, (DWORD)this); if (lRet == 0) { MessageBox(ConvertString("Subscribe picture failed!"), ConvertString("Prompt")); continue; } m_allRealLoadPicHandle.push_back(lRet);//将句柄保存,后面可以停止事件的上传 } else//通过循环来设置某个通道所需要设置的一个或多个事件 { for (i = 0; i < nAlarmType
48、Count; i++) { if (m_lstEventType.GetCheck(i) == 0 ) { continue; } DWORD dwAlarmType = m_lstEventType.GetItemData(i); LONG lRet = CLIENT_RealLoadPicture(m_lLoginID, nChn, dwAlarmType, CDialogEventRule::RealLoadPicCallback, (DWORD)this); if (lRet == 0) {
49、 MessageBox(ConvertString("Subscribe picture failed!"), ConvertString("Prompt")); continue; } m_allRealLoadPicHandle.push_back(lRet); 将句柄保存,后面可以停止事件的上传 } } } //Change UI this->ChangeUI(UI_STATE_SUBSCRIBE_NOW); } 点击 【停止】的代码主要如下 遍历调用CLIENT_RealLoadPicture时保存的句柄,
50、调用CLIENT_StopLoadPic来停止事件的上传
std::vector






