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); + } +}