哪位大牛用海康的设备,开发过“注册回调函数”??

zhgwbzhd 2018-09-25 11:50:38
注册回调函数,接收设备报警消息等。

BOOL NET_DVR_SetDVRMessageCallBack_V31(MSGCallBack_V31 fMessageCallBack, void *pUser);

fMessageCallBack [in] 回调函数
pUser [in] 用户数据

这个是回调函数的说明,关键是这个回调函数怎么搞呢?
Callback Function typedef BOOL(CALLBACK *MSGCallBack_V31)( LONG lCommand,NET_DVR_ALARMER *pAlarmer, char pAlarmInfo, DWORD dwBufLen,void *pUser);


我目前采用动态库的方式调用,该怎么处理呢?
谢谢各位大牛了。

//以下是注册的样例代码
FARPROC proc;
BOOL B_value;

proc = GetProcAddress(HCNetSDK_DLL_ins,"NET_DVR_Login_V40");//获取该函数的地址
if(proc != NULL)
{
//动态库调用
typedef LONG (*FUNC)(LPNET_DVR_USER_LOGIN_INFO,LPNET_DVR_DEVICEINFO_V40);
FUNC My_Func = (FUNC)proc;
MY_UserID = My_Func(pLoginInfo,lpDeviceInfo);
if(MY_UserID >= 0)
B_value = TRUE;
}
...全文
1194 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35171751 2021-01-13
  • 打赏
  • 举报
回复
调用的其他接口没问题, 调用获取实时流时报错 Error looking up function 'NET_DVR_SetRealDataCallback': ÕҲ»µ½ָ¶¨µ 什么原因呢?
要减肥的胖子 2019-12-04
  • 打赏
  • 举报
回复
请问设置回调函数和你注册设备id怎么关联 ,比如说我有两个设备都注册了,回调函数只回调后一个注册设备的信息,请问怎么解决
zhgwbzhd 2018-09-27
  • 打赏
  • 举报
回复
您说的方式,我试了一下,好像真的比较方便。
另外,我原来出错的原因是弄错了参数,这下可以了。
draculamx 2018-09-26
  • 打赏
  • 举报
回复
你用c++ builder,所以海康的SDK你要用动态库的方式调用??
这样很麻烦的,凡是你用到的函数,都要注册一遍。。。
你干脆把它的LIB转换成c++ builder的格式就行了

海康,大华,我都做过二次开发,项目还不少。。不过我用的VC
这里是你要的回调函数的示例代码:


示例一:布防报警


#include <stdio.h>
#include <iostream>
#include "Windows.h"
#include "HCNetSDK.h"
using namespace std;

void CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
{
int i;
NET_DVR_ALARMINFO struAlarmInfo;
memcpy(&struAlarmInfo, pAlarmInfo, sizeof(NET_DVR_ALARMINFO));
switch(lCommand)
{
case COMM_ALARM:
{
switch (struAlarmInfo.dwAlarmType)
{
case 3: //移动侦测报警
for (i=0; i<16; i++) //#define MAX_CHANNUM 16 //最大通道数
{
if (struAlarmInfo.dwChannel[i] == 1)
{
printf("发生移动侦测报警的通道号 %d\n", i+1);
}
}
break;
default:
break;
}
}
break;
default:
break;
}
}

void 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.0.0.64"); //设备IP地址
struLoginInfo.wPort = 8000; //设备服务端口
strcpy(struLoginInfo.sUserName, "admin"); //设备登录用户名
strcpy(struLoginInfo.sPassword, "abcd1234"); //设备登录密码

//设备信息, 输出参数
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;
}

//设置报警回调函数
NET_DVR_SetDVRMessageCallBack_V30(MessageCallback, NULL);

//启用布防
LONG lHandle;

//布防参数
NET_DVR_SETUPALARM_PARAM struAlarmParam={0};
struAlarmParam.dwSize=sizeof(struAlarmParam);
struAlarmParam.byAlarmInfoType=0;
//设备是否支持新的报警信息通过登录返回的NET_DVR_DEVICEINFO_V30中参数bySupport1 & 0x80判断

lHandle = NET_DVR_SetupAlarmChan_V41(lUserID, & struAlarmParam);
if (lHandle < 0)
{
printf("NET_DVR_SetupAlarmChan_V41 error, %d\n", 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, %d\n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}

//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}




示例二:监听报警


#include <stdio.h>
#include <iostream>
#include "Windows.h"
#include "HCNetSDK.h"
using namespace std;

void CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
{
int i;
NET_DVR_ALARMINFO struAlarmInfo;
memcpy(&struAlarmInfo, pAlarmInfo, sizeof(NET_DVR_ALARMINFO));
switch(lCommand)
{
case COMM_ALARM:
{
switch (struAlarmInfo.dwAlarmType)
{
case 3: //移动侦测报警
for (i=0; i<16; i++) //#define MAX_CHANNUM 16 //最大通道数
{
if (struAlarmInfo.dwChannel[i] == 1)
{
printf("发生移动侦测报警的通道号 %d\n", i+1);
}
}
break;
default:
break;
}
}
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, %d\n", 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_StartListen_V30 error, %d\n", 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, %d\n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}

//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}



zhgwbzhd 2018-09-26
  • 打赏
  • 举报
回复
谢谢,您说的方式我这就试试。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧