src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/alarm/radar/controller/RadarController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/other/ByteUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/tcp/ClientHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java
@@ -19,6 +19,8 @@ import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * externalService业务层处理 @@ -35,8 +37,8 @@ public static List<ArdEquipExternal> ardAlarmHostList = new ArrayList<>(); public static List<ArdEquipExternal> ardAccessHostList = new ArrayList<>(); @Autowired public static List<ArdEquipExternal> ardSuperBrainHostList = new ArrayList<>(); @Resource private ArdEquipExternalMapper ardEquipExternalMapper; @Override @@ -55,6 +57,13 @@ ardAccessHostList = selectArdEquipExternalList(accessControlHost); HikClientUtil.loginAllAccessControlHost(ardAccessHostList); log.debug("门禁主机尝试登录"); //获取全部超脑尝试登录 ArdEquipExternal superBrainHost = new ArdEquipExternal(); superBrainHost.setFactory("1"); superBrainHost.setType("5"); ardSuperBrainHostList = selectArdEquipExternalList(superBrainHost); HikClientUtil.loginAllSuperBrainHost(ardSuperBrainHostList); log.debug("超脑尝试登录"); //同步任务 syncTask(); } @@ -99,10 +108,10 @@ //endregion //region 定时同步门禁主机 alarmHost = new ArdEquipExternal(); alarmHost.setFactory("1"); alarmHost.setType("6"); List<ArdEquipExternal> newAccessHostList = selectArdEquipExternalList(alarmHost); ArdEquipExternal accessHost = new ArdEquipExternal(); accessHost.setFactory("1"); accessHost.setType("6"); List<ArdEquipExternal> newAccessHostList = selectArdEquipExternalList(accessHost); //需要更新的数据 updateList = sameListWithDifferent(ardAccessHostList, newAccessHostList); if (updateList.size() > 0) { @@ -128,6 +137,36 @@ } } //endregion //region 定时同步超脑 ArdEquipExternal superBrainHost = new ArdEquipExternal(); superBrainHost.setFactory("1"); superBrainHost.setType("5"); List<ArdEquipExternal> newSuperBrainList = selectArdEquipExternalList(superBrainHost); //需要更新的数据 updateList = sameListWithDifferent(ardSuperBrainHostList, newSuperBrainList); if (updateList.size() > 0) { HikClientUtil.logoutAllSuperBrainHost(updateList); HikClientUtil.loginAllSuperBrainHost(updateList); ardSuperBrainHostList.clear(); ardSuperBrainHostList.addAll(newSuperBrainList); } //需要删除的数据 delList = diffList(ardSuperBrainHostList, newSuperBrainList); if (delList.size() > 0) { HikClientUtil.logoutAllSuperBrainHost(delList); for (ArdEquipExternal ardEquipExternal : delList) { ardSuperBrainHostList.remove(ardEquipExternal); } } //需要新增的数据 inserList = diffList(newSuperBrainList, ardSuperBrainHostList); if (inserList.size() > 0) { HikClientUtil.loginAllSuperBrainHost(inserList); for (ArdEquipExternal ardEquipExternal : inserList) { ardSuperBrainHostList.add(ardEquipExternal); } } //endregion } catch (Exception e) { log.error("同步外联任务执行出错" + e.getMessage()); } src/main/java/com/ard/alarm/radar/controller/RadarController.java
@@ -9,12 +9,15 @@ import com.ard.utils.tcp.ClientInitialize; import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import static jdk.nashorn.internal.runtime.regexp.joni.Config.log; /** * @Description: 雷达接口 @@ -24,6 +27,7 @@ **/ @RestController @RequestMapping("/radar") @Slf4j(topic = "netty") public class RadarController { @Resource @@ -55,14 +59,19 @@ radarPosition[1] = latitude; double distance = GisUtils.getDistance(radarPosition, targetPosition); float angleInRadians = (float)Math.atan(distance / altitude); float t = 90-(float)Math.toDegrees(angleInRadians); float t = (90-(float)Math.toDegrees(angleInRadians))*-1; log.debug("distance:"+distance); log.debug("p:"+p); log.debug("t:"+t); //发送告警前端的角度提示 byte[] header = {0x01, 0x02, 0x01};//包头 byte[] payloadHeader = {0x10, 0x03, 0x40, 0x00};//负载头 byte[] payloadHeader = {0x10, 0x03, 0x20, 0x00};//负载头 byte[] distanceBytes = ByteUtils.decimalToBytes((int)distance); distanceBytes=ByteUtils.toLittleEndian(distanceBytes); byte[] pBytes = ByteUtils.floatToBytes(p); pBytes=ByteUtils.toLittleEndian(pBytes); byte[] tBytes = ByteUtils.floatToBytes(t); tBytes=ByteUtils.toLittleEndian(tBytes); byte[] resBytes=new byte[20]; byte[] payloadBody = ByteUtils.appendArrays(distanceBytes,pBytes,tBytes,resBytes);//负载 src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java
@@ -54,22 +54,23 @@ String sTime;//事件时间 String url = "";//事件图片 //lCommand是传的报警类型 //log.debug("报警事件类型:lCommand:" + Integer.toHexString(lCommand)); log.debug("报警事件类型:lCommand:" + Integer.toHexString(lCommand)); ArdCameras ardCameras = new ArdCameras(); ardCameras.setIp(sDeviceIP); ardCameras.setPort(wLinkPort); IArdCamerasService ardCamerasService = SpringUtils.getBean(IArdCamerasService.class); List<ArdCameras> ardCamerasList = ardCamerasService.selectArdCamerasList(ardCameras); if (ardCamerasList.size() > 0) { ArdCameras camera = ardCamerasService.selectArdCamerasList(ardCameras).get(0); switch (lCommand) { //region 移动侦测、视频丢失、遮挡、IO信号量等报警信息(V3.0以上版本支持的设备) case HCNetSDK.COMM_ALARM_V30: //log.debug("移动侦测"); //region 移动侦测、视频丢失、遮挡、IO信号量等报警信息(V3.0以上版本支持的设备) HCNetSDK.NET_DVR_ALARMINFO_V30 netDvrAlarminfoV30 = new HCNetSDK.NET_DVR_ALARMINFO_V30(); netDvrAlarminfoV30.write(); Pointer pNDAInfo = netDvrAlarminfoV30.getPointer(); pNDAInfo.write(0, pAlarmInfo.getByteArray(0, netDvrAlarminfoV30.size()), 0, netDvrAlarminfoV30.size()); netDvrAlarminfoV30.read(); if (ardCamerasList.size() > 0) { ArdCameras camera = ardCamerasService.selectArdCamerasList(ardCameras).get(0); switch (netDvrAlarminfoV30.dwAlarmType) { case 3: info = new CameraEventInfo(); @@ -90,9 +91,12 @@ publishMqtt(info); break; } } //endregion break; case HCNetSDK.COMM_ALARM_RULE: //log.debug("行为分析信息报警信息上报"); //region 行为分析信息 //region 异常行为识别信息 HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm = new HCNetSDK.NET_VCA_RULE_ALARM(); strVcaAlarm.write(); Pointer pVCAInfo = strVcaAlarm.getPointer(); @@ -105,6 +109,8 @@ info = new CameraEventInfo(); info.setAlarmName("人员行为分析"); info.setAlarmTime(sTime); if (ardCamerasList.size() > 0) { ArdCameras camera = ardCamerasService.selectArdCamerasList(ardCameras).get(0); info.setCameraName(camera.getName()); info.setCameraId(camera.getId()); info.setCameraIp(camera.getIp()); @@ -171,6 +177,7 @@ // log.debug("未知行为事件类型:" + strVcaAlarm.struRuleInfo.wEventTypeEx); break; } } //endregion break; case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT: @@ -180,7 +187,7 @@ //log.debug("GPS报警信息上报(暂不解析)"); break; case HCNetSDK.COMM_ALARMHOST_CID_ALARM: //log.debug("报警主机CID报告报警上报"); log.debug("报警主机CID报告报警上报"); //region 报警主机报警处理 ArdEquipExternal ardEquipExternal = new ArdEquipExternal(); ardEquipExternal.setIp(sDeviceIP); @@ -264,6 +271,7 @@ //endregion break; case HCNetSDK.COMM_ALARM_ACS: log.debug("门禁主机报警上报"); //region 门禁主机报警处理 ArdEquipExternal accessControlHost = new ArdEquipExternal(); accessControlHost.setIp(sDeviceIP); @@ -378,10 +386,9 @@ //endregion break; default: // log.debug("未知报警事件类型:lCommand:" + Integer.toHexString(lCommand)); log.debug("未知报警事件类型:lCommand:" + Integer.toHexString(lCommand)); break; } } return true; } src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java
@@ -124,7 +124,7 @@ int i = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); if (i < 0) { int errorCode = hCNetSDK.NET_DVR_GetLastError(); log.info("登录异常:" + errorCode); log.error("登录异常:" + errorCode); } } @@ -221,7 +221,7 @@ // GlobalVariable.alarmHostMap.put(key, alarmHost); } } catch (Exception ex) { log.error("初始化报警主机异常:" + ex.getMessage()); log.error("登录所有报警主机异常:" + ex.getMessage()); } } @@ -245,7 +245,7 @@ // GlobalVariable.alarmHostMap.remove(key); } } catch (Exception ex) { log.error("初始化登录相机异常:" + ex.getMessage()); log.error("登出所有报警主机异常:" + ex.getMessage()); } } @@ -270,7 +270,7 @@ // GlobalVariable.accessHostMap.put(key, accessControlHost); } } catch (Exception ex) { log.error("初始化报警主机异常:" + ex.getMessage()); log.error("登录所有门禁主机异常:" + ex.getMessage()); } } @@ -294,10 +294,57 @@ // GlobalVariable.accessHostMap.remove(key); } } catch (Exception ex) { log.error("初始化报警主机异常:" + ex.getMessage()); log.error("登出所有门禁主机异常:" + ex.getMessage()); } } /** * @描述 登录所有超脑 * @创建人 刘苏义 * @创建时间 2023/2/3 10:10 */ public static void loginAllSuperBrainHost(List<ArdEquipExternal> ardEquipExternals) { try { for (ArdEquipExternal superBrainHost : ardEquipExternals) { Thread.sleep(100); DeviceInfo info = new DeviceInfo(); info.setDeviceId(superBrainHost.getId()); info.setIp(superBrainHost.getIp()); info.setPort(superBrainHost.getPort()); info.setUsername(superBrainHost.getUsername()); info.setPassword(superBrainHost.getPassword()); login(info); // // String key=accessControlHost.getIp()+":"+accessControlHost.getPort(); // GlobalVariable.accessHostMap.put(key, accessControlHost); } } catch (Exception ex) { log.error("登录所有超脑异常:" + ex.getMessage()); } } /** * @描述 登出所有超脑 * @创建人 刘苏义 * @创建时间 2023/2/3 10:10 */ public static void logoutAllSuperBrainHost(List<ArdEquipExternal> ardEquipExternals) { try { for (ArdEquipExternal superBrainHost : ardEquipExternals) { Thread.sleep(100); DeviceInfo info = new DeviceInfo(); info.setDeviceId(superBrainHost.getId()); info.setIp(superBrainHost.getIp()); info.setPort(superBrainHost.getPort()); info.setUsername(superBrainHost.getUsername()); info.setPassword(superBrainHost.getPassword()); logout(info); // String key=accessControlHost.getIp()+":"+accessControlHost.getPort(); // GlobalVariable.accessHostMap.remove(key); } } catch (Exception ex) { log.error("登出所有超脑异常:" + ex.getMessage()); } } /** * 建立布防上传通道,用于传输数据 @@ -323,7 +370,7 @@ HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM(); m_strAlarmInfo.dwSize = m_strAlarmInfo.size(); // 智能交通布防优先级:0 - 一等级(高),1 - 二等级(中),2 - 三等级(低) m_strAlarmInfo.byLevel = 2; m_strAlarmInfo.byLevel = 0; // 智能交通报警信息上传类型:0 - 老报警信息(NET_DVR_PLATE_RESULT), 1 - 新报警信息(NET_ITS_PLATE_RESULT) m_strAlarmInfo.byAlarmInfoType = 1; // 布防类型(仅针对门禁主机、人证设备):0 - 客户端布防(会断网续传),1 - 实时布防(只上传实时数据) src/main/java/com/ard/utils/other/ByteUtils.java
@@ -30,13 +30,27 @@ * byte数组转中文字符串 */ public static String bytesToStringZh(byte[] bytes) { ByteBuffer buffer = ByteBuffer.wrap(bytes); // byteArray 是包含字节数组的变量 //ByteBuffer buffer = ByteBuffer.wrap(bytes); // byteArray 是包含字节数组的变量 //try { // return new String(buffer.array(), "GBK"); //} catch (UnsupportedEncodingException e) { // e.printStackTrace(); //} //return ""; String zhStr = ""; try { return new String(buffer.array(), "GBK"); int position = ByteUtils.findIndexOfDoubleZero(bytes); if (position != -1) { byte[] result = new byte[position]; System.arraycopy(bytes, 0, result, 0, position); zhStr = new String(result, "GBK"); } else { zhStr = new String(bytes, "GBK"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return ""; return zhStr; } /** @@ -67,8 +81,13 @@ * byte数组转整型 */ public static int bytesToDecimal(byte[] byteArray) { ByteBuffer buffer = ByteBuffer.wrap(byteArray); // byteArray 是包含字节数组的变量 return buffer.getInt(); //ByteBuffer buffer = ByteBuffer.wrap(byteArray); // byteArray 是包含字节数组的变量 //return buffer.getInt(); int decimalValue = 0; for (int i = 0; i < byteArray.length; i++) { decimalValue = (decimalValue << 8) | (byteArray[i] & 0xFF); } return decimalValue; } src/main/java/com/ard/utils/tcp/ClientHandler.java
@@ -175,7 +175,7 @@ if (!crc32Check) { log.debug("CRC32校验不通过"); } else { log.debug("CRC32校验通过"); //log.debug("CRC32校验通过"); } //endregion //log.info("原始数据:" + DatatypeConverter.printHexBinary(data)); @@ -188,6 +188,7 @@ // log.info("命令ID:" + DatatypeConverter.printHexBinary(cmdId)); byte[] payloadSize = Arrays.copyOfRange(data, 2, 4);//有效负载大小 payloadSize = ByteUtils.toLittleEndian(payloadSize); //log.info("payloadSize:" + DatatypeConverter.printHexBinary(payloadSize)); int payloadSizeToDecimal = ByteUtils.bytesToDecimal(payloadSize); // log.info("有效负载大小(转整型):" + payloadSizeToDecimal); //endregion @@ -462,12 +463,16 @@ byte[] fTy = Arrays.copyOfRange(data, 12, 16); fTy = ByteUtils.toLittleEndian(fTy); float ty= ByteUtils.bytesToFloat(fTy); if (ty < 0) { ty += 360; } log.debug("俯仰:" + ty); Map<String,Object>forceGuideMap=new HashMap<>(); forceGuideMap.put("distance", distance); forceGuideMap.put("p",tx); forceGuideMap.put("t",ty); forceGuideMap.put("z",1); forceGuideMap.put("radarId",radarId); log.debug("强制引导信息" + forceGuideMap); //endregion MqttProducer.publish(2, false, "radarForceGuide", JSON.toJSONString(forceGuideMap)); } @@ -475,5 +480,4 @@ log.error("雷达报文解析异常:" + ex.getMessage()); } } }