使用大華SDK獲取NVR通道配置信息(含通道名稱)


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

2.使用CFG_CMD_REMOTEDEVICE參數獲取網絡連接信息,使用CFG_CMD_CHANNELTITLE參數獲取通道名稱。

3.由於CLIENT_GetNewDevConfig函數返回的是JSON格式的數據,因此需要對JSON數據進行解析處理。

三.主要代碼:

#include <iostream>
#include <Windows.h>
#include "dhnetsdk.h"
#include "dhplay.h"
#include "dhconfigsdk.h"
#include "json/json.h"


void __stdcall DisConnectFunc(LLONG lLoginID, char* pchDVRIP, LONG nDVRPort, LDWORD dwUser)
{
    printf("Device disconnect, IP=%s, Port=%d\n", pchDVRIP, nDVRPort);
}

void __stdcall SubDisConnectFunc(EM_INTERFACE_TYPE emInterfaceType, BOOL bOnline, LLONG lOperateHandle, LLONG lLoginID, LDWORD dwUser)
{
    switch (emInterfaceType)
    {
    case DH_INTERFACE_REALPLAY:
        printf("實時監視接口: Short connect is %d\n", bOnline);
        break;
    case DH_INTERFACE_PREVIEW:
        printf("多畫面預覽接口: Short connect is %d\n", bOnline);
        break;
    case DH_INTERFACE_PLAYBACK:
        printf("回放接口: Short connect is %d\n", bOnline);
        break;
    case DH_INTERFACE_DOWNLOAD:
        printf("下載接口: Short connect is %d\n", bOnline);
        break;
    default:
        break;
    }
}

std::string Utf8ToGbk(const char* src_str) {
    int len = MultiByteToWideChar(CP_UTF8, 0, src_str, -1, NULL, 0);
    wchar_t* wszGBK = new wchar_t[len + 1];
    memset(wszGBK, 0, len * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, src_str, -1, wszGBK, len);
    len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
    char* szGBK = new char[len + 1];
    memset(szGBK, 0, len + 1);
    WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
    std::string strTemp(szGBK);
    if (wszGBK) delete[] wszGBK;
    if (szGBK) delete[] szGBK;
    return strTemp;
}

int main()
{
    //初始化
    CLIENT_Init(DisConnectFunc, 0);
    CLIENT_SetSubconnCallBack(SubDisConnectFunc, 0);


    NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY stInparam;
    memset(&stInparam, 0, sizeof(stInparam));
    stInparam.dwSize = sizeof(stInparam);
    strncpy(stInparam.szIP, "192.168.31.242", sizeof(stInparam.szIP) - 1);
    strncpy(stInparam.szUserName, "admin", sizeof(stInparam.szUserName) - 1);
    strncpy(stInparam.szPassword, "111111", sizeof(stInparam.szPassword) - 1);
    stInparam.nPort = 37777;
    stInparam.emSpecCap = EM_LOGIN_SPEC_CAP_TCP;
    NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY stOutparam;
    memset(&stOutparam, 0, sizeof(stOutparam));
    stOutparam.dwSize = sizeof(stOutparam);

    LLONG lLoginHandle = NULL;
    LLONG lRealHandle = NULL;
    LLONG lSearch = NULL;
    //注冊用戶到設備
    lLoginHandle = CLIENT_LoginWithHighLevelSecurity(&stInparam, &stOutparam);
    DWORD dwError = CLIENT_GetLastError() & (0x7fffffff);

    Json::Value return_root;
    Json::Reader reader;
    Json::Value value;
    Json::FastWriter return_writer;

    int nerror = 0;
    char* szOutBuffer = new char[32 * 1024];
    memset(szOutBuffer, 0, 32 * 1024);
    
    //獲取網絡信息
    BOOL r1 = CLIENT_GetNewDevConfig(lLoginHandle, (char*)CFG_CMD_REMOTEDEVICE, 2, szOutBuffer, 32 * 1024, &nerror);
    int b = CLIENT_GetLastError() & (0x7fffffff);

    reader.parse(szOutBuffer, value);
    Json::Value devs = value["params"]["table"];
    Json::Value::Members member = devs.getMemberNames();
    int i = 0;
    for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); ++iter)
    {
        if (devs[*iter]["Enable"].asBool())
        {
            Json::Value item;
            item["Channel"] = ++i;
            item["Ip"] = devs[*iter]["Address"];
            return_root.append(item);
        }
    }

    //獲取通道名稱
    memset(szOutBuffer, 0, 32 * 1024);
    BOOL r2 = CLIENT_GetNewDevConfig(lLoginHandle, (char*)CFG_CMD_CHANNELTITLE, -1, szOutBuffer, 32 * 1024, &nerror);
    reader.parse(szOutBuffer, value);
    Json::Value channels = value["params"]["table"];
    for (unsigned int i = 0; i < return_root.size(); ++i)
    {
        std::string name = channels[i]["Name"].asString();
        return_root[i]["Name"] = Utf8ToGbk(name.c_str());
    }

    std::string result = return_writer.write(return_root);
    std::cout << result << std::endl;

    delete szOutBuffer;
    
}

四.輸出結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM