本文主要是博主使用海康SDK進行人流量統計的摸索程序,在這里簡單記錄一下,
查詢檔案,能實作人流量統計大概有兩種方式,報警或者監聽,

這邊我選擇了監聽方式,NET_DVR_StartListen_V30 這個介面,啟動監聽,它可以接收設備主動上傳的報警資訊并且支持多執行緒,

我們需要撰寫一個回呼函式來接受資料(處理業務邏輯),

NET_DVR_ALARMER 是一個報警資訊結構體,這邊需要 COMM_ALARM_PDC 這個型別的資料,其實是一個宏,用來判斷接受資料的型別,這里對應的結構體為NET_DVR_PDC_ALRAM_INFO 具體引數可以查閱檔案,到這里這里大概對于SDK的呼叫有個了解,那么開始動手,
首先創建一個人流量demo ,匯入SDK必要頭檔案以及相應的資源檔案,

(ps:這里很多dll并不需要)
直接上代碼:
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 }

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/20698.html
標籤:Windows
上一篇:如何解決問題:程式無法正常啟動(0xc0000022)
下一篇:計算機作業系統鎖機制.
