src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java
@@ -1,6 +1,7 @@ package com.ard.alarm.camera.service.impl; import java.util.*; import com.ard.alarm.camera.domain.ArdCameras; import com.ard.alarm.camera.mapper.ArdCamerasMapper; import com.ard.alarm.camera.service.IArdCamerasService; @@ -30,20 +31,28 @@ private ArdCamerasMapper ardCamerasMapper; @Resource private ArdEquipExternalMapper ardEquipExternalMapper; @Override public void run(ApplicationArguments args) throws Exception { //加载sdk库 HikClientUtil.loadHCNetSDKLib(); //获取全部海康光电 //获取全部海康光电尝试登录 List<ArdCameras> ardCameras = ardCamerasMapper.selectArdCamerasList(new ArdCameras()); HikClientUtil.loginAllCamera(ardCameras); //获取全部海康报警主机 ArdEquipExternal ardEquipExternal= new ArdEquipExternal(); ardEquipExternal.setFactory("1"); ardEquipExternal.setType("1"); List<ArdEquipExternal> ardEquipExternals = ardEquipExternalMapper.selectArdEquipExternalList(ardEquipExternal); HikClientUtil.loginAllAlarmHost(ardEquipExternals); //获取全部海康报警主机尝试登录 ArdEquipExternal alarmHost = new ArdEquipExternal(); alarmHost.setFactory("1"); alarmHost.setType("1"); List<ArdEquipExternal> alarmHosts = ardEquipExternalMapper.selectArdEquipExternalList(alarmHost); HikClientUtil.loginAllAlarmHost(alarmHosts); //获取全部门禁主机尝试登录 ArdEquipExternal accessControlHost = new ArdEquipExternal(); accessControlHost.setFactory("1"); accessControlHost.setType("6"); List<ArdEquipExternal>accessControlHosts = ardEquipExternalMapper.selectArdEquipExternalList(accessControlHost); HikClientUtil.loginAllAccessControlHost(accessControlHosts); } /** * 查询相机设备 * src/main/java/com/ard/alarm/external/mapper/ArdEquipExternalMapper.java
@@ -22,6 +22,14 @@ */ public ArdEquipExternal selectArdEquipExternalById(String id); /** * 查询external * * @param ardEquipExternal external * @return external集合 */ public ArdEquipExternal selectArdEquipExternal(ArdEquipExternal ardEquipExternal); /** * 查询external列表 * src/main/java/com/ard/alarm/external/service/IArdEquipExternalService.java
@@ -1,28 +1,36 @@ package com.ard.alarm.external.service; import java.util.List; import com.ard.alarm.external.domain.ArdEquipExternal; /** * externalService接口 * * * @author zj * @date 2023-03-13 */ public interface IArdEquipExternalService { public interface IArdEquipExternalService { /** * 查询external * * * @param id external主键 * @return external */ public ArdEquipExternal selectArdEquipExternalById(String id); /** * 查询external * * @param ardEquipExternal external * @return external集合 */ public ArdEquipExternal selectArdEquipExternal(ArdEquipExternal ardEquipExternal); /** * 查询external列表 * * * @param ardEquipExternal external * @return external集合 */ src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java
@@ -33,6 +33,11 @@ return ardEquipExternalMapper.selectArdEquipExternalById(id); } @Override public ArdEquipExternal selectArdEquipExternal(ArdEquipExternal ardEquipExternal) { return ardEquipExternalMapper.selectArdEquipExternal(ardEquipExternal); } /** * 查询external列表 * src/main/java/com/ard/utils/hiksdk/domain/AccessControlHostEventInfo.java
New file @@ -0,0 +1,48 @@ package com.ard.utils.hiksdk.domain; import lombok.Data; /** * @Description: 门禁主机事件信息 * @ClassName: AccessControlHostEventInfo * @Author: 刘苏义 * @Date: 2023年07月10日14:25 * @Version: 1.0 **/ @Data public class AccessControlHostEventInfo { /** * 事件流水号 */ Integer serialNo; /** * 门编号 */ Integer doorNo; /** * 防区类型 */ String defenseType; /** * 报警时间 */ String alarmTime; /** * 报警事件类型 */ String alarmType; /** * 图片url */ String picUrl; /** * 关联门禁主机id */ String acsId; } src/main/java/com/ard/utils/hiksdk/domain/CameraEventInfo.java
File was renamed from src/main/java/com/ard/utils/hiksdk/domain/alarmEventInfo.java @@ -3,14 +3,14 @@ import lombok.Data; /** * @ClassName alarmInfo * @Description: * @ClassName CameraAlarmEventInfo * @Description: 通用光电事件信息 * @Author 刘苏义 * @Date 2023/2/16 20:31 * @Version 1.0 */ @Data public class alarmEventInfo { public class CameraEventInfo { /** * 报警名称 src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java
@@ -4,15 +4,14 @@ import com.ard.alarm.camera.domain.ArdCameras; import com.ard.alarm.camera.domain.CameraCmd; import com.ard.alarm.camera.service.IArdCamerasService; import com.ard.alarm.camera.service.impl.ArdCamerasServiceImpl; import com.ard.alarm.external.domain.ArdEquipExternal; import com.ard.alarm.external.service.IArdEquipExternalService; import com.ard.alarm.external.service.impl.ArdEquipExternalServiceImpl; import com.ard.config.MinioClientSingleton; import com.ard.utils.ByteUtils; import com.ard.utils.hiksdk.common.GlobalVariable; import com.ard.utils.hiksdk.domain.AccessControlHostEventInfo; import com.ard.utils.hiksdk.domain.CameraEventInfo; import com.ard.utils.hiksdk.domain.ExternalAlarmEventInfo; import com.ard.utils.hiksdk.domain.alarmEventInfo; import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK; import com.ard.utils.hiksdk.util.minio.MinioUtils; import com.ard.utils.DateUtils; @@ -20,11 +19,8 @@ import com.ard.utils.mqtt.MqttConsumer; import com.sun.jna.Pointer; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import javax.xml.bind.DatatypeConverter; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.*; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; import java.util.Date; @@ -55,9 +51,7 @@ Integer wLinkPort = Integer.valueOf(pAlarmer.wLinkPort); String sTime;//事件时间 String url;//事件图片 alarmEventInfo info;//事件信息 String url = "";//事件图片 //lCommand是传的报警类型 switch (lCommand) { case HCNetSDK.COMM_ALARM_RULE: @@ -77,7 +71,7 @@ sTime = DateUtils.parseTime(strVcaAlarm.dwAbsTime);//事件时间 String ipaddr = new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4).trim();//设备ip Integer channel = Integer.valueOf(strVcaAlarm.struDevInfo.byChannel);//通道 info = new alarmEventInfo(); CameraEventInfo info = new CameraEventInfo(); info.setAlarmName("人员行为分析"); info.setAlarmTime(sTime); info.setCameraName(ardcamere.getName()); @@ -153,11 +147,12 @@ break; case HCNetSDK.COMM_ALARMHOST_CID_ALARM: log.info("报警主机 CID 报告报警上传"); //region 报警主机报警处理 ArdEquipExternal ardEquipExternal = new ArdEquipExternal(); ardEquipExternal.setIp(sDeviceIP); ardEquipExternal.setPort(wLinkPort); IArdEquipExternalService ardEquipExternalService = SpringTool.getApplicationContext().getBean(IArdEquipExternalService.class); ardEquipExternal = ardEquipExternalService.selectArdEquipExternalList(ardEquipExternal).get(0); ardEquipExternal = ardEquipExternalService.selectArdEquipExternal(ardEquipExternal); HCNetSDK.NET_DVR_CID_ALARM netDvrCidAlarm = new HCNetSDK.NET_DVR_CID_ALARM(); @@ -234,6 +229,122 @@ externalAlarmEventInfo.setAlarmTime(struTriggerTime); externalAlarmEventInfo.setAlarmHostId(ardEquipExternal.getId()); publishMqtt(externalAlarmEventInfo); //endregion break; case HCNetSDK.COMM_ALARM_ACS: //region 门禁主机报警处理 ArdEquipExternal accessControlHost = new ArdEquipExternal(); accessControlHost.setIp(sDeviceIP); accessControlHost.setPort(wLinkPort); ardEquipExternalService = SpringTool.getApplicationContext().getBean(IArdEquipExternalService.class); accessControlHost = ardEquipExternalService.selectArdEquipExternal(accessControlHost); HCNetSDK.NET_DVR_ACS_ALARM_INFO strACSInfo = new HCNetSDK.NET_DVR_ACS_ALARM_INFO(); strACSInfo.write(); Pointer acsInfo = strACSInfo.getPointer(); acsInfo.write(0, pAlarmInfo.getByteArray(0, strACSInfo.size()), 0, strACSInfo.size()); strACSInfo.read(); int dwMajor = strACSInfo.dwMajor; if (dwMajor != 5) { //只获取事件 break; } int dwMinor = strACSInfo.dwMinor; if (dwMinor != 80 && dwMinor != 104) { //只解析真人检测失败和人脸抓拍失败的次类型事件 break; } // log.info("门禁主机报警上传"); // log.info("【主类型】事件"); String alarmType = ""; switch (dwMinor) { case 104: alarmType = "真人检测失败"; break; case 80: alarmType = "人脸抓拍失败"; break; } String alarmTime = DateUtils.convertDate(parseAlarmTime(strACSInfo.struTime), "yyyy-M-d H:m:s"); //事件图片处理 int dwPicDataLen = strACSInfo.dwPicDataLen; if (dwPicDataLen > 0) { SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String newName = sf.format(new Date()); try { //将字节写入文件 long offset = 0; ByteBuffer buffers = strACSInfo.pPicData.getByteBuffer(offset, strACSInfo.dwPicDataLen); byte[] bytes = new byte[strACSInfo.dwPicDataLen]; buffers.rewind(); buffers.get(bytes); InputStream input = new ByteArrayInputStream(bytes); String bucketName = "pic"; String objectName = "alarm_" + newName + ".jpeg"; boolean uploadObject = MinioUtils.uploadObject(bucketName, objectName, input, "image/JPEG"); if (uploadObject) { url = MinioClientSingleton.domainUrl + "/" + bucketName + "/" + objectName; //log.debug("上传文件成功!" + url); } } catch (Exception e) { log.error("图片保存失败"); } } HCNetSDK.NET_DVR_ACS_EVENT_INFO struAcsEventInfo = strACSInfo.struAcsEventInfo; int byType = struAcsEventInfo.byType; String defenseType = ""; switch (byType) { case 0: defenseType = "即时防区"; break; case 1: defenseType = "24小时防区"; break; case 2: defenseType = "延时防区"; break; case 3: defenseType = "内部防区"; break; case 4: defenseType = "钥匙防区"; break; case 5: defenseType = "火警防区"; break; case 6: defenseType = "周界防区"; break; case 7: defenseType = "24小时无声防区"; break; case 8: defenseType = "24小时辅助防区"; break; case 9: defenseType = "24小时震动防区"; break; case 10: defenseType = "门禁紧急开门防区"; break; case 11: defenseType = "门禁紧急关门防区"; break; default: defenseType = "无"; break; } AccessControlHostEventInfo accessControlHostEventInfo = new AccessControlHostEventInfo(); accessControlHostEventInfo.setSerialNo(struAcsEventInfo.dwSerialNo); accessControlHostEventInfo.setAlarmType(alarmType); accessControlHostEventInfo.setDoorNo(struAcsEventInfo.dwDoorNo); accessControlHostEventInfo.setDefenseType(defenseType); accessControlHostEventInfo.setAlarmTime(alarmTime); accessControlHostEventInfo.setPicUrl(url); accessControlHostEventInfo.setAcsId(accessControlHost.getId()); publishMqtt(accessControlHostEventInfo); //endregion break; default: log.info("未知报警事件类型:lCommand:" + Integer.toHexString(lCommand)); @@ -266,7 +377,7 @@ String ipaddr = new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4).trim();//设备ip String UUID = java.util.UUID.randomUUID().toString().replace("-", ""); String filename = ipaddr + "/" + currentTime + "/" + eventNameEng + "/" + UUID + ".jpg"; boolean uploadRes = MinioUtils.uploadObject("pic", filename, inputStream, inputStream.available(), "image/jpeg"); boolean uploadRes = MinioUtils.uploadObject("pic", filename, inputStream, "image/jpeg"); if (uploadRes) { url = MinioClientSingleton.domainUrl + filename; log.info("写入minio图片地址:" + url); @@ -279,9 +390,9 @@ } /** * 打保存图片 * 相机截图 */ private String savePicture(alarmEventInfo info) { private String savePicture(CameraEventInfo info) { CameraCmd cmd = new CameraCmd(); ArdCameras Cameras = GlobalVariable.cameraMap.get(info.getCameraIp()); cmd.setCameraId(Cameras.getId()); @@ -297,7 +408,7 @@ /** * 打印通用光电日志 */ private void printLog(alarmEventInfo info) { private void printLog(CameraEventInfo info) { log.info("【规则】" + info.getAlarmName() + "【规则id】" + info.getRuleId() + "【类型】" + info.getAlarmType() + "【时间】" + info.getAlarmTime() + "【相机id】" + info.getCameraId() + "【相机】" + info.getCameraName() + "【IP】" + info.getCameraIp() + "【通道】" + info.getCameraChannel() + "【型号】" + info.getCameraType() + @@ -305,7 +416,7 @@ } /** * 打印外联报警日志 * 打印报警主机事件日志 */ private void printLog(ExternalAlarmEventInfo info) { log.info("【报警ID】" + info.getAlarmId() + "【报警名称】" + info.getAlarmName() + @@ -314,19 +425,37 @@ } /** * 打印门禁事件日志 */ private void printLog(AccessControlHostEventInfo info) { log.info("【报警ID】" + info.getSerialNo() + "【设备编号】"+ "【门编号】" + info.getDoorNo() + "【事件类型】" + info.getAlarmType() + "【防区类型】" + info.getDefenseType()+"【时间】" + info.getAlarmTime() + "【门禁主机ID】" + info.getAcsId()); } /** * 通用光电报警推送mqtt */ private void publishMqtt(alarmEventInfo info) { private void publishMqtt(CameraEventInfo info) { // printLog(info); MqttConsumer.publish(2, false, "camera", JSON.toJSONString(info)); } /** * 外联报警推送mqtt * 报警主机事件推送mqtt */ private void publishMqtt(ExternalAlarmEventInfo info) { printLog(info); MqttConsumer.publish(2, false, "external", JSON.toJSONString(info)); } /** * 门禁事件推送mqtt */ private void publishMqtt(AccessControlHostEventInfo info) { printLog(info); MqttConsumer.publish(2, false, "accessControl", JSON.toJSONString(info)); } /** @@ -341,4 +470,17 @@ byte bySecond = netDvrTimeEx.bySecond; return wYear + "-" + byMonth + "-" + byDay + " " + byHour + ":" + byMinute + ":" + bySecond; } /** * 时间格式化 */ private String parseAlarmTime(HCNetSDK.NET_DVR_TIME netDvrTimeEx) { int wYear = netDvrTimeEx.dwYear; int byMonth = netDvrTimeEx.dwMonth; int byDay = netDvrTimeEx.dwDay; int byHour = netDvrTimeEx.dwHour; int byMinute = netDvrTimeEx.dwMinute; int bySecond = netDvrTimeEx.dwSecond; return wYear + "-" + byMonth + "-" + byDay + " " + byHour + ":" + byMinute + ":" + bySecond; } } src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java
@@ -3,6 +3,7 @@ import com.ard.alarm.camera.domain.ArdCameras; import com.ard.alarm.camera.domain.CameraCmd; import com.ard.alarm.external.domain.ArdEquipExternal; import com.ard.config.MinioClientSingleton; import com.ard.utils.ByteUtils; import com.ard.utils.hiksdk.common.GlobalVariable; import com.ard.utils.hiksdk.domain.DeviceInfo; @@ -19,7 +20,6 @@ import java.io.*; import java.nio.ByteBuffer; import java.util.*; /** @@ -173,6 +173,7 @@ log.info("登录异常:" + errorCode); } } /** * @描述 登录所有相机 * @参数 [] @@ -185,7 +186,7 @@ try { for (ArdCameras camera : ardCameras) { Thread.sleep(100); DeviceInfo info=new DeviceInfo(); DeviceInfo info = new DeviceInfo(); info.setDeviceId(camera.getId()); info.setIp(camera.getIp()); info.setPort(camera.getPort()); @@ -199,6 +200,7 @@ log.error("初始化登录相机异常:" + ex.getMessage()); } } /** * @描述 登录所有报警主机 * @参数 [] @@ -211,7 +213,7 @@ try { for (ArdEquipExternal alarmHost : ardEquipExternals) { Thread.sleep(100); DeviceInfo info=new DeviceInfo(); DeviceInfo info = new DeviceInfo(); info.setDeviceId(alarmHost.getId()); info.setIp(alarmHost.getIp()); info.setPort(alarmHost.getPort()); @@ -225,7 +227,32 @@ log.error("初始化报警主机异常:" + ex.getMessage()); } } /** * @描述 登录所有门禁主机 * @参数 [] * @返回值 void * @创建人 刘苏义 * @创建时间 2023/2/3 10:10 * @修改人和其它信息 */ public static void loginAllAccessControlHost(List<ArdEquipExternal> ardEquipExternals) { try { for (ArdEquipExternal accessControlHost : ardEquipExternals) { Thread.sleep(100); DeviceInfo info = new DeviceInfo(); info.setDeviceId(accessControlHost.getId()); info.setIp(accessControlHost.getIp()); info.setPort(accessControlHost.getPort()); info.setUsername(accessControlHost.getUsername()); info.setPassword(accessControlHost.getPassword()); login(info); String ip = accessControlHost.getIp(); GlobalVariable.alarmHostMap.put(ip, accessControlHost); } } catch (Exception ex) { log.error("初始化报警主机异常:" + ex.getMessage()); } } /** * @描述 注销登录 * @参数 [dvrLogin] @@ -269,7 +296,7 @@ * @param lUserID 唯一标识符 * @param lAlarmHandle 报警处理器 */ public static int setupAlarmChan(int lUserID, int lAlarmHandle) { public static int setupAlarmChan(String deviceIpPort, int lUserID, int lAlarmHandle) { // 根据设备注册生成的lUserID建立布防的上传通道,即数据的上传通道 if (lUserID == -1) { log.info("请先注册"); @@ -296,12 +323,12 @@ // 布防成功,返回布防成功的数据传输通道号 lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo); if (lAlarmHandle == -1) { log.error("设备布防失败,错误码==========》" + hCNetSDK.NET_DVR_GetLastError()); log.error("设备【" + deviceIpPort + "】布防失败,错误码==========》" + hCNetSDK.NET_DVR_GetLastError()); // 注销 释放sdk资源 logout(lUserID); return lAlarmHandle; } else { log.info("设备布防成功"); log.info("设备【" + deviceIpPort + "】布防成功"); return lAlarmHandle; } } @@ -361,13 +388,14 @@ InputStream input = new ByteArrayInputStream(array); String url = ""; try { boolean b = MinioUtils.uploadObject(cmd.getBucketName(), cmd.getObjectName(), input, input.available(), ContentType); boolean b = MinioUtils.uploadObject(cmd.getBucketName(), cmd.getObjectName(), input, ContentType); if (b) { url = MinioUtils.getBucketObjectUrl(cmd.getBucketName(), cmd.getObjectName()); url = url.indexOf('?') != -1 ? url.substring(0, url.indexOf('?')) : url; // url = MinioUtils.getBucketObjectUrl(cmd.getBucketName(), cmd.getObjectName()); // url = url.indexOf('?') != -1 ? url.substring(0, url.indexOf('?')) : url; url = MinioClientSingleton.domainUrl + "/" + cmd.getBucketName() + "/" + cmd.getObjectName(); log.debug("上传文件成功!" + url); } } catch (IOException ex) { } catch (Exception ex) { log.error("上传文件异常:" + ex.getMessage()); } return url; @@ -385,7 +413,7 @@ * 2023/7/6 10:48 */ public static String getDefenseZoneName(CameraCmd cmd) { String name=""; String name = ""; try { String cameraId = cmd.getCameraId(); Integer channelNum = cmd.getWZoneIndex();//通道号==防区号 @@ -411,6 +439,5 @@ } return name; } } src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java
@@ -19,19 +19,21 @@ public class LoginResultCallBack implements HCNetSDK.FLoginResultCallBack { private DeviceInfo deviceInfo; public LoginResultCallBack(DeviceInfo deviceInfo) { this.deviceInfo=deviceInfo; public LoginResultCallBack(DeviceInfo deviceInfo) { this.deviceInfo = deviceInfo; } @Override public int invoke(int lUserID, int dwResult, HCNetSDK.NET_DVR_DEVICEINFO_V30 lpDeviceinfo, Pointer pUser) { String deviceIpPort = deviceInfo.getIp() + ":" + deviceInfo.getPort(); if (dwResult == 1) { GlobalVariable.loginMap.put(deviceInfo.getDeviceId(), lUserID); log.info(deviceInfo.getIp() + ":" + deviceInfo.getPort() + "登录成功"); log.info("设备【" + deviceIpPort + "】登录成功"); // 设置报警回调函数,建立报警上传通道(启用布防) HikClientUtil.setupAlarmChan(lUserID, -1); HikClientUtil.setupAlarmChan(deviceIpPort, lUserID, -1); } else { log.info(deviceInfo.getIp() + ":" + deviceInfo.getPort() + "登录失败"); log.info("设备【" + deviceIpPort + "】登录失败"); } return 1; } src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java
@@ -289,12 +289,12 @@ * @param size ⼤⼩ * @param contextType 类型 Image/jpeg 浏览器可以直接打开,否则下载 */ public static boolean uploadObject(String bucketName, String objectName, InputStream stream, long size, String contextType) { public static boolean uploadObject(String bucketName, String objectName, InputStream stream, String contextType) { try { PutObjectArgs putObjectArgs = PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(stream, size, -1) .stream(stream, stream.available(), -1) .contentType(contextType) .build(); ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); src/main/resources/mapper/ArdEquipExternalMapper.xml
@@ -34,7 +34,20 @@ c.altitude from ard_equip_external c </sql> <select id="selectArdEquipExternal" parameterType="ArdEquipExternal" resultMap="ArdEquipExternalResult"> <include refid="selectArdEquipExternalVo"/> <where> <if test="name != null and name != ''">and c.name like '%'||#{name}||'%'</if> <if test="type != null and type != ''">and c.type = #{type}</if> <if test="factory != null and factory != ''">and c.factory = #{factory}</if> <if test="deptId != null ">and (c.dept_id = #{deptId} OR c.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE cast(#{deptId} as varchar) = any(string_to_array(ancestors,',')) )) </if> <if test="userId != null and userId != ''">and c.user_id = #{userId}</if> <if test="ip != null and ip != ''">and c.ip = #{ip}</if> <if test="port != null and port != ''">and c.port = #{port}</if> </where> </select> <select id="selectArdEquipExternalList" parameterType="ArdEquipExternal" resultMap="ArdEquipExternalResult"> <include refid="selectArdEquipExternalVo"/> <where>