本文主要是博主使用海康SDK進行人流量統計的摸索過程,在這裏簡單記錄一下。ios
查詢文檔,能實現人流量統計大概有兩種方式,報警或者監聽,數據結構
這邊我選擇了監聽方式,NET_DVR_StartListen_V30 這個接口,啓動監聽,它能夠接收設備主動上傳的報警信息而且支持多線程。多線程
咱們須要編寫一個回調函數來接受數據(處理業務邏輯),函數
NET_DVR_ALARMER 是一個報警信息結構體,這邊須要 COMM_ALARM_PDC 這個類型的數據,實際上是一個宏,用來判斷接受數據的類型,這裏對應的結構體爲NET_DVR_PDC_ALRAM_INFO 具體參數能夠查閱文檔。到這裏這裏大概對於SDK的調用有個瞭解。那麼開始動手。測試
首先建立一我的流量demo ,導入SDK必要頭文件以及相應的資源文件。spa
(ps:這裏不少dll並不須要)線程
直接上代碼:code
1 #include <stdio.h>
2 #include <iostream>
3 #include "HCNetSDK.h"
4 using namespace std;
5
6 void CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER* pAlarmer, char* pAlarmInfo, DWORD dwBufLen, void*pUser) 7 { 8 9 cout << "進入回調" << endl;//判斷一下沒有進入回調 記得在設備那邊設置回調的地址和端口否則會沒法進入回調 10 NET_DVR_PDC_ALRAM_INFO struPdcALramInfo;//數據結構體 11 memcpy(&struPdcALramInfo, pAlarmInfo, sizeof(NET_DVR_PDC_ALRAM_INFO)); 12 switch (lCommand)//消息類型 13 { 14 cout << lCommand << endl; 15 case COMM_ALARM_PDC: 16 { 17 if (struPdcALramInfo.byMode == 0) 18 { 19 //測試顯示數據 20 cout << "當前時間:" << struPdcALramInfo.uStatModeParam.struStatFrame.dwRelativeTime << endl; 21 cout << "進來人數:" << struPdcALramInfo.dwEnterNum << endl; 22 cout << "離開人數" << struPdcALramInfo.dwLeaveNum << endl; 23 break; 24 } 25 26 } 27 default:break; 28 } 29 } 30 void main() { 31 32 NET_DVR_Init();// 初始化 33 NET_DVR_SetConnectTime(2000, 1);//設置鏈接時間與重連時間 34 NET_DVR_SetReconnect(10000, true); 35 LONG lUserID;// 註冊設備 36 NET_DVR_DEVICEINFO_V30 struDeviceInfo; 37 char ip[32] = "192.168.x.64";//設備的IP地址 須要和電腦端ip在同一個網段 38 char user[32] = "xxx";//登陸名 39 char userPass[32] = "xxx";//密碼 不須要多說了吧 40 41 lUserID = NET_DVR_Login_V30(ip, 8000, user, userPass, &struDeviceInfo);//這裏端口號爲8000 42 if (lUserID < 0) 43 { 44 printf("Login error, %d\n", NET_DVR_GetLastError());//若是登陸失敗,這裏會有緣由的,可查看文檔對症下藥 45 NET_DVR_Cleanup(); 46 return; 47 } 48 else 49 { 50 cout<<"Login success lUserID:"<< lUserID <<endl; 51 } 52 53 char localIP[16] = "192.168.x.60";//本地的Ip 設置回調用的 54 55 NET_DVR_NETCFG_V30 myNETCFG;//配置報警主機和端口 56 memcpy(&(myNETCFG.struAlarmHostIpAddr.sIpV4), localIP, sizeof(myNETCFG.struAlarmHostIpAddr.sIpV4));//內存拷貝 57 cout << myNETCFG.struAlarmHostIpAddr.sIpV4 << endl;//能夠忽略 58 myNETCFG.wAlarmHostIpPort =8000; 59 BOOL isSuccess = NET_DVR_SetDVRMessageCallBack_V30(MessageCallback, &myNETCFG);//設置報警回調函數 60 if (isSuccess) 61 { 62 cout << "設置回調成功" << endl; 63 } 64 LONG lHandle;//啓用監聽 65 lHandle = NET_DVR_StartListen_V30(NULL, 8000, MessageCallback, NULL); 66 if (lHandle < 0) 67 { 68 printf("NET_DVR_StartListen_V30 error, %d\n", NET_DVR_GetLastError()); 69 NET_DVR_Logout(lUserID); 70 NET_DVR_Cleanup(); 71 return; 72 } 73 Sleep(5000);//這裏是爲了測試因此寫了個休眠卡主線程也能夠理解爲監聽時長 74 if (!NET_DVR_StopListen_V30(lHandle))//結束監聽 75 { 76 printf("NET_DVR_StopListen_V30 error, %d\n", NET_DVR_GetLastError()); 77 NET_DVR_Logout(lUserID); 78 NET_DVR_Cleanup(); 79 return; 80 } 81 NET_DVR_Logout(lUserID);//註銷用戶 82 NET_DVR_Cleanup(); //釋放 SDK 資源 83 return; 84 }