‘liusuyi’
2023-11-09 092d7c56bb8653075b8f4b27220e69e6bb8e5d37
src/main/java/com/ard/utils/tcp/ClientHandler.java
@@ -6,7 +6,7 @@
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;
@@ -17,9 +17,7 @@
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;
@@ -43,7 +41,7 @@
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
    public void channelActive(ChannelHandlerContext ctx) {
        context = ctx;
        startHeartbeatTask();//开始发送心跳
    }
@@ -145,7 +143,7 @@
            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);
@@ -177,7 +175,7 @@
            if (!crc32Check) {
                log.debug("CRC32校验不通过");
            } else {
                log.debug("CRC32校验通过");
                //log.debug("CRC32校验通过");
            }
            //endregion
            //log.info("原始数据:" + DatatypeConverter.printHexBinary(data));
@@ -190,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
@@ -305,7 +304,7 @@
                    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);
@@ -322,6 +321,21 @@
                    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状态反馈
@@ -420,25 +434,50 @@
                    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());
        }
    }
}
}