大华摄像头通道配置怎么看

大华摄像头通道配置怎么看,第1张

使用大华SDK获取NVR通道配置信息(含通道名称)

转载2288 阅读

mob604756f261ee

mob604756f261ee

2021-10-29 10:52:00

关注

大华SDK NVR

一:出发点

在一些视频监控项目中经常需要对挂载在NVR下的摄像头进行配置。

由于这些配置信息在NVR里已经存在,如果能将NVR中的通道配置信息导出,会大大减少前端的配置工作。

网上的通过海康SDK查询NVR通道信息的帖子很多,但是对大华SDK的帖子缺很少,我在查阅了大华SDK的文档后使用C++实现了对通道名称、用户名、设备IP地址的读取。

现在把实现方式贴出来,希望对有需要的人提供些参考。

二:使用方法

1.CLIENT_GetNewDevConfig函数

使用大华SDK获取NVR通道配置信息(含通道名称)_#include

2.使用CFG_CMD_REMOTEDEVICE参数获取网络连接信息,使用CFG_CMD_CHANNELTITLE参数获取通道名称。

使用大华SDK获取NVR通道配置信息(含通道名称)_配置信息_02

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 = 0i <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

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

36.

37.

38.

39.

40.

41.

42.

43.

44.

45.

46.

47.

48.

49.

50.

51.

52.

53.

54.

55.

56.

57.

58.

59.

60.

61.

62.

63.

64.

65.

66.

67.

68.

69.

70.

71.

72.

73.

74.

75.

76.

77.

78.

79.

80.

81.

82.

83.

84.

85.

86.

87.

88.

89.

90.

91.

92.

93.

94.

95.

96.

97.

98.

99.

100.

101.

102.

103.

104.

105.

106.

107.

108.

109.

110.

111.

112.

113.

114.

115.

116.

117.

118.

119.

120.

四.输出结果:

C#操作视频是通过调用专门的硬件厂商提供的sdk来完成的,比如你想要调用汉邦、大华等摄像头生产厂商,那么你去他们的官方网站下载sdk包,然后通过调用动态链接库的方式调用函数就行了。不过有很多动态链接库是C++写的,所以你可能要查找关于C#如何调用C++编写的动态链接库的方法,其实也就是一些变量类型的转换问题。

希望能帮助到你。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/500741.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-16
下一篇2023-06-16

发表评论

登录后才能评论

评论列表(0条)

    保存