最近项目上需要接入3G摄像头,由于3G设备的IP不是固定的,所以设计方案是设计一个服务器记录下登陆到该服务器上的所有3G设备的信息,这样其他服务器可以从该设备上获取到3G设备的相关信息后,可以与3G设备进行交互。但是目前各个厂家对3G设备主动注册这块儿相关的文档极少,于是自己研究了一下大华3G设备的主动注册。
目前3G设备主动注册有两种方式,一种是配置DDNS,一种是通过调用大华的车载DVR回调监听函数来实现。对应配置DDNS,这个方式适合单用户的远程控制摄像头,对应我们目前的项目需求来说不适用,我们选用的第二种方式。
虽然配置DDNS不是适用项目型的情况,但是下面我把我查到的相关资料列举一下,为以后做个记录。
1.使用大华默认的DDNS,可以参考博客:http://blog.csdn.net/fengshuiyue/article/details/24313641
2.使用花生壳配置DDNS,参考地址:http://hsk.oray.com/case/
打开“使用花生壳+大华硬盘录像机搭建远程视频监控”这一项即可,如下图:
1.通过web系统进入大华设置界面,设置设备自动注册的IP和Port,如下图:
2.调用大华车载DVR服务监听接口,接口SDK如下图
3.调用监听接口简单测试工程,代码如下
#include "stdafx.h" #include <iostream> #include <conio.h> #include "dhnetsdk.h" LLONG handle = 0; int CALLBACK ffServiceCallBack( LLONG lHandle, char *ip, WORD port, LONG lCommand, void *pParam, DWORD dwParamLen, LDWORD dwUserData) { char* deviceNo = NULL; if (lCommand==1) { std::cout<<"*******************************************************"<<std::endl; deviceNo= (char*)pParam; std::cout<<"ip:"<<ip<<",port:"<<port<<std::endl; std::cout<<"lcommand value is "<<lCommand<<std::endl; BOOL ret = CLIENT_ResponseDevReg( deviceNo, ip, port, 1); if (ret) { std::cout<<"client_responseDevReg successfully"<<std::endl; }else { std::cout<<"client_responseDevReg failed"<<std::endl; } }else { std::cout<<"*******************************************************"<<std::endl; std::cout<<"ip:"<<ip<<",port:"<<port<<std::endl; std::cout<<"lcommand value is "<<lCommand<<std::endl; } if (handle==0) { NET_DEVICEINFO lpDeviceInfo={0}; int error = 0; handle = CLIENT_LoginEx( ip, port, "admin", "admin", 2, deviceNo, &lpDeviceInfo, &error ); switch (error) { case 1: std::cout<<"密码不正确"<<std::endl; break; case 2: std::cout<<"用户名不存在"<<std::endl; break; case 3: std::cout<<"登录超时"<<std::endl; break; case 4: std::cout<<"帐号已登录"<<std::endl; break; case 5: std::cout<<"帐号已被锁定"<<std::endl; break; case 6: std::cout<<"帐号被列为黑名单 "<<std::endl; break; case 7: std::cout<<"资源不足,系统忙"<<std::endl; break; case 8: std::cout<<"子连接失败"<<std::endl; break; case 9: std::cout<<"主连接失败"<<std::endl; break; case 10: std::cout<<"超过最大用户连接数"<<std::endl; break; } std::cout<<"device sub id is " << deviceNo <<std::endl; std::cout<<"device serialnum is "<< lpDeviceInfo.sSerialNumber <<std::endl; if (handle) { std::cout<<"login successfully,device id is "<<handle<<std::endl; }else{ std::cout<<"login failed"<<std::endl; } } return 1; } int _tmain(int argc, _TCHAR* argv[]) { int i; NET_DEVICEINFO deviceInfo ={0}; unsigned long lLogin; //Initialize the SDK, set the disconnection callback functions CLIENT_Init(NULL,0); bool ret = CLIENT_ListenServer( "192.168.1.116", 9500, 0, ffServiceCallBack, 123 ); //std::cout<<"ret:"<<ret<<std::endl; //CLIENT_Cleanup(); std::cin>>i; return 0; }
注: 大华设备的回调函数 fServiceCallBack 中的参数lCommand值可以1或-1,但是文档中并没有做相关的说明,故想问一下,这个参数在不同值时所代表的含义。