src/main/java/com/ard/alarm/radar/controller/RadarController.java
@@ -41,39 +41,38 @@ if (ardEquipRadar == null) { return AjaxResult.error("é·è¾¾ä¸åå¨"); } Channel channel = (Channel)ClientInitialize.SuccessConnectMap.get(ardEquipRadar.getId()); if (channel==null) { Channel channel = ClientInitialize.SucChannelMap.get(ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort()); if (channel == null) { return AjaxResult.error("é·è¾¾æªè¿æ¥"); } Double longitude = ardEquipRadar.getLongitude();//é·è¾¾ç»åº¦ Double latitude = ardEquipRadar.getLatitude();//é·è¾¾çº¬åº¦ Double altitude = ardEquipRadar.getAltitude();//é·è¾¾é«åº¦ //è®¡ç®æ°´å¹³è§åº¦ float p = (float)GisUtils.getNorthAngle(longitude, latitude, targetPosition[0], targetPosition[1]); float p = (float) GisUtils.getNorthAngle(longitude, latitude, targetPosition[0], targetPosition[1]); //计ç®åç´è§åº¦ double[] radarPosition = new double[2]; radarPosition[0] = longitude; radarPosition[1] = latitude; double distance = GisUtils.getDistance(radarPosition, targetPosition); float angleInRadians = (float)Math.atan(distance / altitude); float t = (90-(float)Math.toDegrees(angleInRadians))*-1; log.debug("distanceï¼"+distance); log.debug("pï¼"+p); log.debug("tï¼"+t); float angleInRadians = (float) Math.atan(distance / altitude); 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, 0x20, 0x00};//è´è½½å¤´ byte[] distanceBytes = ByteUtils.decimalToBytes((int)distance); distanceBytes=ByteUtils.toLittleEndian(distanceBytes); byte[] distanceBytes = ByteUtils.decimalToBytes((int) distance); distanceBytes = ByteUtils.toLittleEndian(distanceBytes); byte[] pBytes = ByteUtils.floatToBytes(p); pBytes=ByteUtils.toLittleEndian(pBytes); 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);//è´è½½ tBytes = ByteUtils.toLittleEndian(tBytes); byte[] resBytes = new byte[20]; byte[] payloadBody = ByteUtils.appendArrays(distanceBytes, pBytes, tBytes, resBytes);//è´è½½ byte[] payload = ByteUtils.appendArrays(payloadHeader,payloadBody);//è´è½½å¤´+è´è½½ byte[] payload = ByteUtils.appendArrays(payloadHeader, payloadBody);//è´è½½å¤´+è´è½½ byte[] payloadCrc32 = ByteUtils.parseCrc32(payload);//è´è½½å¤´+è´è½½çcrc32æ ¡éª byte[] footer = {0x01, 0x02, 0x00};//å å°¾ byte[] data = ByteUtils.appendArrays(header, payload, payloadCrc32, footer); src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInboundHandlerAdapter.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInitializer.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/BootNettyClient.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannel.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannelCache.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/BootNettyClientThread.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/ClientHandler.java
@@ -8,7 +8,6 @@ import com.ard.utils.util.GisUtils; import com.ard.utils.mqtt.MqttProducer; import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelId; import io.netty.channel.SimpleChannelInboundHandler; @@ -17,7 +16,6 @@ import javax.xml.bind.DatatypeConverter; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ScheduledFuture; @@ -58,19 +56,19 @@ */ @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { ChannelId id = ctx.channel().id(); InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress(); int port = ipSocket.getPort(); String host = ipSocket.getHostString(); log.error("ä¸è®¾å¤" + host + ":" + port + "è¿æ¥æå¼!"); ArdEquipRadar ardEquipRadar = ClientInitialize.tureConnectMap.get(host+ ":" + port); String ipPort = ipSocket.getHostString() + ":" + ipSocket.getPort(); log.error("ä¸è®¾å¤" + ipPort + "è¿æ¥æå¼!"); // è¿æ¥æå¼åçæåå¤ç ctx.pipeline().remove(this); ctx.deregister(); ctx.close(); // å°å¤±è´¥ä¿¡æ¯æå ¥Setéå ClientInitialize.falseConnectSet.add(ardEquipRadar); ArdEquipRadar radar = ClientInitialize.trueConnectMap.get(ipPort); if (radar != null) { ClientInitialize.falseConnectSet.add(radar); ClientInitialize.trueConnectMap.remove(ipPort); } super.channelInactive(ctx); } @@ -83,20 +81,26 @@ * @throws Exception */ @Override public void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { public void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) { InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress(); int port = ipSocket.getPort(); String host = ipSocket.getHostString(); ArdEquipRadar ardEquipRadar = ClientInitialize.tureConnectMap.get(host+":"+port); MessageParsing messageParsing = ClientInitialize.MessageMap.get(host + ":" + port); String ipPort = ipSocket.getHostString() + ":" + ipSocket.getPort(); ArdEquipRadar radar = ClientInitialize.trueConnectMap.get(ipPort); if (radar == null) { return; } MessageHandler messageHandler = ClientInitialize.SucMessageHandlerMap.get(ipPort); if (messageHandler == null) { return; } // å¤çæ¥æ¶å°çæ¶æ¯ byte[] byteArray = new byte[msg.readableBytes()]; msg.getBytes(msg.readerIndex(), byteArray); byte[] bytes = messageParsing.receiveCompletePacket(byteArray); byte[] bytes = messageHandler.receiveCompletePacket(byteArray); if (bytes != null) { processData(ardEquipRadar, bytes); processData(radar, bytes); } } /** * ééæ°æ®å¤ç宿 @@ -148,7 +152,7 @@ byte[] payloadCrc32 = ByteUtils.parseCrc32(payload); byte[] footer = {0x01, 0x02, 0x00}; 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}; //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); message.writeBytes(heart); @@ -170,15 +174,15 @@ /** * è§£ææ¥è¦æ°æ® */ public void processData(ArdEquipRadar ardEquipRadarbyte, byte[] data) { public void processData(ArdEquipRadar radar, byte[] data) { try { String radarId = ardEquipRadarbyte.getId(); String radarName = ardEquipRadarbyte.getName(); Double radarLongitude = ardEquipRadarbyte.getLongitude(); Double radarLagitude = ardEquipRadarbyte.getLatitude(); Double radarAltitude = ardEquipRadarbyte.getAltitude(); String radarId = radar.getId(); String radarName = radar.getName(); Double radarLongitude = radar.getLongitude(); Double radarLagitude = radar.getLatitude(); Double radarAltitude = radar.getAltitude(); //region crcæ ¡éª-ç®åä» ç¨äºæ¾ç¤ºæ ¡éªç»æ Boolean crc32Check = MessageParsing.CRC32Check(data); Boolean crc32Check = MessageHandler.CRC32Check(data); if (!crc32Check) { log.debug("CRC32æ ¡éªä¸éè¿"); } else { @@ -187,12 +191,12 @@ //endregion //log.info("åå§æ°æ®:" + DatatypeConverter.printHexBinary(data)); //log.info("é·è¾¾ä¿¡æ¯ï¼" + host + "ãportã" + port + "ãXã" + longitude + "ãYã" + lagitude + "ãZã" + altitude); data = MessageParsing.transferData(data);//廿å 头åå å°¾ãæ ¡éªåè½¬ä¹ data = MessageHandler.transferData(data);//廿å 头åå å°¾ãæ ¡éªåè½¬ä¹ //region è´è½½å¤´è§£æ byte[] type = Arrays.copyOfRange(data, 0, 1);//å½ä»¤ç±»å // log.info("å½ä»¤ç±»å:" + DatatypeConverter.printHexBinary(type)); byte[] cmdId = Arrays.copyOfRange(data, 1, 2);//å½ä»¤ID String cmdIdStr=DatatypeConverter.printHexBinary(cmdId); String cmdIdStr = DatatypeConverter.printHexBinary(cmdId); //log.info("å½ä»¤ID:" + DatatypeConverter.printHexBinary(cmdId)); byte[] payloadSize = Arrays.copyOfRange(data, 2, 4);//ææè´è½½å¤§å° payloadSize = toLittleEndian(payloadSize); @@ -206,7 +210,7 @@ List<ArdAlarmRadar> well = new ArrayList<>(); String alarmTime = ""; Integer targetNum = 0; log.debug("å¤çé·è¾¾"+radarName+"æ°æ®-->å½ä»¤ID:"+cmdIdStr); log.debug("å¤çé·è¾¾" + radarName + "æ°æ®-->å½ä»¤ID:" + cmdIdStr); //é·è¾¾ç§»å¨é²ç«æ¥è¦ if (Arrays.equals(cmdId, new byte[]{0x01})) { //region åè¦ä¿¡æ¯åé¦ @@ -315,15 +319,14 @@ double thetaRadians = Math.toRadians(fTy + 90); // ä½¿ç¨æ£å¼¦å½æ°è®¡ç®å¯¹è¾¹é¿åº¦ Distance = Math.sin(thetaRadians) * Distance; if(Distance<0) { if (Distance < 0) { continue;//è¿æ»¤è·ç¦»å°äº0çèæ°æ® } //log.debug("ç®æ æå½±è·ç¦»(m):" + Distance); Double[] radarXY = {radarLongitude, radarLagitude}; Double[] alarmXY = GisUtils.CalculateCoordinates(radarXY, Distance, (double) fTx); log.debug("æ¥è¦ä¿¡æ¯ï¼" + "ãradarNameã" + radarName + "ãtargetIdã"+ targetId + "ãalarmTypeã" + alarmType + "ãalarmTimeã" + alarmTime + "ãnameã" + alarmPointName+"ãDistanceã"+Distance); log.debug("æ¥è¦ä¿¡æ¯ï¼" + "ãradarNameã" + radarName + "ãtargetIdã" + targetId + "ãalarmTypeã" + alarmType + "ãalarmTimeã" + alarmTime + "ãnameã" + alarmPointName + "ãDistanceã" + Distance); ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar(); ardAlarmRadar.setTargetId(targetId); ardAlarmRadar.setName(alarmPointName); @@ -350,7 +353,7 @@ radarAlarmData.setAlarmTime(alarmTime); radarAlarmData.setArdAlarmRadars(radarAlarmInfos); MqttProducer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData)); if (radarFollowInfos.size() >0) { if (radarFollowInfos.size() > 0) { radarAlarmData.setArdFollowRadars(radarFollowInfos); //å½åé·è¾¾æ«æåå¨å¼å¯¼è·è¸ªæ°æ®ï¼åªä¿çæå䏿¬¡éå®çæ°æ® MqttProducer.publish(2, false, "radarFollowGuide", JSON.toJSONString(radarAlarmData)); @@ -437,7 +440,7 @@ //log.info("æå±åè¦åºååç§°:" + DatatypeConverter.printHexBinary(szName)); String alarmPointName = ByteUtils.bytesToStringZh(szName); // log.info("æå±åè¦åºååç§°:" + alarmPointName); log.debug("æ¥è¦ä¿¡æ¯ï¼"+ "ãradarNameã" + radarName + "ãtargetIdã" + targetId + "ãnameã" + alarmPointName + "ãalarmTypeã" + alarmType + "ãalarmTimeã" + alarmTime); log.debug("æ¥è¦ä¿¡æ¯ï¼" + "ãradarNameã" + radarName + "ãtargetIdã" + targetId + "ãnameã" + alarmPointName + "ãalarmTypeã" + alarmType + "ãalarmTimeã" + alarmTime); ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar(); ardAlarmRadar.setTargetId(targetId); ardAlarmRadar.setName(alarmPointName); src/main/java/com/ard/utils/netty/tcp/ClientHelper.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java
@@ -1,13 +1,5 @@ package com.ard.utils.netty.tcp; /** * @Description: * @ClassName: init * @Author: åèä¹ * @Date: 2023å¹´07æ05æ¥13:11 * @Version: 1.0 **/ import com.ard.alarm.radar.domain.ArdEquipRadar; import com.ard.alarm.radar.service.IArdEquipRadarService; import com.ard.utils.netty.config.NettyTcpConfiguration; @@ -37,17 +29,18 @@ @Component @Slf4j(topic = "netty") @Order(2) public class ClientInitialize implements ApplicationRunner{ public class ClientInitialize implements ApplicationRunner { @Resource NettyTcpConfiguration nettyTcpConfig; @Resource IArdEquipRadarService ardEquipRadarService; private Bootstrap bootstrap; public static CopyOnWriteArraySet<ArdEquipRadar> falseConnectSet = new CopyOnWriteArraySet(); public static ConcurrentHashMap<String, ArdEquipRadar> tureConnectMap = new ConcurrentHashMap(); public static ConcurrentHashMap<String, Object> SuccessConnectMap = new ConcurrentHashMap(); public static ConcurrentHashMap<String, MessageParsing> MessageMap = new ConcurrentHashMap(); public static CopyOnWriteArraySet<ArdEquipRadar> falseConnectSet = new CopyOnWriteArraySet();//å¤±è´¥è¿æ¥çé·è¾¾Set public static ConcurrentHashMap<String, ArdEquipRadar> trueConnectMap = new ConcurrentHashMap();//æåè¿æ¥çip端å£å¯¹åºçé·è¾¾ public static ConcurrentHashMap<String, MessageHandler> SucMessageHandlerMap = new ConcurrentHashMap();//æåè¿æ¥çip端å£å¯¹åºçæ¥æè§£æå¨ public static ConcurrentHashMap<String, Channel> SucChannelMap = new ConcurrentHashMap();//æåè¿æ¥çip端å£å¯¹åºçnettyéé /** * Nettyåå§åé ç½® */ @@ -65,7 +58,7 @@ } }); // 弿¥æç»çå¬è¿æ¥å¤±è´¥çå°å //弿¥æç»çå¬è¿æ¥å¤±è´¥çå°å CompletableFuture.runAsync(new Runnable() { @Override public void run() { @@ -75,8 +68,8 @@ // 循ç¯éåå å ç´ falseConnectSet.forEach(new Consumer<ArdEquipRadar>() { @Override public void accept(ArdEquipRadar ardEquipRadar) { connectServer(ardEquipRadar); public void accept(ArdEquipRadar radar) { connectServer(radar); } }); } @@ -99,24 +92,23 @@ // è·åå°ååç«¯å£ String host = ardEquipRadar.getIp(); Integer port = ardEquipRadar.getPort(); String ipPort = host + ":" + port; // 弿¥è¿æ¥tcpæå¡ç«¯ bootstrap.remoteAddress(host, port).connect().addListener((ChannelFuture futureListener) -> { if (!futureListener.isSuccess()) { log.debug("é·è¾¾ã" + host + ":" + port + "ãè¿æ¥å¤±è´¥"); futureListener.channel().close(); // è¿æ¥å¤±è´¥ä¿¡æ¯æå ¥Set falseConnectSet.add(ardEquipRadar); // è¿æ¥å¤±è´¥ä¿¡æ¯ä»mapç§»é¤ tureConnectMap.remove( host + ":" + port); SuccessConnectMap.remove(ardEquipRadar.getId()); } else { log.debug("é·è¾¾ã" + host + ":" + port + "ãè¿æ¥æå"); if (futureListener.isSuccess()) { log.debug("é·è¾¾ã" + ipPort + "ãè¿æ¥æå"); // è¿æ¥æåä¿¡æ¯ä»Setæé¤ falseConnectSet.remove(ardEquipRadar); // è¿æ¥æåä¿¡æ¯åå ¥map tureConnectMap.put(host+":"+port, ardEquipRadar); MessageMap.put(host+":"+port,new MessageParsing()); SuccessConnectMap.put(ardEquipRadar.getId(),futureListener.channel()); trueConnectMap.put(ipPort, ardEquipRadar); SucMessageHandlerMap.put(ipPort, new MessageHandler()); SucChannelMap.put(ipPort, futureListener.channel()); } else { log.debug("é·è¾¾ã" + ipPort + "ãè¿æ¥å¤±è´¥"); futureListener.channel().close(); // è¿æ¥å¤±è´¥ä¿¡æ¯æå ¥Set falseConnectSet.add(ardEquipRadar); } }); } @@ -134,7 +126,7 @@ for (ArdEquipRadar ardEquipRadar : ardEquipRadars) { String host = ardEquipRadar.getIp(); Integer port = Integer.valueOf(ardEquipRadar.getPort()); log.debug("TCP client try to connect radarã" + host + ":" + port+"ã"); log.debug("TCP client try to connect radarã" + host + ":" + port + "ã"); connectServer(ardEquipRadar);//è¿æ¥æ¯ä¸ä¸ªé·è¾¾æå¡ } } src/main/java/com/ard/utils/netty/tcp/DynamicClient.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/DynamicClientHandler.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/DynamicClientInitializer.java
ÎļþÒÑɾ³ý src/main/java/com/ard/utils/netty/tcp/MessageHandler.java
ÎļþÃû´Ó src/main/java/com/ard/utils/netty/tcp/MessageParsing.java ÐÞ¸Ä @@ -14,7 +14,7 @@ * @Date: 2023å¹´07æ03æ¥15:30 * @Version: 1.0 **/ public class MessageParsing { public class MessageHandler { // å建ç¼å²åºå表 private List<Byte> buffer = new ArrayList<>();