admin 管理员组文章数量: 887021
2023年12月17日发(作者:带脉的准确位置图与功效)
. .
数字硬盘录像机程序开发文档
基于?设备网络SDK使用手册 V4.1.0?
概述
设备网络SDK是基于设备私有网络通信协议开发的,为后端设备〔嵌入式网络硬盘录像机、视频效劳器〕、前端设备〔网络摄像机、网络球机、IP模块〕等产品效劳的配套模块,用于远程访问和控制设备软件的二次开发。
设备网络SDK主要功能
序号
1.
2.
3.
4.
5.
6.
7.
8.
9.
图像预览
文件回放和下载
云台控制、布防/撤防
语音对讲
日志管理
解码卡
远程升级
远程重启/关闭
格式化硬盘
参数配置〔系统配置、通道配置、串口配置、报警配置、用户配置〕
功能
备注
10.
11. 多路解码器
12. 智能设备功能和获取设备能力集
设备网络SDK包含网络通讯库、软解码库、硬解码库等功能组件,我们提供Windows和Linux两个版本的SDK,各自所包含的组件如下:
Windows下设备网络SDK:
HetSDK.h
网络通讯库 LIB
DLL
hpr库 LIB
头文件
库文件
库文件
库文件
. v .
. .
DLL
RTSP通讯库 DLL
PlayM4.h
软解码库 LIB
DLL
转封装库
硬解码库
Linux下设备网络SDK库:
网络通讯库
hpr库
RTSP通讯库
软解码库
转封装库
hetsdk.h
playsdkpu.h
DLL
DataType.h
DecodeCardSdk.h
LIB
DLL
库文件
库文件
头文件
库文件
库文件
库文件
头文件
库文件
库文件
头文件
SO库文件
SO库文件
SO库文件
头文件
SO库文件
SO库文件
本版本的设备网络SDK开发包中包含以上各个组件,以下将对各个组件在SDK中的作用和使用条件分别说明。
网络通讯库是设备网络SDK的主体,主要用于网络客户端与各类产品之间的通讯交互,负责远程功能调控、远程参数配置及码流数据的获取和处理等。
hpr库是网络通讯库的依赖库。
RTSP通讯库是支持RTSP传输协议的网络库。当需要对支持RTSP协议的产品进展取流等操作时就必须加载该项组件。
软解码库主要用于对实时码流数据进展解码显示〔实现预览功能〕和对录像文件进展回放解码等。用户如果需要在SDK部进展对实时流和录像码流播放显示时〔即NET_DVR_RealPlay_V30接口的第二个构造体参数的播放句柄设置成有效句柄时〕必须加载该组件,而如果用户仅需要用网络通讯库捕获到数据后再外部自行处理就不需要加载该组件,这种情况下用户在外部自行解码将更灵活,可参见软解码库函数说明?播放器SDK编程指南?。
. v .
. .
转封装库的功能可以分为两种:一种是将标准码流转换成采用我们公司封装格式的码流。当用户需要对支持RTSP协议的产品捕获采用本公司封装格式的码流数据时〔即当设置NET_DVR_RealPlay_V30接口中的回调函数捕获数据或者调用NET_DVR_SetRealDataCallBack接口捕获数据时〕必须加载该组件。另一种功能是能将标准码流转换成其他格式的封装,如3GPP、PS等。例如,当用户需要对支持RTSP协议的产品实时捕获指定封装格式的码流数据〔对应的SDK接口为NET_DVR_SaveRealData〕时必须加载该项组件。
硬解码库需在配备硬解码卡〔MD卡〕的前提下使用,通过解码卡的解码与输出功能实现实时流的解码显示及向监视器上矩阵输出的功能。用户如果需要在SDK部对实时流码流播放显示时必须加载该项组件。为更方便灵活地调用硬解码的相关功能,建议用户通过捕获数据在外部处理解码。相关硬解码库的功能函数可参见?板卡SDK编程指南?中解码卡API相关介绍。Linux下无硬解功能。
通用接口介绍
接口
NET_DVR_Init
NET_DVR_Cleanup
NET_DVR_SetConnectTime
NET_DVR_SetReconnect
NET_DVR_GetDVRIPByResolveSvr
NET_DVR_SetDVRMessage
NET_DVR_GetSDKVersion
NET_DVR_GetSDKBuildVersion
NET_DVR_GetSDKState
NET_DVR_GetSDKAbility
NET_DVR_SetLogToFile
NET_DVR_GetLastError
NET_DVR_GetErrorMsg
NET_DVR_Login_V30
NET_DVR_Logout_V30
功能
初始化SDK
释放SDK资源
设置SDK网络连接超时时间和连接尝试次数
设置SDK重连功能
通过解析效劳器,获取设备的动态IP地址
注册接收异常、重连等消息的窗口句柄
获取SDK的版本信息
获取SDK的版本号和build信息
获取当前SDK的状态信息
获取当前SDK的功能信息
启用SDK写日志文件
返回最后操作的错误码
返回最后操作的错误码信息
注册
注销
支持的产品
全部
全部
全部
全部
全部
全部
全部
全部
全部
全部
全部
全部
全部
全部
全部
备注
NET_DVR_SetExceptionCallBack_V30
注册接收异常、重连等消息的窗口句柄或回调函数
全部
. v .
. .
编程引导
SDK主动注册模式
SDK接口调用的主要流程
其中虚线框的流程是可选局部,不会影响其他流程和模块的功能使用。按实现功能的不同可以分成十个模块,实现每个模块的功能时初始化SDK、用户注册设备、注销设备和释放SDK资源这4个流程是必不可少的。
1) 初始化SDK〔NET_DVR_Init〕:对整个网络SDK系统的初始化,存预分配等操作。
2) 设置连接超时时间〔NET_DVR_SetConnectTime〕:这局部为可选,用于设置SDK中的网络连接超时时间,用户可以根据自己的需要设置该值。在不调用此接口设置超时时间的情况下,将采用SDK中的默认值。
3) 设置接收异常消息的回调函数〔NET_DVR_SetDVRMessage或NET_DVR_SetExceptionCallBack_V30〕:由于SDK局部模块的功能都是由异步模式实现,所以我们提供此接口用于接收预览、报警、回放、透明通道和语音对讲等模块发生异常信息。用户可以在初始化SDK后就设置该回调函数,在应用层对各个模块异常消息的接收和处理。
4) 从解析效劳器获得设备的IP地址〔NET_DVR_GetDVRIPByResolveSvr〕:该接口提供一种在仅知道设备名称和序列号的情况下,从解析效劳器获得设备IP地址的方法。如:当前设备是通过拨号上网方式获取到动态IP地址,而运行了我公司IPServer软件的效劳器即为解析效劳器,我们可以通过此接口输入解析效劳器的地址、设备的名称和序列号等信息查询该设备的IP地址。IPServer是我公司提供的一款域名解析效劳器软件。
5) 用户注册设备〔NET_DVR_Login_V30〕:实现用户的注册功能,注册成功后,返回的用户ID作为其他功能操作的唯一标识,SDK允许最大注册用户数为512个。就设备而言,V3.0以上版本支持的设备允许有32个注册用户名,而且同时最多允许128个用户注册;V3.0以下版本支持的设备允许有16个注册用户名,而且同时最多允许128个用户注册。
6) 预览模块:从前端效劳器取实时码流,解码显示以及播放控制等功能,同时支持软解码和解码卡解码。具体流程详见预览模块流程。
7) 回放和下载模块:可以通过按时间和按文件名的方式远程回放或者下载前端效劳器的录像文件,后续可以进展解码或者存储。同时还支持断点续传功能。具体流程详见回放和下载模块流程。
8) 参数配置模块:设置和获取前端效劳器的参数,主要包括设备参数、网络参数、通道压缩参数、串口参数、报警参数、异常参数、交易信息和用户配置等参数信息。具体流程详见参数配置模块流程。
9) 远程设备维护模块:实现关闭设备、重启设备、恢复默认值、远程硬盘格式化、远程升级和配置文件导入/导出等维护工作。具体流程详见远程设备维护模块流程。
10) 语音对讲转发模块:实现和前端效劳器的语音数据对讲和语音数据获取,音频编码格式可以指定。具体流程详见语音对讲转发模块流程。
11) 报警模块:处理前端效劳器上传的各种报警信号。报警分为“布防〞和“监听〞两种方式,在采用监听方式并且不需要获取用户ID的情况下,报警模块可以无需进展“用户注册〞操作步骤。具体流程详见报警模块流程。
12) 透明通道模块:透明通道是将IP数据报文解析后直接发送到串行口的一种技术。实际上起到了延伸串行设备控制距离的作用。可利用IP网络控制多种串行设备,如控制解码器、矩阵、报警主机、门禁、仪器仪表等串行设备,对用户来说,只看到点对点传输,无须关心网络传输过程,所以称为串口透明通道。 SDK提供485和232串口作为透明通道功能,其中要将232串口作为透明通道使用,首先必须在232串口的配置信息〔NET_DVR_RS232CFG〕中将工作模式选为透明通道,这样232串口才可作为透明通道使用。具体流程详见透明通道模块流程。
. v .
. .
13) 云台控制模块:实现对云台的根本操作、预置点、巡航、轨迹和透明云台的控制。SDK将云台控制分为两种模式:一种是通过图像预览返回的句柄进展控制;另一种是无预览限制,通过用户注册ID号进展云台控制。
14) 解码器功能模块:实现解码器设备的配置、解码控制等功能。SDK支持单路解码器和多路解码器,但目前以多路解码器为主流产品。具体流程详见多路解码器功能模块流程。
15) 智能行为分析功能模块:实现对智能产品的参数配置、报警上传和能力集获取等功能。具体流程详见智能行为分析功能模块流程。
注:本手册下文提供的代码都是在VC环境下编译的。
预览模块流程
实时预览支持TCP、UDP、RTP、MULTICAST网络传输模式。
实时预览时,DS-80xx、DS-70xx、DS-71xx、DS-72xx、 DS-60xx、DS-61xx系列设备每个通道最多支持6路同时连接,每台设备最多支持24路同时连接;
DS-81xx、DS-71xxHV、72xxHV等系列设备每个通道最多支持6路同时连接,每台设备最多支持18路同时连接;
DS-90xx混合型硬盘录像机每个通道最多支持6路同时连接,每台设备最多支持64路同时连接;
DS-91xx系列设备每个通道最多支持6路同时连接,每台设备最多支持64路同时连接;
IP设备每个通道最多支持6路同时连接;
DS-91xx-ST系列通道连接数没有限制,每台设备最多支持128路同时连接。
预览和与预览相关的模块流程图
图中虚线框局部的模块是与预览模块相关,必须在启动预览后才能调用,这些模块之间是并列的关系,各自完成相应的功能。
声音控制功能主要实现独占、共享声音的翻开和关闭;音量的控制。相关接口有:NET_DVR_OpenSound、NET_DVR_CloseSound、NET_DVR_OpenSoundShare、NET_DVR_CloseSoundShare、NET_DVR_Volume等。
实时流数据捕获和录像模块主要实现数据回调和本地录像的功能,可以供用户后续处理。相关接口有:NET_DVR_SetRealDataCallBack、NET_DVR_SetStandardDataCallBack、NET_DVR_SaveRealData等。
抓图功能主要实现对当前解码图像的捕获,保存格式为BMP。相关接口有:NET_DVR_CapturePicture。
云台控制模块主要是在开启预览的前提下实现对云台控制的操作功能,包括云台预置点、巡航、轨迹和透明云台等。相关接口有:NET_DVR_PTZControl、NET_DVR_PTZControl_EX、NET_DVR_PTZPreset、NET_DVR_PTZPreset_EX、NET_DVR_PTZCruise、NET_DVR_PTZCruise_EX、NET_DVR_PTZTrack、NET_DVR_PTZTrack_EX、NET_DVR_TransPTZ、NET_DVR_TransPTZ_EX。
实时流解码方式
方式一:在预览接口NET_DVR_RealPlay_V30中预览参数的播放窗口句柄赋成有效句柄,那么由SDK实现解码功能。在初始化SDK和注册设备两步骤后,直接调用启动预览和停顿预览接口。
方式二:用户可以通过设置预览接口NET_DVR_RealPlay_V30中预览参数的播放窗口句柄为空值,并通过调用捕获数据的接口〔即设置NET_DVR_RealPlay_V30接口中的回调函数或调用NET_DVR_SetRealDataCallBack、NET_DVR_SetStandardDataCallBack接口〕,获取码流数据进展后续解码播放处理。
下面例如代码以设置NET_DVR_RealPlay_V30()接口中的回调为例进展说明。
例如代码
方式一(由SDK实现解码显示)
*include
*include
*include "Windows.h"
*include "HetSDK.h"
*include
using namespace std;
. v .
. .
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
char tempbuf[256] = {0};
switch(dwType)
{
case EXCEPTION_RECONNECT: //预览时重连
printf("----------reconnect--------%dn", time(NULL));
break;
default:
break;
}
}
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//设置异常消息回调函数
NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);
//---------------------------------------
//启动预览并设置回调数据流
LONG lRealPlayHandle;
HWND hWnd = GetConsoleWindow(); //获取窗口句柄
NET_DVR_CLIENTINFO ClientInfo = {0};
nd = hWnd; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
el = 1; //预览通道号
ode = 0; //最高位(31)为0表示主码流,为1表示子码流0~30位表示连接方式:0-TCP方式;1-UDP方式;2-多播方式;3-RTP方式;
CastIP = NULL; //多播地址,需要多播预览时配置
BOOL bPreviewBlock = false; //请求码流过程是否阻塞,0:否,1:是
lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, NULL, NULL, 0);
if (lRealPlayHandle < 0)
{
printf("NET_DVR_RealPlay_V30 errorn");
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//关闭预览
NET_DVR_StopRealPlay(lRealPlayHandle);
. v .
. .
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
方式二〔由用户自行处理回调得到的码流数据,此处以软解显示为例,代码中带有PlayM4_的函数参见软解码库说明文档?播放器SDK编程指南?〕
*include
*include
*include "Windows.h"
*include "HetSDK.h"
*include "plaympeg4.h"
*include
using namespace std;
LONG lPort; //全局的播放库port号
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void*
dwUser)
{
HWND hWnd=GetConsoleWindow();
switch (dwDataType)
{
case NET_DVR_SYSHEAD: //系统头
if (!PlayM4_GetPort(&lPort)) //获取播放库未使用的通道号
{
break;
}
//m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放
if (dwBufSize > 0)
{
if (!PlayM4_SetStreamOpenMode(lPort, STREAME_REALTIME)) //设置实时流播放模式
{
break;
}
if (!PlayM4_OpenStream(lPort, pBuffer, dwBufSize, 1024*1024)) //翻开流接口
{
break;
}
if (!PlayM4_Play(lPort, hWnd)) //播放开场
{
break;
}
}
case NET_DVR_STREAMDATA: //码流数据
if (dwBufSize > 0 && lPort != -1)
{
if (!PlayM4_InputData(lPort, pBuffer, dwBufSize))
{
break;
}
}
}
}
. v .
. .
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
char tempbuf[256] = {0};
switch(dwType)
{
case EXCEPTION_RECONNECT: //预览时重连
printf("----------reconnect--------%dn", time(NULL));
break;
default:
break;
}
}
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("172.0.0.100", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//设置异常消息回调函数
NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);
//---------------------------------------
//启动预览并设置回调数据流
LONG lRealPlayHandle;
NET_DVR_CLIENTINFO ClientInfo = {0};
nd = NULL; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
el = 1; //预览通道号
ode = 0; //最高位(31)为0表示主码流,为1表示子码流0~30位表示连接方式:0-TCP方式;1-UDP方式;2-多播方式;3-RTP方式;
CastIP = NULL; //多播地址,需要多播预览时配置
BOOL bPreviewBlock = false; //请求码流过程是否阻塞,0:否,1:是
lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, g_RealDataCallBack_V30, NULL, 0);
if (lRealPlayHandle < 0)
{
printf("NET_DVR_RealPlay_V30 errorn");
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//关闭预览
NET_DVR_StopRealPlay(lRealPlayHandle);
//注销用户
. v .
. .
NET_DVR_Logout_V30(lUserID);
NET_DVR_Cleanup();
return;
}
回放和下载模块流程
按文件回放或下载需要通过查找录像文件功能先获取文件信息〔相关接口NET_DVR_FindFile_V30、NET_DVR_FindNextFile_V30〕,然后根据获取到的文件名开场回放或下载〔相关接口NET_DVR_PlayBackByName、NET_DVR_GetFileByName〕,特别提醒在调用了回放或下载的接口后,还必须调用控制接口〔NET_DVR_PlayBackControl〕的开场播放命令〔NET_DVR_PLAYSTART〕。
按时间回放或下载文件时,用户可以无需调用查找录像文件的相关接口,只要在接口中指定开场和完毕时间,调用回放或下载接口〔相关接口NET_DVR_PlayBackByTime、NET_DVR_GetFileByTime〕后,还必须调用控制接口〔NET_DVR_PlayBackControl〕的开场播放命令〔NET_DVR_PLAYSTART〕。此时,将按照指定时间围最近的有录像的时间段开场回放或下载。用户也可以通过调用查找录像文件的相关接口,获取文件的开场和完毕时间后,按这个时间围指定回放或下载接口中的时间参数,最后还必须调用控制接口〔NET_DVR_PlayBackControl〕的开场播放命令〔NET_DVR_PLAYSTART〕。
Linux下,按文件回放和按时间回放时,假设回放的窗口句柄不为NULL〔即需要SDK解码显示〕,需要调用初始化窗口接口〔NET_DVR_DrawAreaInit〕进展SDL窗口的初始化才能正常的解码显示,在停顿回放时,需要调用释放窗口资源接口〔NET_DVR_DrawAreaRelease〕释放窗口资源。
例如代码
例如一:查找录像文件并下载
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
int saveRecordFile(int userId,char * srcfile,char * destfile)
{
int bRes = 1;
int hPlayback = 0;
if( (hPlayback = NET_DVR_GetFileByName(userId, srcfile, destfile)) < 0 )
{
printf( "GetFileByName failed. error[%d]n", NET_DVR_GetLastError());
bRes= -1;
return bRes;
}
if(!NET_DVR_PlayBackControl(hPlayback, NET_DVR_PLAYSTART, 0, NULL))
{
printf("play back control failed [%d]n",NET_DVR_GetLastError());
bRes=-1;
return bRes;
}
int nPos = 0;
for(nPos = 0; nPos < 100&&nPos>=0; nPos = NET_DVR_GetDownloadPos(hPlayback))
{
Sleep(5000); //millisecond
}
printf("have got %dn", nPos);
if(!NET_DVR_StopGetFile(hPlayback))
{
printf("failed to stop get file [%d]n",NET_DVR_GetLastError());
bRes = -1;
return bRes;
. v .
. .
}
printf("%sn",srcfile);
if(nPos100)
{
printf("download err [%d]n",NET_DVR_GetLastError());
bRes=-1;
return bRes;
}
else
{
return 0;
}
}
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
NET_DVR_FILECOND struFileCond;
Type = 0xFF;
el = 1;
cked = 0xFF;
ardNo = 0;
= 2021;
h = 3;
= 1;
= 10;
te = 6;
nd =50;
= 2021;
h = 3;
= 1;
= 11;
te = 7;
nd = 0;
//---------------------------------------
//查找录像文件
int lFindHandle = NET_DVR_FindFile_V30(lUserID, &struFileCond);
if(lFindHandle < 0)
{
printf("find file fail,last error %dn",NET_DVR_GetLastError());
return;
. v .
. .
}
NET_DVR_FINDDATA_V30 struFileData;
while(true)
{
int result = NET_DVR_FindNextFile_V30(lFindHandle, &struFileData);
if(result == NET_DVR_ISFINDING)
{
continue;
}
else if(result == NET_DVR_FILE_SUCCESS)
{
char strFileName[256] = {0};
sprintf(strFileName, "./%s", ame);
saveRecordFile(lUserID, ame, strFileName);
break;
}
else if(result == NET_DVR_FILE_NOFIND || result == NET_DVR_NOMOREFILE)
{
break;
}
else
{
printf("find file fail for illegal get file state");
break;
}
}
//停顿查找
if(lFindHandle > 0)
{
NET_DVR_FindClose_V30(lFindHandle);
}
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
例如二:按时间播放录像文件
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
. v .
. .
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
NET_DVR_TIME struStartTime, struStopTime;
= 2021;
h = 3;
= 1;
= 9;
te = 0;
nd =0;
= 2021;
h = 3;
= 1;
= 10;
te = 7;
nd = 0;
HWND hWnd = GetConsoleWindow(); //获取窗口句柄
//---------------------------------------
//按时间回放
int hPlayback;
hPlayback = NET_DVR_PlayBackByTime(lUserID, 1, &struStartTime, &struStopTime, hWnd);
if(hPlayback < 0)
{
printf("NET_DVR_GetFileByTime fail,last error %dn",NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//开场
if(!NET_DVR_PlayBackControl(hPlayback, NET_DVR_PLAYSTART, 0, NULL))
{
printf("play back control failed [%d]n",NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
Sleep(15000); //millisecond
if(!NET_DVR_StopPlayBack(hPlayback))
{
printf("failed to stop file [%d]n",NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
. v .
. .
例如三:按时间下载录像文件
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
NET_DVR_TIME struStartTime, struStopTime;
= 2021;
h = 3;
= 1;
= 9;
te = 0;
nd =0;
= 2021;
h = 3;
= 1;
= 10;
te = 7;
nd = 0;
//---------------------------------------
//按时间下载
int hPlayback;
hPlayback = NET_DVR_GetFileByTime(lUserID, 1, &struStartTime, &struStopTime, "./4");
if(hPlayback < 0)
{
printf("NET_DVR_GetFileByTime fail,last error %dn",NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//开场下载
if(!NET_DVR_PlayBackControl(hPlayback, NET_DVR_PLAYSTART, 0, NULL))
{
printf("play back control failed [%d]n",NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
. v .
. .
NET_DVR_Cleanup();
return;
}
int nPos = 0;
for(nPos = 0; nPos < 100&&nPos>=0; nPos = NET_DVR_GetDownloadPos(hPlayback))
{
Sleep(5000); //millisecond
}
if(!NET_DVR_StopGetFile(hPlayback))
{
printf("failed to stop get file [%d]n",NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
if(nPos100)
{
printf("download err [%d]n",NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
参数配置模块流程
实现参数配置首先必须做好初始化SDK和用户注册这两个步骤,将用户注册接口返回的ID号作为配置接口的首个参数。建议在每次设置某类参数之前,先调用获取参数的接口〔NET_DVR_GetDVRConfig〕得到完整的参数构造,修改需要更改的参数,作为设置参数接口中的输入参数,最后调用设置参数接口〔NET_DVR_SetDVRConfig〕,返回成功即设置成功。
例如代码
配置压缩参数〔NET_DVR_PRESSIONCFG_V30〕
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
. v .
. .
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
int iRet;
//获取压缩参数
DWORD dwReturnLen;
NET_DVR_PRESSIONCFG_V30 struParams = {0};
iRet = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_PRESSCFG_V30, tChan,
&struParams, sizeof(NET_DVR_PRESSIONCFG_V30), &dwReturnLen);
if (!iRet)
{
printf("NET_DVR_GetDVRConfig NET_DVR_GET_PRESSCFG_V30 error.n");
NET_DVR_Logout_V30(lUserID);
NET_DVR_Cleanup();
return;
}
//设置压缩参数
oBitrate = 22;
iRet = NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_PRESSCFG_V30, tChan,
&struParams, sizeof(NET_DVR_PRESSIONCFG_V30));
if (!iRet)
{
printf("NET_DVR_GetDVRConfig NET_DVR_SET_PRESSCFG_V30 error.n");
NET_DVR_Logout_V30(lUserID);
NET_DVR_Cleanup();
return;
}
//获取压缩参数
iRet = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_PRESSCFG_V30, tChan,
&struParams, sizeof(NET_DVR_PRESSIONCFG_V30), &dwReturnLen);
if (!iRet)
{
printf("NET_DVR_GetDVRConfig NET_DVR_GET_PRESSCFG_V30 error.n");
NET_DVR_Logout_V30(lUserID);
NET_DVR_Cleanup();
return;
}
printf("Video Bitrate is %dn", oBitrate);
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
远程设备维护模块流程
远程设备维护模块包括获取设备工作状态、远程升级、日志查找、恢复设备默认参数和导入、导出配置文件等功能。
获取设备工作状态:可以获取到设备当前的硬盘状态、通道状态、报警输入和输出口状态、本地显示状态和语音通道状态等信息。相关接口有:NET_DVR_GetDVRWorkState_V30等。
. v .
. .
远程升级:对设备进展升级,并且可以获取当前升级的进度和状态。相关接口有:NET_DVR_Upgrade、NET_DVR_GetUpgradeProgress、NET_DVR_GetUpgradeState等。
日志查找:可以搜索到当前设备的日志信息,包括报警、异常、操作和带S.M.A.R.T信息的日志。相关接口有:NET_DVR_FindDVRLog_V30、NET_DVR_FindNextLog_V30等。
恢复设备默认参数:调用接口NET_DVR_RestoreConfig能将设备的所有参数都恢复成默认值。
导入、导出配置文件:将设备目前的所有配置信息导出保存或者将指定的配置信息导入到设备。相关接口有:NET_DVR_GetConfigFile_V30、NET_DVR_GetConfigFile、NET_DVR_SetConfigFile_EX、NET_DVR_SetConfigFile等。
例如代码
日志查询
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
NET_DVR_TIME struStartTime, struStopTime;
= 2021;
h = 3;
= 2;
= 9;
te = 0;
nd =0;
= 2021;
h = 3;
= 2;
= 9;
te = 10;
nd = 0;
//---------------------------------------
//查找日志
int lFindHandle = NET_DVR_FindDVRLog_V30(lUserID, 0, 0, 0, &struStartTime, &struStopTime, FALSE);
if(lFindHandle < 0)
{
printf("find log fail,last error %dn",NET_DVR_GetLastError());
. v .
. .
return;
}
NET_DVR_LOG_V30 struLog;
while(true)
{
int result = NET_DVR_FindNextLog_V30(lFindHandle, &struLog);
if(result == NET_DVR_ISFINDING)
{
printf("findingn");
continue;
}
else if(result == NET_DVR_FILE_SUCCESS)
{
char strLog[256] = {0};
printf("log:%04d-%02d-%02d %02d:%02d:%02dn", , h,
,
,te, nd);
}
else if(result == NET_DVR_FILE_NOFIND || result == NET_DVR_NOMOREFILE)
{
printf("find endingn");
break;
}
else
{
printf("find log fail for illegal get file staten");
break;
}
}
//停顿日志查询
if(lFindHandle > 0)
{
NET_DVR_FindLogClose_V30(lFindHandle);
}
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
语音对讲、转发模块流程
语音对讲功能实现PC机与设备间音频的发送和接收。在成功注册设备后调用NET_DVR_StartVoice_V30接口完成,同时在该接口中用户可以通过设置回调函数获取当前设备发送或者PC机采集的数据〔按需要选择回调编码后或者PCM数据〕。
语音转发功能实现将待发送的音频数据〔编码后〕转发给设备。首先调用NET_DVR_StartVoice_MR_V30接口启动与某台设备的语音转发,再调用NET_DVR_VoiceSendData接口发送经过编码的音频数据,但是对每次发送的数据大小有限定值,详细说明可见接口。首先调用NET_DVR_StartVoice_MR_V30接口启动与设备的语音转发〔此时已建立与设备之间的连接,等待发送数据〕。第二,准备好待发送的数据〔需要经过编码〕,相对于上图中虚线框局部,如果数据已按本公司的压缩格式处理这局部就可以省略。数据源可以是从PC声卡中采集或是从文件中读取,但是需要经过本公司提供的压缩算法进展压缩处理,SDK提供一套编码接口,方法如下:1〕初始化音频编码,调用接口. v .
. .
NET_DVR_InitG722Encoder;2〕G722音频编码,调用接口NET_DVR_EncodeG722Frame,该接口的参数有一定的要求,详见接口说明;3〕当完毕所有的编码过程需要调用NET_DVR_ReleaseG722Encoder接口释放编码音频资源。经过第二部的编码操作,我们可以每次得到固定大小的且经过编码后的数据,调用NET_DVR_VoiceSendData接口发送这些数据给设备。等所有的转发操作完成后,调用NET_DVR_StopVoice接口完毕与设备的语音转发连接。
Linux下目前只支持语音转发功能,暂不支持语音对讲。
例如代码
例如一:语音对讲
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
void CALLBACK fVoiceDataCallBack(LONG lVoiceHandle, char *pRecvDataBuffer, DWORD dwBufSize, BYTE byAudioFlag, void*
pUser)
{
printf("receive voice data, %dn", dwBufSize);
}
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//语音对讲
LONG lVoiceHanle;
lVoiceHanle = NET_DVR_StartVoice_V30(lUserID, 1,0, fVoiceDataCallBack, NULL);
if (lVoiceHanle < 0)
{
printf("NET_DVR_StartVoice_V30 error, %d!n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
Sleep(5000); //millisecond
//关闭语音对讲
if (!NET_DVR_StopVoice(lVoiceHanle))
{
printf("NET_DVR_StopVoice error, %d!n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
. v .
. .
NET_DVR_Cleanup();
return;
}
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
例如二:语音转发
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
void CALLBACK fVoiceDataCallBack(LONG lVoiceHandle, char *pRecvDataBuffer, DWORD dwBufSize, BYTE byAudioFlag, void*
pUser)
{
//此处的音频数据是由设备发送的编码后数据,也可以是本地采集并编码后的数据
NET_DVR_VoiceSendData(lVoiceHandle, pRecvDataBuffer, 80);
}
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("172.0.0.100", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//语音转发
LONG lVoiceHanle;
lVoiceHanle = NET_DVR_StartVoice_MR_V30(lUserID, 1, fVoiceDataCallBack, NULL);
if (lVoiceHanle < 0)
{
printf("NET_DVR_StartVoice_MR_V30 error, %d!n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
Sleep(5000); //millisecond
//关闭语音转发
if (!NET_DVR_StopVoice(lVoiceHanle))
{
printf("NET_DVR_StopVoice error, %d!n", NET_DVR_GetLastError());
. v .
. .
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
报警模块流程
报警可分为“布防〞和“监听〞两种方式。采用两种报警方式都可以接收到设备上传的移动侦测报警、视频信号丧失报警、遮挡报警和信号量报警等信息。
“布防〞报警方式:是指SDK主动连接设备,并发起报警上传命令,设备发生报警立即发送给SDK。
由“报警〔布防〕的流程图〞中看出,“布防〞方式需要先进展用户注册〔NET_DVR_Login_V30〕。虚线框局部是实现报警信息上传的必要条件,主要完成相关的报警条件和处理方法的配置,参数配置的接口为NET_DVR_GetDVRConfig和NET_DVR_SetDVRConfig。支持的报警类型有移动侦测、视频信号丧失、遮挡和信号量报警,其中前三种报警类型对应的报警条件和处理方法的配置构造体是NET_DVR_PICCFG_V30,而信号量报警的配置构造体是NET_DVR_ALARMINCFG_V30。这些参数如果已经配置完成,那么虚线框局部可以省略。接下来就是设置报警回调函数〔NET_DVR_SetDVRMessageCallBack_V30等〕,调用成功后还需要设置布防〔NET_DVR_SetupAlarmChan_V30〕。整个报警上传过程完毕后还需要调用撤防接口等操作。
“监听〞报警方式:是指SDK不主动发起连接设备,只是在设定的端口上监听接收设备主动上传的报警信息。
所以这个过程需要远程配置设备的报警主机地址〔即PC机地址〕和报警主机端口〔即PC的监听端口〕,报警主机就在该端口上监听接收设备主动上传的报警信息。如果报警主机地址和报警主机端口已配置完成,那么“报警〔监听〕的流程图〞中虚线框“用户注册〞和“配置报警主机地址和端口〞局部就可以省略,但事先没有配置,就必须调用参数配置接口〔NET_DVR_GetDVRConfig和NET_DVR_SetDVRConfig〕对设备的网络参数〔NET_DVR_NETCFG_V30〕进展配置。而虚线框“配置报警条件和处理方法〞局部与“布防〞中的一致。对以上需要配置的参数都设置完后,调用NET_DVR_StartListen_V30函数,开启SDK的监听端口,准备接收设备上传的报警信息。该方式适用于多个设备向一台客户端上传报警,而且不需要设备登录即可完成,设备重启后不影响报警上传;缺点是设备只支持一个报警主机地址和端口号的配置。
例如代码
例如一:布防报警
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
void CALLBACK MessageCallback(LONG lmand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void*
pUser)
{
int i;
NET_DVR_ALARMINFO struAlarmInfo;
memcpy(&struAlarmInfo, pAlarmInfo, sizeof(NET_DVR_ALARMINFO));
switch(lmand)
{
. v .
. .
case M_ALARM:
{
switch (mType)
{
case 3: //移动侦测报警
for (i=0; i< 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//设置报警回调函数
NET_DVR_SetDVRMessageCallBack_V30(MessageCallback, NULL);
//启用布防
LONG lHandle;
lHandle = NET_DVR_SetupAlarmChan_V30(lUserID);
if (lHandle < 0)
{
printf("NET_DVR_SetupAlarmChan_V30 error, %dn", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
Sleep(5000);
//撤销布防上传通道
if (!NET_DVR_CloseAlarmChan_V30(lHandle))
{
printf("NET_DVR_CloseAlarmChan_V30 error, %dn", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
例如二:监听报警
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
void CALLBACK MessageCallback(LONG lmand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void*
pUser)
{
int i;
NET_DVR_ALARMINFO struAlarmInfo;
memcpy(&struAlarmInfo, pAlarmInfo, sizeof(NET_DVR_ALARMINFO));
switch(lmand)
{
case M_ALARM:
{
. v .
. .
switch (mType)
{
case 3: //移动侦测报警
for (i=0; i< 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//设置报警回调函数
NET_DVR_SetDVRMessageCallBack_V30(MessageCallback, NULL);
//启用监听
LONG lHandle;
lHandle = NET_DVR_StartListen_V30(NULL,7200, MessageCallback, NULL);
if (lHandle < 0)
{
printf("NET_DVR_SetupAlarmChan_V30 error, %dn", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
Sleep(5000);
//停顿监听
if (!NET_DVR_StopListen_V30(lHandle))
{
printf("NET_DVR_StopListen_V30 error, %dn", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
透明通道模块流程
SDK提供将485和232串口作为透明通道,要将232串口作为透明通道使用,首先必须在232串口的配置信息中将工作模式选为透明通道,具体方法是调用接口NET_DVR_GetDVRConfig和NET_DVR_SetDVRConfig获取和设置参数NET_DVR_RS232CFG中的dwWorkMode值为透明通道。如果是485串口作为透明通道,这个步骤可以省略,调用NET_DVR_SerialStart建立透明通道和NET_DVR_SerialSend发送数据。整个过程完毕还需要断开透明通道〔NET_DVR_SerialStop〕等操作。
例如代码
以232串口建立透明通道为例
*include
*include
*include "Windows.h"
*include "HetSDK.h"
using namespace std;
//回调透传数据函数的外部实现
void CALLBACK g_fSerialDataCallBack(LONG lSerialHandle, char *pRecvDataBuffer, DWORD dwBufSize, DWORD dwUser)
. v .
. .
{
//…… 处理接收到的透传数据,pRecvDataBuffer中存放接收到的数据
}
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %dn", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//设置232为透明通道模式〔使用232透明通道时调用,485不需要〕
DWORD dwReturned = 0;
NET_DVR_RS232CFG_V30 struRS232Cfg;
memset(&struRS232Cfg, 0, sizeof(NET_DVR_RS232CFG_V30));
if (!NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_RS232CFG_V30, 0, &struRS232Cfg,
sizeof(NET_DVR_RS232CFG_V30), &dwReturned))
{
printf("NET_DVR_GET_RS232CFG_V30 error, %dn", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
Mode = 2; //设置232为透明通道模式;0:窄带传输,1:控制台,2:透明通道
if (!NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_RS232CFG_V30, 0, &(struRS232Cfg),
sizeof(NET_DVR_RS232CFG)))
{
printf("NET_DVR_SET_RS232CFG_V30 error, %dn", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//建立透明通道
LONG lTranHandle;
int iSelSerialIndex = 1; //1:232串口;2:485串口
lTranHandle = NET_DVR_SerialStart(lUserID, iSelSerialIndex, g_fSerialDataCallBack, lUserID);//设置回调函数获取透传数据
if (lTranHandle < 0)
{
printf("NET_DVR_SerialStart error, %dn", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//通过透明通道发送数据
LONG lSerialChan = 0;//使用485时该值有效,从1开场;232时设置为0
. v .
. .
char szSendBuf[1016] = {0};
if (!NET_DVR_SerialSend(lTranHandle, lSerialChan, szSendBuf, sizeof(szSendBuf))) //szSendBuf为发送数据的缓冲区
{
printf("NET_DVR_SerialSend error, %dn", NET_DVR_GetLastError());
NET_DVR_SerialStop(lTranHandle);
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//断开透明通道
NET_DVR_SerialStop(lTranHandle);
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
混合型DVR资源配置
混合型DVR设备如果要实现IPC接入功能那么需调用IP接入配置参数来进展资源的获取和重新分配。
客户端通过注册设备〔NET_DVR_Login_V30〕时获取的设备信息NET_DVR_DEVICEINFO_V30的模拟通道数〔byChanNum〕和数字通道数〔byIPChanNum〕得知该设备支持的最大模拟和数字通道数。
混合型DVR的数字报警输入和报警输出的通道是在数字音视频通道资源分配好后,由设备自动分配的,如果要对数字报警参数进展配置,首先要调用IP报警输入资源NET_DVR_IPALARMINCFG和IP报警输出资源NET_DVR_IPALARMOUTCFG中的配置构造来获取资源,然后在报警输入配置参数NET_DVR_ALARMINCFG_V30和报警输出配置参数NET_DVR_ALARMOUTCFG_V30中进展关联通道的配置。
模拟音视频通道对应的通道相关参数的通道号从起始通道号〔通过登录NET_DVR_Login_V30时设备返回的NET_DVR_DEVICEINFO_V30 可以得知〕到MAX_ANALOG_CHANNUM为止,IP资源对应的设备参数配置的通道号为MAX_ANALOG_CHANNUM+起始通道号到MAX_CHANNUM_V30+起始通道号。模拟报警输入的通道号是从0到MAX_ANALOG_ALARMIN-1,IP报警输入的通道号是从MAX_ANALOG_ALARMIN到MAX_ALARMIN_V30,报警输出和报警出入的相似。
设备音视频通道资源最大数是由当前设备的DSP处理能力决定的(详见DS-90xx设备相关说明):16路模拟视音频输入 + 8路普通IPC。
24路是最大的总通道数,这是一个总资源的概念;模拟视音频通道可以‘启用’或‘禁用’,‘禁用’一个模拟通道可以多增加一个普通IPC通道,但是最多只能增加16个普通IPC通道;一个720P的高清IPC通道占用2个普通IPC通道的资源。
例如代码
以混合型DVR的数字报警输入和通道图像参数的配置为例
//初始化SDK
NET_DVR_Init();
//注册设备
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
memset(&struDeviceInfo, 0, sizeof(NET_DVR_DEVICEINFO_V30));//存放设备参数的构造体
LONG lUserID = NET_DVR_Login_V30("172.0.0.100", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
if (NET_DVR_GetLastError() == NET_DVR_PASSWORD_ERROR)//用户名密码错误
{
…… //处理错误信息
. v .
. .
}
else if(NET_DVR_GetLastError() == NET_DVR_OVER_MAXLINK)//连接到DVR的客户端到达最大
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//获取IP报警资源
DWORD dwReturned = 0;
NET_DVR_IPALARMINCFG struIPAlarmInCfg;
memeset(&struIPAlarmInCfg, 0, sizeof(NET_DVR_IPALARMINCFG));
bIPRet = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPALARMINCFG, -1, &struIPAlarmInCfg,
sizeof(NET_DVR_IPALARMINCFG), &dwReturned);
//获取、设置报警输入信息
NET_DVR_ALARMINCFG_V30 m_struAlarmInCfg[MAX_ALARMIN_V30];//存放报警输入信息的构造体,MAX_ALARMIN_V30 为最大模拟报警输入数加最大数字报警输入数
for (i=0; i < MAX_ALARMIN_V30; i++)
{
if ((i>=MAX_ANALOG_ALARMIN &&
AlarmInInfo[i-MAX_ANALOG_ALARMIN].byIPID > 0)
//IP报警资源的下标索引加上MAX_ANALOG_ALARMIN对应的是报警输入配置构造的下标索引值
{
if (!NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_ALARMINCFG_V30, i,
&m_struAlarmInCfg[i], sizeof(NET_DVR_ALARMINCFG_V30), &dwReturned))
{
…… //获取报警输入信息失败
}
else
{
//获取报警输入信息成功,此处i>=MAX_ANALOG_ALARMIN时即为IP报警输入信息,i对应IP数字报警通道的通道号
m_struAlarmInCfg[i].byAlarmType = 0;//报警类型:0-常开,1-常闭
m_struAlarmInCfg[i].byAlarmInHandle = 1;//是否处理:0-不处理,1-处理
…… //其他报警参数的设置
NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_ALARMINCFG_V30, i, &(m_struAlarmInCfg[i]),
sizeof(NET_DVR_ALARMINCFG_V30));//设置报警输入信息
}
}
}
//IP报警输出的配置过程和报警输入的配置过程一样
//获取IP通道参数信息
DWORD dwReturned = 0;
NET_DVR_IPPARACFG IPAccessCfg;
memset(&IPAccessCfg, 0, sizeof(NET_DVR_IPPARACFG));
NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG, -1, &IPAccessCfg, sizeof(NET_DVR_IPPARACFG),
&dwReturned);
//设置IP通道配置信息
DWORD iIPChanIndex = 1; //IP资源的通道号,从0到MAX_IP_CHANNEL -1,加上MAX_ANALOG_CHANNUM对应的是通道相关参数的下标索引值
BYTE dwID = 2; //IP通道有效状态及对应IP设备资源;1- MAX_IP_DEVICE表示该通道被添加,0表示该通道被删除
ChanInfo[iIPChanIndex].byEnable = FALSE;
ChanInfo[iIPChanIndex].byIPID = (BYTE)dwID;
……//设置其他通道参数
NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_IPPARACFG, -1, &IPAccessCfg, sizeof(NET_DVR_IPPARACFG));
//获取IP通道相关参数(以获取IP通道图像参数为例)
. v .
. .
DWORD dwReturned = 0;
DWORD dwChanShow = iIPChanIndex + MAX_ANALOG_ALARMIN; //IP通道下标索引加MAX_ANALOG_ALARMIN为相对应的通道相关参数的下标索引
NET_DVR_PICCFG_V30 m_struPicCfg; //存放通道图像参数的构造体
memset(&m_struPicCfg, 0, sizeof(NET_DVR_PICCFG_V30));
NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_PICCFG_V30, dwChanShow, &m_struPicCfg,
sizeof(NET_DVR_PICCFG_V30), &dwReturned);
//设置IP通道图像参数
m_oFormat = 1; // 视频制式:1-NTSC,2-PAL
m_ChanName = 1; //预览的图象上是否显示通道名称:0-不显示,1-显示〔区域大小704*576〕
……//其他图像参数的设置
NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_PICCFG_V30, dwChanShow,
&m_struPicCfg,sizeof(NET_DVR_PICCFG_V30));
多路解码器模块流程
多路解码器的功能模块包括显示通道控制、参数配置、主动解码、被动解码、透明通道配置、获取设备状态信息和获取设备能力集模块。该模块的所有功能都需要先进展用户注册,NET_DVR_Login_V30接口返回的用户ID号作为其他功能接口的参数。
显示通道控制模块:显示通道各项参数的配置;音频开启关闭控制和子窗口缩放控制等。详细接口可见下文的接口定义中的“多路解码器〞的“显示通道配置和控制〞局部。
参数配置模块:主要完成对多路解码器的根本参数的配置功能,调用的接口为NET_DVR_GetDVRConfig和NET_DVR_SetDVRConfig,其中可配置的参数可见下文的接口定义中的“多路解码器〞的“参数配置〞局部。
主动解码模块:配置和获取多路解码器主动解码参数,对主动解码进展各种控制,包括起停动态解码;起停轮巡解码;按文件及按时间回放的控制;以及主动解码状态的获取、主动解码起停的总体控制;上传LOGO等功能。详细接口可见下文的接口定义中的“多路解码器〞的“主动解码〞局部。
被动解码模块:被动解码通道的启动解码、发送数据和停顿解码。详细接口可见下文的接口定义中的“多路解码器〞的“被动解码〞局部。
透明通道配置模块:配置透明通道的相关参数。详细接口可见下文的接口定义中的“多路解码器〞的“透明通道配置〞局部。
获取设备状态信息:通过NET_DVR_MatrixGetDeviceStatus接口获取设备通道的解码、报警输入、报警输出和语音对讲等状态信息。
获取设备能力集:通过NET_DVR_GetDeviceAbility接口获取设备的显示和解码能力等信息。
例如代码
//初始化SDK
NET_DVR_Init();
//注册设备
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
memset(&struDeviceInfo, 0, sizeof(NET_DVR_DEVICEINFO_V30));//存放设备参数的构造体
LONG lUserID = NET_DVR_Login_V30("172.0.0.100", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
if (NET_DVR_GetLastError() == NET_DVR_PASSWORD_ERROR)//用户名密码错误
{
…… //处理错误信息
}
else if(NET_DVR_GetLastError() == NET_DVR_OVER_MAXLINK)//连接到DVR的客户端到达最大
{
…… //处理错误信息
}
…… //处理其他类型错误信息
. v .
. .
}
//配置多路解码器
//获取多路解码器配置参数
DWORD dwReturned = 0;
NET_DVR_NETCFG_OTHER m_NetCFGOther;
if(!NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_NETCFG_OTHER, 0,&m_NetCFGOther,
sizeof(NET_DVR_NETCFG_OTHER), &dwReturned)))
{
if (NET_DVR_GetLastError() == NET_DVR_NOINIT)//未初始化
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//设置多路解码器参数(以设置主DNS为例)
char m_FirstDns[] = "192.168.0.2";
memcpy(m_DNSIP, m_fer(0), 16);
if(!NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_NETCFG_OTHER, 0,&m_NetCFGOther,
sizeof(NET_DVR_NETCFG_OTHER)))
{
if (NET_DVR_GetLastError() == NET_DVR_PARAMETER_ERROR)//参数错误
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//主动解码(包括动态解码和轮循解码)
//配置、获取解码器主动解码参数
int DecChanNum = 1;//解码通道号,此处假设通道号为1
NET_DVR_MATRIX_DEC_CHAN_STATUS m_DecChanStatus;
memset(&m_DecChanStatus, 0, sizeof(NET_DVR_MATRIX_DEC_CHAN_STATUS));
if(!NET_DVR_MatrixGetDecChanStatus(lUserID, DecChanNum, &m_DecChanStatus)) //获取解码通道状态
{
…… //出错处理
}
NET_DVR_MATRIX_DEC_CHAN_INFO m_DecChanInfo;
memset(&m_DecChanInfo, 0, sizeof(NET_DVR_MATRIX_DEC_CHAN_INFO));
if(!NET_DVR_MatrixGetDecChanInfo(lUserID, DecChanNum, &m_DecChanInfo[index])) //获取解码通道信息
{
…… //出错处理
}
DWORD dec = 0;
if(!NET_DVR_MatrixGetDecChanEnable(lUserID, DecChanNum, &dec)) //获取解码通道开关
{
…… //出错处理
}
dec = 1; //设置解码通道为开;0表示关闭,1表示翻开
if(!NET_DVR_MatrixSetDecChanEnable(lUserID, DecChanNum, dwEnable)) //设置解码通道开关,如果设置为关,通道将停顿解码
{
…… //出错处理
}
//动态解码
NET_DVR_PU_STREAM_CFG dt;
nel = "172.0.0.100";//设备IP地址
. v .
. .
d = 0; //是否启用流媒体效劳器取流:0-不启用,非0-启用
…… //设置其他动态解码参数
if(!NET_DVR_MatrixStartDynamic_V30(lUserID, DecChanNum, &dt)) //启动动态解码
{
CString tmp;
("Error: NET_DVR_MatrixStartDynamic = %dn", NET_DVR_GetLastError());//获取错误码
AfxMessageBox(tmp);
}
if(!NET_DVR_MatrixStopDynamic(lUserID, DecChanNum)) //停顿动态解码
{
CString tmp;
("Error: NET_DVR_MatrixStartDynamic = %dn", NET_DVR_GetLastError());//获取错误码
AfxMessageBox(tmp);
}
//轮巡解码
NET_DVR_MATRIX_LOOP_DECINFO m_MatLoopDec;
memset(&m_MatLoopDec, 0, sizeof(NET_DVR_MATRIX_LOOP_DECINFO));
NET_DVR_MatrixGetLoopDecChanInfo(lUserID, DecChanNum, &m_MatLoopDec); //获取轮巡解码通道参数
CString m_DVRIP = "172.0.0.100";
sprintf(m_, "%s", m_DVRIP);//轮巡解码设备IP地址
…… //其他轮巡解码参数的设置
NET_DVR_MatrixSetLoopDecChanInfo(lUserID, DecChanNum, &m_MatLoopDec); //设置轮巡解码通道参数
DWORD chanNum = 0;
NET_DVR_MatrixGetLoopDecChanEnable(lUserID, DecChanNum, &chanNum); //获取当前通道解码开关,返回值chanNum为0表示关闭,1表示翻开
chanNum = 1; //设置解码开关为开
NET_DVR_MatrixSetLoopDecChanEnable(lUserID, DecChanNum, chanNum); //当把当前正在轮循的解码通道轮巡开关设置为关时,该解码通道停顿循环,转为动态解码
NET_DVR_MatrixGetLoopDecEnable(lUserID, &chanNum); //获取所有通道的解码开关,按位表示,0表示关闭,1表示翻开
//解码设备远程回放文件
NET_DVR_MATRIX_DEC_REMOTE_PLAY m_struPlay;
m_rt = m_PlayBackPort;
m_nel = (BYTE)m_PlayBackChan;
…… //远程回放文件参数
NET_DVR_MatrixSetRemotePlay(lUserID, DecChanNum, &m_struPlay); //设置解码器远程回放文件配置
NET_DVR_MatrixSetRemotePlayControl(lUserID, DecChanNum, NET_DVR_PLAYSTART, 0, NULL); //开场解码器回放远程文件
NET_DVR_MatrixSetRemotePlayControl(lUserID, DecChanNum, NET_DVR_PLAYSTARTAUDIO, 0, NULL);//翻开声音
NET_DVR_MatrixSetRemotePlayControl(lUserID, DecChanNum, …, 0, NULL);//其他回放控制
NET_DVR_MATRIX_DEC_REMOTE_PLAY_STATUS m_struState;
NET_DVR_MatrixGetRemotePlayStatus(lUserID, DecChanNum, &m_struState); //获取回放状态
//被动解码
DWORD m_PassivePort = 8000;
LONG lPassiveModeHandle = -1; //被动解码句柄
NET_DVR_MATRIX_PASSIVEMODE m_PassiveMode;
m_vePort = m_PassivePort;//UDP时的端口号,TCP时默认为8000
…… //被动解码参数
lPassiveModeHandle = NET_DVR_MatrixStartPassiveDecode(lUserID, DecChanNum, &m_PassiveMode); //启动多路解码器被动解码
NET_DVR_MatrixSendData(lPassiveModeHandle, pSendBuf, dwBufSize);//向解码器发送数据,pSendBuf为发送数据缓冲区,dwBufSize为数据大小
NET_DVR_MatrixStopPassiveDecode(lPassiveModeHandle); //停顿多路解码器被动解码
//获取多路解码器解码显示能力
NET_DVR_MATRIX_ABILITY m_matrixability;
. v .
. .
NET_DVR_GetDeviceAbility(lUserID, MATRIXDECODER_ABILITY, NULL, 0, (char*)&m_matrixability,
sizeof(NET_DVR_MATRIX_ABILITY));
智能设备功能模块流程
智能设备功能模块包括参数配置、智能信息DSP叠加配置、重启智能库、智能结果报警和获取设备能力集等功能。该模块的所有功能都需要先进展用户注册,NET_DVR_Login_V30接口返回的用户ID号作为其他功能接口的参数。
参数配置:主要完成对智能的根本参数的配置功能,调用的接口为NET_DVR_GetDVRConfig和NET_DVR_SetDVRConfig,其中可配置的参数可见下文的接口定义中的“智能设备功能〞局部。
智能信息DSP叠加配置:编码或者抓图时是否叠加智能信息的参数配置,调用接口为NET_DVR_GetVCADrawMode和NET_DVR_SetVCADrawMode。
重启智能库:在切换场景的情况需要重启智能库,如转动镜头,详见接口NET_VCA_RestartLib。
智能结果报警:通过“布防〞或者“监听〞报警的方式上传智能分析结果。详见下文的接口定义中的“布防、撤防〞和“监听报警〞局部。
获取设备能力集:通过NET_DVR_GetDeviceAbility接口获取智能设备能力信息。
标定校验:通过NET_DVR_VerifyCalibration接口标定校验。
例如代码
以行为分析参数(NET_DVR_VerifyCalibration)的配置为例
//初始化SDK
NET_DVR_Init();
//注册设备
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
memset(&struDeviceInfo, 0, sizeof(NET_DVR_DEVICEINFO_V30));//存放设备参数的构造体
LONG lUserID = NET_DVR_Login_V30("172.0.0.100", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
if (NET_DVR_GetLastError() == NET_DVR_PASSWORD_ERROR)//用户名密码错误
{
…… //处理错误信息
}
else if(NET_DVR_GetLastError() == NET_DVR_OVER_MAXLINK)//连接到DVR的客户端到达最大
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//获取行为分析配置参数
LONG m_iVcaChannel = 1;// 智能通道号
NET_VCA_RULECFG m_struRuleCfg; //存放智能信息构造体
memset(&m_struRuleCfg, 0, sizeof(NET_VCA_RULECFG));
DWORD dwReturned = 0;
if(!NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_RULECFG, m_iVcaChannel, &m_struRuleCfg,
sizeof(NET_VCA_RULECFG), &dwReturned))
{
if (NET_DVR_GetLastError() == NET_DVR_NOINIT)//未初始化
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//设置行为分析具体参数(需要修改)
. v .
. .
m_roType = 1; //报警时图片处理方式:0-不处理;非0-处理
m_ze = 0;//图片尺寸:0-CIF,1-QCIF,2-D1,3-UXGA,4-SVGA,5-HD720p,6-VGA,7-XVGA,8-HD900p
m_ality = 0;//图片质量系数:0-最好,1-较好,2-一般
…… //其他行为分析参数设置
if(!NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_RULECFG, m_iVcaChannel, &m_struRuleCfg,
sizeof(NET_VCA_RULECFG)))
{
if (NET_DVR_GetLastError() == NET_DVR_PARAMETER_ERROR)//参数错误
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//获取智能信息DSP叠加参数
NET_VCA_DRAW_MODE m_struVCADrawMode;
memset(&m_struVCADrawMode, 0 ,sizeof(NET_VCA_DRAW_MODE));
NET_DVR_GetVCADrawMode(lUserID, m_iVcaChannel, &m_struVCADrawMode);
//设置智能信息DSP叠加参数
m_ddRule = 0; //编码是否叠加规那么:0-不叠加,非0-叠加
m_ddTarget = 0; //编码是否叠加目标:0-不叠加,非0-叠加
m_icAddRule = 0; //抓图是否叠加目标:0-不叠加,非0-叠加
m_icAddTarget = 0; //抓图是否叠加规那么:0-不叠加,非0-叠加
NET_DVR_SetVCADrawMode(m_lServerID, m_iVcaChannel, &m_struVCADrawMode);
//重启智能库
NET_VCA_RestartLib(lUserID, m_iVcaChannel);
//获取智能设备的能力
NET_VCA_DEV_ABILITY m_struVcaDevAbility;
if(!NET_DVR_GetDeviceAbility(lUserID, VCA_DEV_ABILITY, NULL, 0, (char*)&m_struVcaDevAbility,
sizeof(NET_VCA_DEV_ABILITY)))
{
if (NET_DVR_GetLastError() == NET_DVR_NOSUPPORT)//设备不支持
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//获取智能通道的能力
NET_VCA_CHAN_IN_PARAM struVcaChanInpara;
ype = VCA_BEHAVIOR_BASE; //VCA_BEHAVIOR_BASE:根本版,VCA_BEHAVIOR_ADVANCE:高级版,VCA_BEHAVIOR_FULL:完整版
NET_VCA_BEHAVIOR_ABILITY m_struBehaviorAbility;
memset(&m_struBehaviorAbility, 0, sizeof(NET_VCA_BEHAVIOR_ABILITY));
NET_DVR_GetDeviceAbility(lUserID, VCA_CHAN_ABILITY, (char*)&struVcaChanInpara,
sizeof(NET_VCA_CHAN_IN_PARAM), (char*)&m_struBehaviorAbility, sizeof(NET_VCA_BEHAVIOR_ABILITY));
智能高清IPC功能模块流程
智能高清IPC功能模块包括参数配置、抓拍结果报警和获取设备能力集等功能。该模块的所有功能都需要先进展用户注册,NET_DVR_Login_V30接口返回的用户ID号作为其他功能接口的参数。
参数配置:主要完成对智能高清IPC的根本参数的配置功能,调用的接口为NET_DVR_GetDVRConfig和NET_DVR_SetDVRConfig。
手动触发报警:主要实现手动触发报警功能,调用的接口为NET_DVR_ManualSnap。
抓拍结果报警:通过“布防〞报警的方式上传结果。详见下文的接口定义中的“布防、撤防〞局部
. v .
. .
获取设备能力集:通过NET_DVR_GetDeviceAbility接口获取智能高清IPC能力信息。
例如代码
//初始化SDK
NET_DVR_Init();
//注册设备
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
memset(&struDeviceInfo, 0, sizeof(NET_DVR_DEVICEINFO_V30));//存放设备参数的构造体
LONG lUserID = NET_DVR_Login_V30("172.0.0.100", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
if (NET_DVR_GetLastError() == NET_DVR_PASSWORD_ERROR)//用户名密码错误
{
…… //处理错误信息
}
else if(NET_DVR_GetLastError() == NET_DVR_OVER_MAXLINK)//连接到DVR的客户端到达最大
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//获取智能高清IPC参数
LONG m_iChannel = 1;// 通道号
NET_DVR_CAMERAPARAMCFG m_struCfg; //参数构造体
memset(&m_struCfg, 0, sizeof(NET_DVR_CAMERAPARAMCFG));
DWORD dwReturned = 0;
if(!NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_CCDPARAMCFG, m_iChannel, &m_struCfg,
sizeof(NET_DVR_CAMERAPARAMCFG), &dwReturned))
{
if (NET_DVR_GetLastError() == NET_DVR_NOINIT)//未初始化
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//设置参数(需要修改)
m_Mode = 1; //0 自动光圈;1 手动光圈
m_rOutputMode = 0;//编码器fpga输出模式:0-直通;3-像素搬家
…… //其他参数设置
if(!NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_CCDPARAMCFG, m_iChannel, &m_struCfg,
sizeof(NET_DVR_CAMERAPARAMCFG)))
{
if (NET_DVR_GetLastError() == NET_DVR_PARAMETER_ERROR)//参数错误
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
//获取智能高清IPC能力
NET_DVR_SNAP_ABILITY m_struDevAbility;
if(!NET_DVR_GetDeviceAbility(lUserID, SNAPCAMERA_ABILITY, NULL, 0, (char*)&m_struDevAbility,
sizeof(NET_DVR_SNAP_ABILITY)))
{
if (NET_DVR_GetLastError() == NET_DVR_NOSUPPORT)//设备不支持
{
…… //处理错误信息
. v .
. .
}
…… //处理其他类型错误信息
}
//手动触发报警
NET_DVR_MANUALSNAP m_struManualSnap;
NET_DVR_PLATE_RESULT m_struResult;
memset(&m_struManualSnap, 0, sizeof(NET_DVR_MANUALSNAP));
memset(&m_struResult, 0, sizeof(NET_DVR_PLATE_RESULT));
m_r1 = new BYTE[2 * 1024 * 1024];
memset(m_r1, 0, 2 * 1024 * 1024);
m_r2 = new BYTE[1024 * 1024];
memset(m_r2, 0, 1024 * 1024);
if (!NET_DVR_ManualSnap(m_lServerID, &m_struManualSnap, &m_struResult))
{
if (NET_DVR_GetLastError() == NET_DVR_NOSUPPORT)//设备不支持
{
…… //处理错误信息
}
…… //处理其他类型错误信息
}
审讯机模块流程
审讯机功能模块包括参数配置、审讯文件查找和删除、审讯文件刻录、审讯文件上传、审讯中刻录和获取刻录状态等功能。该模块的所有功能都需要先进展用户注册,NET_DVR_Login_V30接口返回的用户ID号作为其他功能接口的参数。
参数配置模块:审讯机的根本参数的配置功能,调用的接口有NET_DVR_InquestGetCDRWScheme、NET_DVR_InquestSetCDRWScheme、NET_DVR_InquestGetPIPStatus、NET_DVR_InquestSetPIPStatus、NET_DVR_InquestCheckSecretKey、NET_DVR_InquestSetSecretKey、NET_DVR_InquestGetEncryptState、NET_DVR_InquestStreamEncrypt,其中可配置的参数可见下文的接口定义中的“审讯机功能接口〞的“参数配置〞局部。
审讯文件的查找和删除:调用的接口有NET_DVR_InquestFindFile、NET_DVR_InquestFindNextFile、NET_DVR_InquestFindClose、NET_DVR_InquestDeleteFile。
审讯文件刻录,调用的接口有NET_DVR_InquestCDWByFile、NET_DVR_BackupByTime、NET_DVR_GetBackupProgress、NET_DVR_StopBackup。
审讯文件上传,调用的接口有NET_DVR_InquestUploadFile、NET_DVR_InquestGetUploadState、NET_DVR_InquestUploadClose。
审讯中刻录,调用的接口有NET_DVR_InquestStartCDW、NET_DVR_InquestStopCDW。
获取刻录状态:通过NET_DVR_InquestGetCDWState接口获取状态信息。
推模式
推模式SDK应用架构
在应用开发中,推模式SDK有两个角色功能:
〔1〕作为注册效劳器使用,简称CMS;
〔2〕作为客户端使用〔具体为预览、回放、对讲、报警等功能模块〕,简称CU。设备端模块简称PU。
当SDK作为CMS使用时,由SDK模块担当Server角色,由设备端模块担当Client角色。设备端启动后,会主动注册SDK,建立连接后,SDK与设备之间通过该连接维护心跳,SDK通过该连接对设备进展配置和操作。
当SDK作为CU使用时,由设备端担当Server角色,由SDK模块担当Client角色。SDK设置预览、. v .
. .
回放、对讲或者报警请求回应回调函数,接收从设备端发过来的相关数据。
在上图的软件模块关系中,标注了软件各模块之间的关系及数据流。以预览命令为例:
①客户端发送预览命令给效劳器
②效劳器将该命令转发给设备
③设备响应该命令
④效劳器将该响应转发给客户端
⑤设备与客户端建立连接并发送视频传输请求
⑥客户端响应该请求
⑦设备正式开场传输码流
⑧维持码流心跳
注:①和④属于CU和CMS之间的交互,由客户自行开发实现,SDK不集成CU和CMS之间的交互接口。
推模式注册模块流程
这里描述的是SDK作为CMS使用时的注册管理功能及请求功能。其中参数配置功能、远程设备维护功能、透明通道功能、云台控制功能、文件日志查找功能等,在设备主动注册上来后,接口调用方式和客户端主动注册设备应用模式保持一致。
其中虚线框的流程是可选局部,不会影响其他流程和模块的功能使用。
当注册回调函数收到“离线〞消息时,SDK部不会删除设备信息,需上层调用NET_DVR_Logout_V30接口删除用户信息。
对于主动注册上来的设备的校验,由上层完成,如果校验通过,那么回调函数返回0,否那么不通过。
留神跳状态变化时,SDK才会发送消息通知上层。如从“正常〞->“异常〞,SDK部发送“异常〞消息;从“异常〞->“正常〞,SDK部发送“恢复〞消息。
请求函数:预览请求(NET_DVR_PreviewRequest),回放请求(NET_DVR_PlaybackRequest),对讲请求(NET_DVR_VoiceRequest),布防请求(NET_DVR_AlarmSetupRequest)
推模式预览模块流程
SDK作为CMS时的流程见注册模块,主要说明SDK作为CU使用时和设备之间的交互。
调用NET_DVR_SetPreviewResponseCallBack设置预览推码流回应回调函数,启动效劳器〔NET_DVR_StartServer〕,然后设置实时数据捕获函数〔NET_DVR_SetRealDataCallBack〕即可回调获取从设备主动推过来的码流数据。
推流时,SDK部只取流,不播放,播放及播放控制上层可直接使用公司播放库()进展播放控制。
预览播放请求统一由CMS进展控制〔NET_DVR_PreviewRequest〕,可以选择是否启用QOS。
云台控制模块主要是在开启预览的前提下实现对云台控制的操作功能,包括云台预置点、巡航、轨迹和透明云台等。相关接口有:NET_DVR_PTZControl、NET_DVR_PTZControl_EX、NET_DVR_PTZPreset、NET_DVR_PTZPreset_EX、NET_DVR_PTZCruise、NET_DVR_PTZCruise_EX、NET_DVR_PTZTrack、NET_DVR_PTZTrack_EX、NET_DVR_TransPTZ、NET_DVR_TransPTZ_EX。
推模式回放模块流程
回放分为按时间回放和按文件回放。文件查找在CMS进展,流程如下:
按文件回放或下载需要在CMS端通过查找录像文件功能先获取文件信息〔相关接口NET_DVR_FindFile_V30、NET_DVR_FindNextFile_V30、NET_DVR_FindClose_V30〕,然后根据获取得到的信息发送回放请求〔NET_DVR_PlaybackRequest〕。
. v .
. .
SDK作为的CU端,回放流程中SDK与设备之间的交互如以下列图所示。
回放实现:
设置回放码流回应回调函数〔NET_DVR_SetPlaybackResponseCallBack〕,启动效劳器〔NET_DVR_StartServer〕后,设置回放码流数据回调函数〔NET_DVR_SetPlayDataCallBack〕即可捕获设备端推过来的回放数据。
回放推流时,SDK部只取流,不播放,播放及播放控制上层可直接使用公司播放库()进展播放控制。
回放正常开场,必须调用控制接口〔NET_DVR_PlayBackControl〕的开场播放命令〔NET_DVR_PLAYSTART〕。
推模式对讲模块流程
设备端要开启进展对讲,需要SDK作为CMS进展对讲请求〔NET_DVR_VoiceRequest〕,具体流程见注册模块,
SDK作为CU使用时和设备之间的对讲交互如以下列图所示。
设置对讲回应回调函数〔NET_DVR_SetVoiceResponseCallBack〕,启动效劳器〔NET_DVR_StartServer〕即启动对讲。
每个客户端同时只支持一路对讲。
推模式报警模块流程
SDK作为CMS时的流程见注册模块,SDK作为CU使用时和设备之间的交互如以下列图所示。
报警布防方式:设置报警布防回应回调函数〔NET_DVR_SetAlarmSetupResponseCallBack〕,设置报警信息回调〔NET_DVR_SetDVRMessageCallBack_V30〕,启动效劳器〔NET_DVR_StartServer〕,在报警信息回调中可以获取设备上传的报警信息。
“监听〞报警方式:是指SDK不主动发起回应,只是在设定的端口上监听接收设备主动上传的报警信息。
推模式中,设备图片上传走的是监听流程。. v .
. .
构造体和接口定义
宏定义
序号 宏定义
1 MAX_NAMELEN
2 MAX_RIGHT
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
NAME_LEN
PASSWD_LEN
SERIALNO_LEN
MACADDR_LEN
MAX_ETHERNET
MAX_NETWORK_CARD
MAX_BOND_NUM
PATHNAME_LEN
MAX_TIMESEGMENT_V30
MAX_TIMESEGMENT
MAX_SHELTERNUM
MAX_DAYS
PHONENUMBER_LEN
MAX_DISKNUM_V30
MAX_DISKNUM
MAX_DISKNUM_V10
MAX_WINDOW_V30
MAX_WINDOW
MAX_VGA_V30
MAX_VGA
MAX_USERNUM_V30
宏定义值 含义
16 设备本地登录名长度
32 设备支持的权限〔1-21表示本地权限,13-32表示远程权限〕
32
16
48
6
2
4
2
128
8
4
4
7
32
33
16
8
32
16
4
1
32
用户名长度
密码长度
序列号长度
MAC地址长度
设备可配以太网络
设备可配最大网卡数目
设备可配BONDING网卡数
路径长度
V3.0以上版本支持的设备的最大时间段数
V3.0以下版本支持的设备的最大时间段数
V3.0以下版本支持的设备的最大遮挡区域数
每周的天数
PPPoE拨号最大长度
V3.0以上版本支持的设备的最大硬盘数,最多33个硬盘(包括16个置SATA硬盘、1个eSATA硬盘和16个NFS盘)
V3.0以下版本支持的设备的最大硬盘数
1.2版本之前版本
V3.0以上版本支持的设备的本地显示最大播放窗口数
V3.0以下版本支持的设备的本地显示最大播放窗口数
V3.0以上版本支持的设备的最大可接VGA数
V3.0以下版本支持的设备的最大可接VGA数
V3.0以上版本支持的设备的最大用户数
. v .
. .
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
MAX_USERNUM
MAX_EXCEPTIONNUM_V30
MAX_EXCEPTIONNUM
MAX_LINK
MAX_LINK_V30
MAX_DECPOOLNUM
MAX_DEUM
MAX_TRANSPARENTNUM
MAX_CYCLE_CHAN
MAX_CYCLE_CHAN_V30
MAX_DIRNAME_LENGTH
MAX_WINDOWS
MAX_STRINGNUM_V30
MAX_STRINGNUM
MAX_AUXOUT
MAX_HD_GROUP
MAX_NFS_DISK
IW_ESSID_MAX_SIZE
IW_ENCODING_TOKEN_MAX
MAX_SERIAL_NUM
MAX_DDNS_NUMS
MAX_DOMAIN_NAME
MAXPROGRESS
MAX_SERIALNUM
CARDNUM_LEN
MAX_VIDEOOUT_V30
MAX_VIDEOOUT
MAX_EMAIL_ADDR_LEN
MAX_EMAIL_PWD_LEN
MAX_PRESET_V30
16
32
16
6
128
4
4
2
16
64
80
16
8
4
4
16
8
32
32
64
10
64
100
2
20
4
2
48
32
256
V3.0以下版本支持的设备的最大用户数
V3.0以上版本支持的设备的最大异常处理数
V3.0以下版本支持的设备的最大异常处理数
V3.0以下版本支持的设备的单通道最大视频流连接数
V3.0以上版本支持的设备的单通道最大视频流连接数
单路解码器每个解码通道最大可循环解码数
单路解码器的最大解码通道数〔实际只有一个,其他三个保存〕
单路解码器可配置最大透明通道数
单路解码器最大轮巡通道数
最大轮巡通道数〔扩展〕
最大目录长度
最大窗口数
V3.0以上版本支持的设备的最大OSD字符行数
V3.0以下版本支持的设备的最大OSD字符行数
V3.0以下版本支持的设备的最大辅助输出数
V3.0以上版本支持的设备的最大硬盘组数
V3.0以下版本支持的设备的最大NFS硬盘数
WIFI的SSID号长度
WIFI密钥最大字节数
最多支持的透明通道路数
V3.0以上版本支持的设备最大可配DDNS数
最大域名长度
回放时的最大百分率
设备支持的串口数:1-232,2-485
卡号长度
V3.0以上版本支持的设备的视频输出数
V3.0以下版本支持的设备的视频输出数
最大EMAIL地址长度
最大EMAIL密码长度
V3.0以上版本支持的设备支持的云台预置点数
. v .
. .
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
MAX_TRACK_V30
MAX_CRUISE_V30
MAX_PRESET
MAX_TRACK
MAX_CRUISE
CRUISE_MAX_PRESET_NUMS
MAX_SERIAL_PORT
MAX_PREVIEW_MODE
MAX_MATRIXOUT
LOG_INFO_LEN
DESC_LEN
DESC_LEN_64
PTZ_PROTOCOL_NUM
MAX_AUDIO
MAX_AUDIO_V30
MAX_CHANNUM
MAX_ALARMIN
MAX_ALARMOUT
MAX_ANALOG_CHANNUM
MAX_ANALOG_ALARMOUT
MAX_ANALOG_ALARMIN
MAX_IP_DEVICE
MAX_IP_DEVICE_V40
MAX_IP_CHANNEL
MAX_IP_ALARMIN
MAX_IP_ALARMOUT
MAX_CHANNUM_V30
MAX_ALARMOUT_V30
MAX_ALARMIN_V30
MAX_RULE_NUM
256
256
128
128
128
32
8
8
16
11840
16
64
200
1
2
16
16
4
32
32
32
32
64
32
128
64
64
96
160
8
V3.0以上版本支持的设备支持的云台轨迹数
V3.0以上版本支持的设备支持的云台巡航数
V3.0以下版本支持的设备支持的云台预置点数
V3.0以下版本支持的设备支持的云台轨迹数
V3.0以下版本支持的设备支持的云台巡航数
一条巡航最多的巡航点
V3.0以上版本支持的设备支持232串口数
设备支持最大预览模式数目 1画面,4画面,9画面,16画面....
最大模拟矩阵输出个数
日志附加信息长度
云台描述字符串长度
描述字符串长度
V3.0以上版本支持的设备最大支持的云台协议数
V3.0以下版本支持的设备的语音对讲通道数
V3.0以上版本支持的设备的语音对讲通道数
V3.0以下版本支持的设备的最大通道数
V3.0以下版本支持的设备的最大报警输入数
V3.0以下版本支持的设备的最大报警输出数
最大32个模拟通道
最大32路模拟报警输出
最大32路模拟报警输入
允许接入的最大IP设备数
允许接入的最大IP设备数
允许参加的最多IP通道数
允许参加的最多报警输入数
允许参加的最多报警输出数
(MAX_ANALOG_CHANNUM + MAX_IP_CHANNEL)
(MAX_ANALOG_ALARMOUT + MAX_IP_ALARMOUT)
(MAX_ANALOG_ALARMIN + MAX_IP_ALARMIN)
最大规那么条数
. v .
. .
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
MAX_TIMESEGMENT_2
VCA_MAX_POLYGON_POINT_NUM
MAX_TARGET_NUM
MAX_VCA_CHAN
IW_ESSID_MAX_SIZE
WIFI_WEP_MAX_KEY_COUNT
WIFI_WEP_MAX_KEY_LENGTH
WIFI_WPA_PSK_MAX_KEY_LENGTH
WIFI_WPA_PSK_MIN_KEY_LENGTH
WIFI_MAX_AP_COUNT
NET_DVR_MAX_DISPREGION
MAX_DECODECHANNUM
MAX_DISPCHANNUM
MAX_NET_DISK
MAX_ATM_PROTOCOL_NUM
ATM_PROTOCOL_SORT
ATM_DESC_LEN
MAX_ACTION_TYPE
SEARCH_EVENT_INFO_LEN
MAX_MASK_REGION_NUM
MAX_CALIB_PT
MAX_RECT_NUM
MAX_RESOLUTIONNUM
MAX_LOOPPLANNUM
DECODE_TIMESEGMENT
MAX_RECORD_FILE_NUM
DESC_LEN_32
MAX_NODE_NUM
MAX_ABILITYTYPE_NUM
IPC_PROTOCOL_NUM
2
10
30
16
32
4
33
63
8
20
16
32
24
16
256
4
32
12
300
4
6
6
64
16
4
20
32
256
12
50
最大时间段数
检测区域最多支持10个点的多边形
最大目标个数
最大智能通道数
SSID的长度
最大密钥个数
最大密钥长度
加密字符的最大长度
加密字符的最小长度
无线AP的最大个数
每个显示通道最多可以显示的窗口
多路解码器最大解码通道数
多路解码器最大显示通道数
最大网络硬盘数
ATM最大协议数
ATM协议段数
ATM描述字符串长度
ATM自定义协议叠加交易行为最大行为个数
事件信息长度
最大屏蔽区域个数
最大标定点个数
最大矩形框个数
支持的最大分辨率数目
最大方案切换组数
方案解码每天时间段数
一次操作文件( 备份、删除或刻录)的最大数目
描述字长度
节点个数
最大能力项
IPC协议最大个数
. v .
. .
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
MAX_SADP_NUM
SOFTWARE_VERSION_LEN
MAX_LANERECT_NUM
MAX_FORTIFY_NUM
MAX_INTERVAL_NUM
MAX_CHJC_NUM
MAX_VL_NUM
MAX_LINE_SEG_NUM
MAX_SAMPLE_NUM
MAX_SIGNALLIGHT_NUM
SUPPORT_PD_NUM
SUPPORT_ARRAY_NUM
SUPPORT_VD_NUM
LABEL_NAME_LEN
LABEL_IDENTIFY_LEN
MAX_DEL_LABEL_IDENTIFY
MAX_PIC_EVENT_NUM
MAX_ALARMIN_CAPTURE
CARDNUM_LEN_V30
PICTURE_NAME
MAX_RECORD_PICTURE_NUM
CALIB_PT_NUM
MAX_REGION_NUM
MAX_LANE_NUM
MAX_AID_RULE
MAX_TPS_RULE
INQUEST_MESSAGE_LEN
INQUEST_MAX_ROOM_NUM
MAX_RESUME_SEGMENT
MAX_ALARMHOST_ALARMIN_NUM
256
48
5
10
4
3
5
8
5
6
16
8
128
40
64
20
32
16
40
64
50
4
8
8
8
8
44
2
2
512
搜索到设备最大数目
软件版本号长度
最大车牌识别区域数
最大布防个数
最大时间间隔个数
最大车辆省份简称字符个数
最大虚拟线圈个数
最大样本线个数
最大样本个数
最大信号灯个数
最大支持的物理磁盘个数
最大支持的阵列个数
最大支持的虚拟磁盘个数
录像标签名称的长度
标签标识的长度
删除的最大标签标识个数
事件抓图的事件类型个数
事件抓图报警输入个数
卡号的长度
图片名称的长度
最大备份图片数
智能交通事件标定个数
区域列表最大数目
最大车道数目
最大事件规那么数目
最大参数规那么数目
审讯重点标记信息长度
最大审讯室个数
支持同时恢复的片段数目
网络报警主机最大报警输入口数
. v .
. .
144
145
146
147
148
149
150
MAX_ALARMHOST_ALARMOUT_NUM
ALARMHOST_MAX_AUDIOOUT_NUM
ALARMHOST_MAX_ELECTROLOCK_NUM
ALARMHOST_MAX_MOBILEGATE_NUM
ALARMHOST_MAX_SIREN_NUM
MAX_DEVICE_PROTO_NUM
MAX_DEVICE_TYPE_NUM
512
32
32
32
8
256
256
网络报警主机最大报警输出口数
网络报警主机最大语音输出数
网络报警主机最大电锁数
网络报警主机最大移动门数
网络报警主机最大警号数目
网络报警主机协议类型个数
网络报警主机设备类型个数
. v .
. .
SDK初始化
NET_DVR_Init
初始化SDK,调用其他SDK函数的前提。
BOOL NET_DVR_Init( );
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError
以下是该接口可能返回的错误值
NET_DVR_NOERROR
NET_DVR_ALLOC_RESOURCE_ERROR
NET_DVR_GETLOCALIPANDMACFAIL
See Also
NET_DVR_Cleanup
0
41
53
没有错误。
SDK资源分配错误。
获得本地PC的IP地址或物理地址失败。
NET_DVR_Cleanup
释放SDK资源,在完毕之前最后调用。
BOOL NET_DVR_Cleanup();
Return Values
TRUE表示成功,FALSE表示失败,获取错误码调用NET_DVR_GetLastError
以下是该接口可能返回的错误值
NET_DVR_NOERROR 0 没有错误。
See Also
NET_DVR_Init
NET_DVR_DrawAreaInit
初始化窗口,该接口为Linux下专有接口。
BOOL NET_DVR_DrawAreaInit(
INITINFO InitInfo
);
Parameters
InitInfo
[in] 初始化信息
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError
以下是该接口可能返回的错误值
NET_DVR_NOERROR 0 没有错误。
NET_DVR_NOINIT 3 SDK未初始化。
NET_DVR_PLAYERFAILED
NET_DVR_LOADPLAYERSDKPROC_ERROR
Remarks
51
65
调用播放库中某个函数失败。
找不到Player Sdk中某个函数入口。
. v .
. .
当在Linux下预览前需要先调用此接口进展STL窗口的初始化。
See Also
INITINFO NET_DVR_DrawAreaRelease
NET_DVR_DrawAreaRelease
释放窗口资源,该接口为Linux下专用接口。
BOOL NET_DVR_DrawAreaRelease(
);
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError
以下是该接口可能返回的错误值
NET_DVR_NOERROR 0 没有错误。
NET_DVR_NOINIT
NET_DVR_ORDER_ERROR
NET_DVR_LOADPLAYERSDKPROC_ERROR
See Also
NET_DVR_DrawAreaInit
3
12
65
SDK未初始化。
调用次序错误。
找不到Player Sdk中某个函数入口。
NET_DVR_SetConnectTime
设置网络连接超时时间和连接尝试次数。
BOOL NET_DVR_SetConnectTime(
DWORD dwWaitTime,
DWORD dwTryTimes
);
Parameters
dwWaitTime
[in] 超时时间,单位毫秒,取值围[300,75000],实际最大超时时间因系统的connect超时时间而不同。
dwTryTimes
[in] 连接尝试次数〔保存〕
Return Values
TRUE表示成功,FALSE表示失败,获取错误码调用NET_DVR_GetLastError
以下是该接口可能返回的错误值
NET_DVR_NOERROR 0 没有错误。
NET_DVR_NOINIT 3 SDK未初始化。
Remarks
SDK默认建立连接的超时时间为3秒。SDK4.0及以后版本中当设置的超时时间超过或低于限制的值时接口不返回失败,将取最接近的上下限限制值作为实际的超时时间。
NET_DVR_SetReconnect
设置重连功能。
BOOL NET_DVR_SetReconnect(
DWORD dwInterval,
BOOL bEnableRecon
);
. v .
. .
Parameters
dwInterval
[in] 重连间隔,单位:毫秒
bEnableRecon
[in] 是否重连,0-不重连,1-重连,参数默认值为1
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError
以下是该接口可能返回的错误值
NET_DVR_NOERROR 0 没有错误。
NET_DVR_NOINIT 3 SDK未初始化。
Remarks
该接口可以同时控制预览、透明通道和布防的重连功能。不调用该接口时,SDK默认启动预览、透明通道和布防的重连功能,重连时间间隔为5秒。
NET_DVR_GetDVRIPByResolveSvr_EX
通过解析效劳器,获取设备的动态IP地址和端口号。
BOOL NET_DVR_GetDVRIPByResolveSvr_EX(
char *sServerIP,
WORD wServerPort,
BYTE *sDVRName,
WORD wDVRNameLen,
BYTE *sDVRSerialNumber,
WORD wDVRSerialLen,
char *sGetIP,
DWORD *dwPort
);
Parameters
sServerIP
[in] 解析效劳器的IP地址
wServerPort
[in] 解析效劳器的端口号,我们提供的解析效劳器端口号为7071
sDVRName
[in] 设备名称
wDVRNameLen
[in] 设备名称的长度
sDVRSerialNumber
[in] 设备的序列号
wDVRSerialLen
[in] 设备序列号的长度
sGetIP
[out] 获取到的设备IP地址指针
dwPort
[out] 获取到的设备端口号指针
Return Values
TRUE表示成功,FALSE表示失败,获取错误码调用NET_DVR_GetLastError
以下是该接口可能返回的错误值
. v .
. .
NET_DVR_NOERROR
NET_DVR_NOINIT
0
3
没有错误。
SDK未初始化。
连接设备失败。设备不在线或网络原因引起的连接NET_DVR_NETWORK_FAIL_CONNECT 7
超时等。
NET_DVR_NETWORK_SEND_ERROR 8 向设备发送失败。
NET_DVR_NETWORK_RECV_ERROR 9 从设备接收数据失败。
NET_DVR_NETWORK_RECV_TIMEOUT 10 从设备接收数据超时。
NET_DVR_ORDER_ERROR 12 调用次序错误。
NET_DVR_PARAMETER_ERROR
NET_DVR_ALLOC_RESOURCE_ERROR
NET_DVR_NOENOUGH_BUF
NET_DVR_CREATESOCKET_ERROR
NET_DVR_USERNOTEXIST
NET_DVR_BINDSOCKET_ERROR
NET_DVR_SOCKETCLOSE_ERROR
参数错误。SDK接口中给入的输入或输出参数为空。
41 SDK资源分配错误。
缓冲区太小。接收设备数据的缓冲区或存放图片缓43
冲区缺乏。
44 创立SOCKET出错。
17
47 用户不存在。注册的用户ID已注销或不可用。
72 绑定套接字失败。
socket连接中断,此错误通常是由于连接中断或目73
的地不可达。
. v .
版权声明:本文标题:数字录像机程序开发文档 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1702769162h430127.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论