一:出發點
在一些視頻監控項目中經常需要對掛載在NVR下的攝像頭進行配置。
由於這些配置信息在NVR里已經存在,如果能將NVR中的通道配置信息導出,會大大減少前端的配置工作。
網上的通過海康SDK查詢NVR通道信息的帖子很多,但是很多都不包含攝像頭的通道名稱,我在查閱了海康SDK的文檔后使用C++實現了對通道名稱、用戶名、設備IP地址的讀取。
現在把實現方式貼出來,希望對有需要的人提供些參考。
二:使用方法
1.NET_DVR_GetDVRConfig函數

2.使用NET_DVR_GET_IPPARACFG參數獲取網絡連接信息,使用NET_DVR_GET_PICCFG_V30參數獲取通道名稱。
三.主要代碼:
#include <iostream>
#include "HCNetSDK.h"
int main()
{
NET_DVR_Init();
//設置連接時間與重連時間
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
// 注冊設備
LONG lUserID;
//登錄參數,包括設備地址、登錄用戶、密碼等
NET_DVR_USER_LOGIN_INFO struLoginInfo = { 0 };
struLoginInfo.bUseAsynLogin = 0; //同步登錄方式
strcpy(struLoginInfo.sDeviceAddress, "192.168.20.106"); //設備IP地址
struLoginInfo.wPort = 8000; //設備服務端口
strcpy(struLoginInfo.sUserName, "admin"); //設備登錄用戶名
strcpy(struLoginInfo.sPassword, "111111hk"); //設備登錄密碼
//設備信息, 輸出參數
NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = { 0 };
lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
if (lUserID < 0)
{
printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return -1;
}
NET_DVR_IPPARACFG_V40 ipcfg;
DWORD bytesReturned = 0;
ipcfg.dwSize = sizeof(NET_DVR_IPPARACFG_V40);
int iGroupNO = 0;
bool resCode = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG_V40, iGroupNO, &ipcfg, sizeof(NET_DVR_IPPARACFG_V40), &bytesReturned);
if (!resCode)
{
DWORD code = NET_DVR_GetLastError();
std::cout << "NET_DVR_GetDVRConfig failed " << NET_DVR_GetErrorMsg((LONG*)(&code)) << std::endl;
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return -1;
}
std::cout << "設備組 " << ipcfg.dwGroupNum << " 數字通道個數 " << ipcfg.dwDChanNum << " 起始通道 " << ipcfg.dwStartDChan << std::endl << std::endl;
for (int i = 0; i < ipcfg.dwDChanNum; i++)
{
NET_DVR_PICCFG_V30 channelInfo;
bytesReturned = 0;
channelInfo.dwSize = sizeof(NET_DVR_PICCFG_V30);
int channelNum = i + ipcfg.dwStartDChan;
NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_PICCFG_V30, channelNum, &channelInfo, sizeof(NET_DVR_PICCFG_V30), &bytesReturned);
std::cout <<"通道號 "<< channelNum << "\t通道名稱 " << channelInfo.sChanName;
std::cout << "\t用戶名 " << ipcfg.struIPDevInfo[i].sUserName << "\t密碼 " << ipcfg.struIPDevInfo[i].sPassword;
std::cout << "\t設備ID " << (int)ipcfg.struIPDevInfo[i].szDeviceID;
std::cout << "\tip地址 " << ipcfg.struIPDevInfo[i].struIP.sIpV4 << "\t端口 " << ipcfg.struIPDevInfo[i].wDVRPort << std::endl;
}
//釋放SDK資源
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return 0;
}
四.輸出結果:
