Java实现海康威视4200事件读取
大约 10 分钟
此项目已作废
原因
客户存在海康4200和8700两台服务器,该项目运时,会独占事件处理,导致8700服务器无法获取到事件,影响客户总体运行
处理
为此重写了一套基于海康8700服务器的事件读取方案,该4200服务器方案供参考使用
项目需求
通过海康威视4200获取闸机数据信息,完成项目现场人数大屏数据展示
设计思路
第一版思路
通过直接注册闸机的方式独占获取闸机运行事件从而完成数据读取工作,因会导致海康4200服务器读不到数据,故此放弃
第二版思路
通过读取海康4200的sqlServer数据库,通过sqlServer数据库的触发器完成数据的读取工作,此版本工作正常,但因影响8700服务器工作,所4200服务器也放弃
实现步骤
完成项目开发前置准备工作
- 完成海康SDK javademo的测通
- 完成springboot项目转换普通项目 因海康sdk的jar包在maven项目中应用需要调整太多兼容性配置,所直接转换来的方便
第一版直接读取设备
demo测试
对设备进行了内网穿透方便进行调试测试 用SDK自带的javaDemo进行测试 以下为核心代码
AcsMain.java
/** 登录 */
// login_V40("www.bjtang.com", "admin", "hik12345", (short) 7002);
if( login_V40(args[0], args[1], args[2], (short) Integer.valueOf(args[3]).intValue())) {
EventSearch.searchAllEvent(lUserID, args[4]);
/** 查询设备事件 */
Thread.sleep(15000);
/**
* 增加sleep时间,保证程序一直运行,
*/
}
/** 登出操作 */
AcsMain.logout();
在查询设备事件的时候,因为事件只能被读取一次,所以会导致 EventSearch.java
/** 事件查询模块 */
public static void searchAllEvent(int lUserID, String inORout)
throws UnsupportedEncodingException, InterruptedException {
int i = 0; // 事件条数
HCNetSDK.NET_DVR_ACS_EVENT_COND struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND();
struAcsEventCond.read();
struAcsEventCond.dwSize = struAcsEventCond.size();
// 查询全部主次类型的报警
struAcsEventCond.dwMajor = 5; // 主次事件类型设为0,代表查询所有事件
struAcsEventCond.dwMinor = 0; //
// struAcsEventCond.byEventAttribute=1;
// 开始时间
struAcsEventCond.struStartTime.dwYear = 2023;
struAcsEventCond.struStartTime.dwMonth = 12;
struAcsEventCond.struStartTime.dwDay = 4;
struAcsEventCond.struStartTime.dwHour = 9;
struAcsEventCond.struStartTime.dwMinute = 0;
struAcsEventCond.struStartTime.dwSecond = 0;
// 结束时间
struAcsEventCond.struEndTime.dwYear = 2023;
struAcsEventCond.struEndTime.dwMonth = 12;
struAcsEventCond.struEndTime.dwDay = 4;
struAcsEventCond.struEndTime.dwHour = 18;
struAcsEventCond.struEndTime.dwMinute = 0;
struAcsEventCond.struEndTime.dwSecond = 0;
struAcsEventCond.wInductiveEventType = 1;
struAcsEventCond.byPicEnable = 1; // 是否带图片,0-不带图片,1-带图片
struAcsEventCond.write();
Pointer ptrStruEventCond = struAcsEventCond.getPointer();
int m_lSearchEventHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_EVENT,
ptrStruEventCond, struAcsEventCond.size(), null, null);
if (m_lSearchEventHandle <= -1) {
System.out.println("NET_DVR_StartRemoteConfig调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
}
HCNetSDK.NET_DVR_ACS_EVENT_CFG struAcsEventCfg = new HCNetSDK.NET_DVR_ACS_EVENT_CFG();
struAcsEventCfg.read();
struAcsEventCfg.dwSize = struAcsEventCfg.size();
struAcsEventCfg.write();
Pointer ptrStruEventCfg = struAcsEventCfg.getPointer();
while (true) {
// System.out.println("i=" + i);
int dwEventSearch = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(m_lSearchEventHandle, ptrStruEventCfg,
struAcsEventCfg.size());
if (dwEventSearch <= -1) {
System.out.println("NET_DVR_GetNextRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
}
if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) {
System.out.println("配置等待....");
Thread.sleep(1000);
continue;
} else if (dwEventSearch == HCNetSDK.NET_SDK_NEXT_STATUS__FINISH) {
System.out.println("获取事件完成");
break;
} else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) {
System.out.println("获取事件出现异常");
break;
} else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) {
struAcsEventCfg.read();
// 获取的事件信息通过struAcsEventCfg结构体进行解析,
// System.out.println(i + "获取事件成功, 报警主类型:" +
// Integer.toHexString(struAcsEventCfg.dwMajor) + "报警次类型:" +
// Integer.toHexString(struAcsEventCfg.dwMinor) + "卡号:" + new
// String(struAcsEventCfg.struAcsEventInfo.byCardNo).trim());
/**
* 工号有两个字段,dwEmployeeNo表示工号,当值为0时,表示无效,解析byEmployeeNo参数
*/
String dwMinor = Integer.toHexString(struAcsEventCfg.dwMinor);
// System.err.println( dwMinor);
if ("69".equals(dwMinor)) {
String id = new String(struAcsEventCfg.struAcsEventInfo.byCardNo).trim();
String type = Integer.toHexString(struAcsEventCfg.struAcsEventInfo.byCurrentVerifyMode);
System.out.println(id + "---" + type);
User cacheData = MapList.getInstance().getCacheData(id);
if ("入口".equals( inORout) ){
if (cacheData == null) {
User user = new User();
user.setId(id);
user.setName("未知姓名");
user.setPosition("未知职务");
MapList.getInstance().addInUser(user);
} else {
MapList.getInstance().addInUser(cacheData);
}
} else {
if (cacheData == null) {
User user = new User();
user.setId(id);
user.setName("未知姓名");
user.setPosition("未知职务");
MapList.getInstance().addOutUser(user);
} else {
MapList.getInstance().addOutUser(cacheData);
}
}
}
i++;
continue;
}
}
i = 0;
if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(m_lSearchEventHandle)) {
System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
} else {
System.out.println("NET_DVR_StopRemoteConfig接口成功");
}
return;
}