| | |
| | | import com.ard.alarm.radar.domain.RadarAlarmData; |
| | | import com.ard.utils.other.ByteUtils; |
| | | import com.ard.utils.other.GisUtils; |
| | | import com.ard.utils.mqtt.MqttConsumer; |
| | | import com.ard.utils.mqtt.MqttProducer; |
| | | import io.netty.buffer.ByteBuf; |
| | | import io.netty.channel.ChannelHandlerContext; |
| | | import io.netty.channel.ChannelId; |
| | |
| | | import javax.xml.bind.DatatypeConverter; |
| | | import java.net.InetSocketAddress; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | import java.util.concurrent.ScheduledFuture; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | |
| | | * @throws Exception |
| | | */ |
| | | @Override |
| | | public void channelActive(ChannelHandlerContext ctx) throws Exception { |
| | | public void channelActive(ChannelHandlerContext ctx) { |
| | | context = ctx; |
| | | startHeartbeatTask();//开始发送心跳 |
| | | } |
| | |
| | | byte[] heart = ByteUtils.appendArrays(header, payload, payloadCrc32, footer); |
| | | // byte[] heart = {0x01, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, (byte) 0x83, (byte) 0x88, 0x5d, 0x71, 0x01, 0x02, 0x00}; |
| | | String hexString = DatatypeConverter.printHexBinary(heart); |
| | | // log.debug("发送心跳:" + hexString); |
| | | // log.debug("发送心跳:" + hexString); |
| | | message.writeBytes(heart); |
| | | context.writeAndFlush(message); |
| | | |
| | |
| | | if (!crc32Check) { |
| | | log.debug("CRC32校验不通过"); |
| | | } else { |
| | | log.debug("CRC32校验通过"); |
| | | //log.debug("CRC32校验通过"); |
| | | } |
| | | //endregion |
| | | //log.info("原始数据:" + DatatypeConverter.printHexBinary(data)); |
| | |
| | | // 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 |
| | |
| | | float fTy = ByteUtils.bytesToFloat(afTy); |
| | | log.debug("垂直角度:" + fTy); |
| | | // 将角度转换为弧度 |
| | | double thetaRadians = Math.toRadians(fTy+90); |
| | | double thetaRadians = Math.toRadians(fTy + 90); |
| | | // 使用正弦函数计算对边长度 |
| | | Distance = Math.sin(thetaRadians) * Distance; |
| | | log.debug("目标投影距离(m):" + Distance); |
| | |
| | | radarAlarmInfos.add(ardAlarmRadar); |
| | | } |
| | | //endregion |
| | | if (StringUtils.isEmpty(alarmTime)) { |
| | | return; |
| | | } |
| | | if (targetNum == 0) { |
| | | return; |
| | | } |
| | | RadarAlarmData radarAlarmData = new RadarAlarmData(); |
| | | radarAlarmData.setRadarId(radarId); |
| | | radarAlarmData.setRadarName(radarName); |
| | | radarAlarmData.setAlarmTime(alarmTime); |
| | | radarAlarmData.setArdAlarmRadars(radarAlarmInfos); |
| | | MqttProducer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData)); |
| | | //抽油机状态MQTT队列 |
| | | radarAlarmData.setArdAlarmRadars(well); |
| | | MqttProducer.publish(2, false, "radarWellData", JSON.toJSONString(radarAlarmData)); |
| | | } |
| | | if (Arrays.equals(cmdId, new byte[]{0x04})) { |
| | | //region抽油机AI状态反馈 |
| | |
| | | //抽油机状态集合中装入数据 |
| | | byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64); |
| | | String alarmPointName = ByteUtils.bytesToStringZh(szName); |
| | | log.debug("抽油机状态报警信息:" + "【id】" + id + "【name】" + alarmPointName + "【alarmType】" + wellType + "【alarmTime】" + alarmTime); |
| | | ArdAlarmRadar wellAlarm = new ArdAlarmRadar(); |
| | | wellAlarm.setTargetId(id); |
| | | wellAlarm.setName(alarmPointName); |
| | |
| | | well.add(wellAlarm); |
| | | } |
| | | //endregion |
| | | if (StringUtils.isEmpty(alarmTime)) { |
| | | return; |
| | | } |
| | | if (targetNum == 0) { |
| | | return; |
| | | } |
| | | RadarAlarmData radarAlarmData = new RadarAlarmData(); |
| | | radarAlarmData.setRadarId(radarId); |
| | | radarAlarmData.setRadarName(radarName); |
| | | radarAlarmData.setAlarmTime(alarmTime); |
| | | radarAlarmData.setArdAlarmRadars(radarAlarmInfos); |
| | | MqttProducer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData)); |
| | | //抽油机状态MQTT队列 |
| | | radarAlarmData.setArdAlarmRadars(well); |
| | | MqttProducer.publish(2, false, "radarWellData", JSON.toJSONString(radarAlarmData)); |
| | | } |
| | | if (StringUtils.isEmpty(alarmTime)) { |
| | | return; |
| | | if (Arrays.equals(cmdId, new byte[]{0x02})) { |
| | | //region 告警前端发送的强制引导信息 |
| | | byte[] iDistance = Arrays.copyOfRange(data, 4, 8); |
| | | iDistance = ByteUtils.toLittleEndian(iDistance); |
| | | long distance = ByteUtils.bytesToDecimal(iDistance); |
| | | log.info("目标当前距离(m):" + distance); |
| | | byte[] fTx = Arrays.copyOfRange(data, 8, 12); |
| | | fTx = ByteUtils.toLittleEndian(fTx); |
| | | float tx = ByteUtils.bytesToFloat(fTx); |
| | | log.debug("方位:" + tx); |
| | | 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("radarId", radarId); |
| | | log.debug("强制引导信息" + forceGuideMap); |
| | | //endregion |
| | | MqttProducer.publish(2, false, "radarForceGuide", JSON.toJSONString(forceGuideMap)); |
| | | } |
| | | if (targetNum == 0) { |
| | | return; |
| | | } |
| | | RadarAlarmData radarAlarmData = new RadarAlarmData(); |
| | | radarAlarmData.setRadarId(radarId); |
| | | radarAlarmData.setRadarName(radarName); |
| | | radarAlarmData.setAlarmTime(alarmTime); |
| | | radarAlarmData.setArdAlarmRadars(radarAlarmInfos); |
| | | MqttConsumer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData)); |
| | | //抽油机状态MQTT队列 |
| | | radarAlarmData.setArdAlarmRadars(well); |
| | | MqttConsumer.publish(2, false, "radarWellData", JSON.toJSONString(radarAlarmData)); |
| | | } catch (Exception ex) { |
| | | log.error("雷达报文解析异常:" + ex.getMessage()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |