栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【163】VS2022调试通过海康明眸门禁报警事件中的报警布防C++示例代码

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【163】VS2022调试通过海康明眸门禁报警事件中的报警布防C++示例代码

海康文档链接: 海康文档链接

下面是我根据海康文档中明眸门禁 => 报警事件 => 报警布防 中的示例C++代码,放入VS2022开发工具中,调试C++代码通过后的代码:

#include 
#include 
#include "Windows.h"
#include "HCNetSDK.h"
using namespace std;

int iNum = 0; //已保存的图片个数
void CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER* pAlarmer, char* pAlarmInfo, DWORD dwBufLen, void* pUser)
{
	switch (lCommand)
	{
	case COMM_ALARM_ACS: //门禁主机报警信息
	{
		NET_DVR_ACS_ALARM_INFO struAcsAlarmInfo = { 0 };
		memcpy(&struAcsAlarmInfo, pAlarmInfo, sizeof(NET_DVR_ACS_ALARM_INFO));
		printf("门禁主机报警信息[0x5002]: struTim{%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d}, dwMajor[0x%x], dwMinor[0x%x], byCardNo[%s], dwEmployeeNo[%d], dwCardReaderNo[%d]n",
			struAcsAlarmInfo.struTime.dwYear, struAcsAlarmInfo.struTime.dwMonth, struAcsAlarmInfo.struTime.dwDay, struAcsAlarmInfo.struTime.dwHour,
			struAcsAlarmInfo.struTime.dwMinute, struAcsAlarmInfo.struTime.dwSecond, struAcsAlarmInfo.dwMajor, struAcsAlarmInfo.dwMinor,
			struAcsAlarmInfo.struAcsEventInfo.byCardNo, struAcsAlarmInfo.struAcsEventInfo.dwEmployeeNo, struAcsAlarmInfo.struAcsEventInfo.dwCardReaderNo);

		//扩展信息,包含以人为中心下发人员触发事件中的工号参数
		if (struAcsAlarmInfo.byAcsEventInfoExtend == 1)
		{
			NET_DVR_ACS_EVENT_INFO_EXTEND  struAcsEventInfoExtend = { 0 };
			memset(&struAcsEventInfoExtend, 0, sizeof(struAcsEventInfoExtend));
			memcpy(&struAcsEventInfoExtend, struAcsAlarmInfo.pAcsEventInfoExtend, sizeof(struAcsEventInfoExtend));

			printf("门禁扩展事件信息: dwFrontSerialNo[%d], byUserType[%d], byEmployeeNo[%s]n", struAcsEventInfoExtend.dwFrontSerialNo,
				struAcsEventInfoExtend.byUserType, (char*)struAcsEventInfoExtend.byEmployeeNo);
		}

		//扩展信息,包含人体测温温度数据
		if (struAcsAlarmInfo.byAcsEventInfoExtendV20 == 1)
		{
			NET_DVR_ACS_EVENT_INFO_EXTEND_V20 struAcsEventInfoExtendV20 = { 0 };
			memcpy(&struAcsEventInfoExtendV20, struAcsAlarmInfo.pAcsEventInfoExtendV20, sizeof(struAcsEventInfoExtendV20));

			if (struAcsEventInfoExtendV20.byRemoteCheck != 0)
			{
				//需要远程核验
				printf("remote check:%dn", struAcsEventInfoExtendV20.byRemoteCheck);
			}
			if (struAcsEventInfoExtendV20.fCurrTemperature != 0)
			{
				printf("temperature[%f]fX[%f]fY[%f]byThermometryUnit[%d]byIsAbnomalTemperature[%d]n",
					struAcsEventInfoExtendV20.fCurrTemperature, struAcsEventInfoExtendV20.struRegionCoordinates.fX,
					struAcsEventInfoExtendV20.struRegionCoordinates.fY, struAcsEventInfoExtendV20.byThermometryUnit,
					struAcsEventInfoExtendV20.byIsAbnomalTemperature);
			}
		}

		//保存报警抓拍图片
		if (struAcsAlarmInfo.dwPicDataLen > 0 && struAcsAlarmInfo.pPicData != NULL)
		{
			char cFilename[256] = { 0 };

			char chTime[128];
			sprintf_s(chTime, "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d", struAcsAlarmInfo.struTime.dwYear, struAcsAlarmInfo.struTime.dwMonth,
				struAcsAlarmInfo.struTime.dwDay, struAcsAlarmInfo.struTime.dwHour, struAcsAlarmInfo.struTime.dwMinute,
				struAcsAlarmInfo.struTime.dwSecond);

			sprintf_s(cFilename, "COMM_ALARM_ACS_CapPic[%d][%s].jpg", pAlarmer->lUserID, chTime);
			FILE *fSnapPicPlate;
			fopen_s(&fSnapPicPlate, cFilename, "wb");
			fwrite(struAcsAlarmInfo.pPicData, struAcsAlarmInfo.dwPicDataLen, 1, fSnapPicPlate);
			fclose(fSnapPicPlate);
			iNum++;
		}
	}
	break;
	case COMM_ID_INFO_ALARM: //门禁主机报警信息 - 身份证
	{
		NET_DVR_ID_CARD_INFO_ALARM struIDCardInfo = { 0 };
		memcpy(&struIDCardInfo, pAlarmInfo, sizeof(NET_DVR_ID_CARD_INFO_ALARM));
		printf("门禁身份证刷卡信息[0x5200]: struTim{%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d}, dwMajor[0x%x], dwMinor[0x%x], byName[%s], byIDNum[%s], dwCardReaderNo[%d]n",
			struIDCardInfo.struSwipeTime.wYear, struIDCardInfo.struSwipeTime.byMonth, struIDCardInfo.struSwipeTime.byDay, struIDCardInfo.struSwipeTime.byHour,
			struIDCardInfo.struSwipeTime.byMinute, struIDCardInfo.struSwipeTime.bySecond, struIDCardInfo.dwMajor, struIDCardInfo.dwMinor,
			(char*)struIDCardInfo.struIDCardCfg.byName, (char*)struIDCardInfo.struIDCardCfg.byIDNum, struIDCardInfo.dwCardReaderNo);

		//扩展信息,包含人体测温温度数据
		if (struIDCardInfo.byIDCardInfoExtend == 1)
		{
			NET_DVR_ID_CARD_INFO_EXTEND struIDCardExtendV20 = { 0 };
			memcpy(&struIDCardExtendV20, struIDCardInfo.pIDCardInfoExtend, sizeof(struIDCardExtendV20));

			if (struIDCardExtendV20.byRemoteCheck != 0)
			{
				//需要远程核验
				printf("remote check:%dn", struIDCardExtendV20.byRemoteCheck);
			}
			if (struIDCardExtendV20.fCurrTemperature != 0)
			{
				printf("temperature[%f]fX[%f]fY[%f]byThermometryUnit[%d]byIsAbnomalTemperature[%d]n",
					struIDCardExtendV20.fCurrTemperature, struIDCardExtendV20.struRegionCoordinates.fX,
					struIDCardExtendV20.struRegionCoordinates.fY, struIDCardExtendV20.byThermometryUnit,
					struIDCardExtendV20.byIsAbnomalTemperature);
			}
		}

		//保存身份证图片数据大小
		if (struIDCardInfo.dwPicDataLen > 0 && struIDCardInfo.pPicData != NULL)
		{
			char cCardFilename[256] = { 0 };

			char chTime[128];
			sprintf_s(chTime, "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d", struIDCardInfo.struSwipeTime.wYear, struIDCardInfo.struSwipeTime.byMonth,
				struIDCardInfo.struSwipeTime.byDay, struIDCardInfo.struSwipeTime.byHour,
				struIDCardInfo.struSwipeTime.byMinute, struIDCardInfo.struSwipeTime.bySecond);

			sprintf_s(cCardFilename, "COMM_ID_INFO_ALARM_IDCardPic[%d][%s].jpg", pAlarmer->lUserID, chTime);

			FILE* fSnapPicPlate;
			fopen_s(&fSnapPicPlate, cCardFilename, "wb");
			fwrite(struIDCardInfo.pPicData, struIDCardInfo.dwPicDataLen, 1, fSnapPicPlate);
			fclose(fSnapPicPlate);
			iNum++;
		}

		//保存抓拍图片数据大小
		if (struIDCardInfo.dwCapturePicDataLen > 0 && struIDCardInfo.pCapturePicData != NULL)
		{
			char cFilename[256] = { 0 };

			char chTime[128];
			sprintf_s(chTime, "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d", struIDCardInfo.struSwipeTime.wYear, struIDCardInfo.struSwipeTime.byMonth,
				struIDCardInfo.struSwipeTime.byDay, struIDCardInfo.struSwipeTime.byHour,
				struIDCardInfo.struSwipeTime.byMinute, struIDCardInfo.struSwipeTime.bySecond);

			sprintf_s(cFilename, "COMM_ID_INFO_ALARM_CapPic[%d][%s].jpg", pAlarmer->lUserID, chTime);

			FILE* fSnapPicPlate;
			fopen_s(&fSnapPicPlate, cFilename, "wb");
			fwrite(struIDCardInfo.pCapturePicData, struIDCardInfo.dwCapturePicDataLen, 1, fSnapPicPlate);
			fclose(fSnapPicPlate);
			iNum++;
		}
	}
	break;
	default:
		printf("其他报警,报警信息类型: %dn", lCommand);
		break;
	}

	return;
}

int main(int argc, char* argv[]) {
	cout << "The program starts." << endl;
	if (argc < 2) {
		cout << "NoIP" << endl;
		return 0;
	}
	char* ip = argv[1];
	cout << ip << endl;

	//---------------------------------------
	// 初始化
	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_s(struLoginInfo.sDeviceAddress, ip); //设备IP地址
	struLoginInfo.wPort = 8000; //设备服务端口
	strcpy_s(struLoginInfo.sUserName, "yourusername"); //设备登录用户名
	strcpy_s(struLoginInfo.sPassword, "yourpassword"); //设备登录密码

	//设备信息, 输出参数
	NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = { 0 };

	lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
	if (lUserID < 0)
	{
		printf("Login failed, error code: %dn", NET_DVR_GetLastError());
		NET_DVR_Cleanup();
		return 0;
	}

	//设备登录成功,获取设备字符集编码类型
	printf("Login successfully, byCharEncodeType: %dn", struDeviceInfoV40.byCharEncodeType);


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

	//启用布防
	LONG lHandle;
	NET_DVR_SETUPALARM_PARAM  struAlarmParam = { 0 };
	struAlarmParam.dwSize = sizeof(struAlarmParam);
	//不需要设置其他报警布防参数,不支持

	lHandle = NET_DVR_SetupAlarmChan_V41(lUserID, &struAlarmParam);
	if (lHandle < 0)
	{
		printf("NET_DVR_SetupAlarmChan_V41 failed, error code:  %dn", NET_DVR_GetLastError());
		NET_DVR_Logout(lUserID);
		NET_DVR_Cleanup();
		return 0;
	}

	//事件信息在回调函数里面获取
	//控制台输入q退出程序,否则一直运行
	char c = 0;
	while ('q' != c)
	{
		printf("input 'q' to quitn");
		printf("input: ");
		scanf_s("%c", &c);
	}

//	Sleep(50000);

	//---------------------------------------
	//退出程序

	//撤销布防上传通道
	if (!NET_DVR_CloseAlarmChan_V30(lHandle))
	{
		printf("NET_DVR_CloseAlarmChan_V30 failed, error code: %dn", NET_DVR_GetLastError());
		NET_DVR_Logout(lUserID);
		NET_DVR_Cleanup();
		return 0;
	}

	//注销用户
	NET_DVR_Logout(lUserID);

	//释放SDK资源
	NET_DVR_Cleanup();
	return 0;
}

依赖引入方法参考:【160】VS2022调试通过海康摄像头烟火识别SDK

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873501.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号