From 45859b1636153de3107c540e9d68a373efeb584c Mon Sep 17 00:00:00 2001
From: 07 <15989082884@163.com>
Date: Tue, 1 Nov 2022 17:38:42 +0800
Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E4=BA=8B=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../hikdev/controller/DeviceController.java | 4 +-
.../hikdev/scheduled/ScheduledTask.java | 54 ++++++-------
.../impl/HikAccessControlServiceImpl.java | 75 ++++++++++++++++++-
.../oldwei/hikdev/util/NetDvrTimeUtil.java | 50 +++++++++++++
4 files changed, 150 insertions(+), 33 deletions(-)
create mode 100644 src/main/java/com/oldwei/hikdev/util/NetDvrTimeUtil.java
diff --git a/src/main/java/com/oldwei/hikdev/controller/DeviceController.java b/src/main/java/com/oldwei/hikdev/controller/DeviceController.java
index 826056c..5f4cb83 100644
--- a/src/main/java/com/oldwei/hikdev/controller/DeviceController.java
+++ b/src/main/java/com/oldwei/hikdev/controller/DeviceController.java
@@ -75,8 +75,8 @@ public class DeviceController {
* @return 注销结果 true/false
*/
@PostMapping("clean")
- public HikDevResponse clean(@RequestBody DeviceSn deviceSn) {
- return this.hikDeviceService.clean(deviceSn.getDeviceSn()) ? new HikDevResponse().ok() : new HikDevResponse().err();
+ public HikDevResponse clean(String deviceSn) {
+ return this.hikDeviceService.clean(deviceSn) ? new HikDevResponse().ok() : new HikDevResponse().err();
}
/**
diff --git a/src/main/java/com/oldwei/hikdev/scheduled/ScheduledTask.java b/src/main/java/com/oldwei/hikdev/scheduled/ScheduledTask.java
index 560bd92..0f9caad 100644
--- a/src/main/java/com/oldwei/hikdev/scheduled/ScheduledTask.java
+++ b/src/main/java/com/oldwei/hikdev/scheduled/ScheduledTask.java
@@ -42,31 +42,31 @@ public class ScheduledTask {
//
//每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
- /**
- * 一分钟执行一次
- *
- * @throws IOException
- */
- @Scheduled(cron = "0 */1 * * * ?")
- public void searchHikDevice() throws IOException {
- String uuid = "" + IdUtil.randomUUID().toUpperCase() + "inquiry";
- InetAddress address = InetAddress.getByName("239.255.255.250");
- byte[] data = uuid.getBytes();
- DatagramPacket packet = new DatagramPacket(data, data.length, address, 37020);
- this.udpDatagramSocket.getDatagramSocket().send(packet);
- }
-
- /**
- * 获取云端设备列表进行登录
- *
- * @throws IOException
- */
- @Scheduled(cron = "0 */1 * * * ?")
- public void getHikDeviceAndLogin() {
- // 根据项目id获取云端设备列表
-
- // 比对当前登录设备
-
- // 登录需要登陆的设备
- }
+// /**
+// * 一分钟执行一次
+// *
+// * @throws IOException
+// */
+// @Scheduled(cron = "0 */1 * * * ?")
+// public void searchHikDevice() throws IOException {
+// String uuid = "" + IdUtil.randomUUID().toUpperCase() + "inquiry";
+// InetAddress address = InetAddress.getByName("239.255.255.250");
+// byte[] data = uuid.getBytes();
+// DatagramPacket packet = new DatagramPacket(data, data.length, address, 37020);
+// this.udpDatagramSocket.getDatagramSocket().send(packet);
+// }
+//
+// /**
+// * 获取云端设备列表进行登录
+// *
+// * @throws IOException
+// */
+// @Scheduled(cron = "0 */1 * * * ?")
+// public void getHikDeviceAndLogin() {
+// // 根据项目id获取云端设备列表
+//
+// // 比对当前登录设备
+//
+// // 登录需要登陆的设备
+// }
}
diff --git a/src/main/java/com/oldwei/hikdev/service/impl/HikAccessControlServiceImpl.java b/src/main/java/com/oldwei/hikdev/service/impl/HikAccessControlServiceImpl.java
index 1512350..42097ff 100644
--- a/src/main/java/com/oldwei/hikdev/service/impl/HikAccessControlServiceImpl.java
+++ b/src/main/java/com/oldwei/hikdev/service/impl/HikAccessControlServiceImpl.java
@@ -21,10 +21,12 @@ import com.oldwei.hikdev.entity.access.Valid;
import com.oldwei.hikdev.entity.param.AccessControlUser;
import com.oldwei.hikdev.entity.param.EditUserParam;
import com.oldwei.hikdev.entity.param.UserFaceParam;
+import com.oldwei.hikdev.service.HCNetSDK;
import com.oldwei.hikdev.service.IHikAccessControlService;
import com.oldwei.hikdev.service.IHikDevService;
import com.oldwei.hikdev.structure.*;
import com.oldwei.hikdev.util.ImageFromNetWork;
+import com.oldwei.hikdev.util.NetDvrTimeUtil;
import com.oldwei.hikdev.util.StringEncodingUtil;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
@@ -36,10 +38,7 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
/**
* @author oldwei
@@ -1127,4 +1126,72 @@ public class HikAccessControlServiceImpl implements IHikAccessControlService {
return result;
}
+ /**
+ * 调用设备事件
+ */
+ public void getDeviceCase(String deviceSn,Date startTime,Date endTime) {
+ Map eventMap;// 储存事件信息的map
+ // 调用获取设备事件长连接
+ HCNetSDK.NET_DVR_ACS_EVENT_COND struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND();
+ struAcsEventCond.read();
+ struAcsEventCond.dwSize = struAcsEventCond.size();
+ struAcsEventCond.dwMajor = 5;// 5代表event事件
+ struAcsEventCond.dwMinor = 0x4b;// 代表刷脸成功
+ struAcsEventCond.struStartTime = NetDvrTimeUtil.getDvrStruTime(startTime);// ****必须要
+ struAcsEventCond.struEndTime = NetDvrTimeUtil.getDvrStruTime(endTime);// ***必须要
+ struAcsEventCond.write();
+ Pointer ptrStruEventCond = struAcsEventCond.getPointer();
+ Integer longUserId = this.dataCache.getInteger(DataCachePrefixConstant.HIK_REG_USERID + deviceSn);
+ Integer lHandle = this.hikDevService.NET_DVR_StartRemoteConfig(longUserId,HCNetSDK.NET_DVR_GET_ACS_EVENT,ptrStruEventCond,struAcsEventCond.size(),null,null);
+ if (lHandle == -1){
+ System.out.println("建立获取设备事件长连接失败,错误码为"+this.hikDevService.NET_DVR_GetLastError());
+ return;
+ }else{
+ System.out.println("建立获取设备事件连接成功!"+lHandle);
+ }
+ // 获取设备详细事件开始
+ HCNetSDK.NET_DVR_ACS_EVENT_CFG struEventCFG = new HCNetSDK.NET_DVR_ACS_EVENT_CFG();
+ struEventCFG.read();
+ struEventCFG.dwSize = struEventCFG.size();
+ struEventCFG.write();
+ while(true){
+ Integer dwState = this.hikDevService.NET_DVR_GetNextRemoteConfig(lHandle, struEventCFG.getPointer(), struEventCFG.size());
+ struEventCFG.read();
+ if (dwState == -1){
+ System.out.println("NET_DVR_GetNextRemoteConfig接口调用失败,错误码:" + this.hikDevService.NET_DVR_GetLastError());
+ continue;
+ }else if (dwState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT){
+ // 配置等待
+ System.out.println("==========配置等待==============");
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ continue;
+ }else if (dwState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED){
+ // 获取事件失败
+ System.out.println("===============获取设备事件失败=======================");
+ break;
+
+ } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
+ // 获取事件异常
+ System.out.println("===============获取设备事件异常=======================");
+ break;
+ }else if (dwState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS){
+ // 获取设备事件成功
+ eventMap = new HashMap<>(16);
+ eventMap.put("employeeNo",StringEncodingUtil.guessEncodingTransformString(struEventCFG.struAcsEventInfo.byEmployeeNo));
+ eventMap.put("cardNo",StringEncodingUtil.guessEncodingTransformString(struEventCFG.struAcsEventInfo.byCardNo));
+ eventMap.put("struTime",NetDvrTimeUtil.getDateStr(NetDvrTimeUtil.getDate(struEventCFG.struTime)));
+// eventList.add(eventMap);
+ continue;
+ }else if(dwState == HCNetSDK.NET_SDK_NEXT_STATUS__FINISH) {
+ // 获取设备事件信息完成
+ System.out.println("=============获取设备事件完成================");
+ break;
+ }
+ }
+ }
+
}
diff --git a/src/main/java/com/oldwei/hikdev/util/NetDvrTimeUtil.java b/src/main/java/com/oldwei/hikdev/util/NetDvrTimeUtil.java
new file mode 100644
index 0000000..88959e1
--- /dev/null
+++ b/src/main/java/com/oldwei/hikdev/util/NetDvrTimeUtil.java
@@ -0,0 +1,50 @@
+package com.oldwei.hikdev.util;
+
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.StrUtil;
+import com.oldwei.hikdev.service.HCNetSDK;
+import lombok.extern.slf4j.Slf4j;
+import org.mozilla.universalchardet.UniversalDetector;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author oldwei
+ * @date 2021-5-14 17:28
+ */
+@Slf4j
+public class NetDvrTimeUtil {
+ public static HCNetSDK.NET_DVR_TIME getDvrStruTime(Date date) {
+ HCNetSDK.NET_DVR_TIME dvrTime = new HCNetSDK.NET_DVR_TIME();
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ dvrTime.dwYear = cal.get(Calendar.YEAR);
+ dvrTime.dwMonth = cal.get(Calendar.MONTH)+1;
+ dvrTime.dwDay = cal.get(Calendar.DATE);
+ dvrTime.dwHour=0;
+ dvrTime.dwMinute=0;
+ dvrTime.dwSecond=0;
+ return dvrTime;
+ }
+
+ public static Date getDate(HCNetSDK.NET_DVR_TIME dvrTime) {
+ Calendar cal = Calendar.getInstance();
+ cal.set(Calendar.YEAR,dvrTime.dwYear);
+ cal.set(Calendar.MONTH,dvrTime.dwMonth-1);
+ cal.set(Calendar.DATE,dvrTime.dwDay);
+ cal.set(Calendar.HOUR_OF_DAY,dvrTime.dwHour);
+ cal.set(Calendar.MINUTE,dvrTime.dwMinute);
+ cal.set(Calendar.SECOND,dvrTime.dwSecond);
+
+ return cal.getTime();
+ }
+
+ public static String getDateStr(Date date){
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ return sdf.format(date);
+ }
+}