From 8f224dbf1a1bd1a65dead7ceda8dd0a3fa567115 Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期四, 28 十二月 2023 15:57:09 +0800 Subject: [PATCH] 优化雷达tcp客户端 --- /dev/null | 25 -------- src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java | 52 +++++++---------- src/main/java/com/ard/utils/netty/tcp/ClientHandler.java | 67 +++++++++++---------- src/main/java/com/ard/alarm/radar/controller/RadarController.java | 31 +++++----- src/main/java/com/ard/utils/netty/tcp/MessageHandler.java | 2 5 files changed, 73 insertions(+), 104 deletions(-) diff --git a/src/main/java/com/ard/alarm/radar/controller/RadarController.java b/src/main/java/com/ard/alarm/radar/controller/RadarController.java index 5cd3e6c..ad455e3 100644 --- a/src/main/java/com/ard/alarm/radar/controller/RadarController.java +++ b/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);//璐熻浇澶�+璐熻浇鐨刢rc32鏍¢獙 byte[] footer = {0x01, 0x02, 0x00};//鍖呭熬 byte[] data = ByteUtils.appendArrays(header, payload, payloadCrc32, footer); diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInboundHandlerAdapter.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInboundHandlerAdapter.java deleted file mode 100644 index 5e49218..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInboundHandlerAdapter.java +++ /dev/null @@ -1,439 +0,0 @@ -package com.ard.utils.netty.tcp; - -import com.alibaba.fastjson2.JSON; -import com.ard.alarm.radar.domain.ArdAlarmRadar; -import com.ard.alarm.radar.domain.ArdEquipRadar; -import com.ard.alarm.radar.domain.RadarAlarmData; -import com.ard.utils.mqtt.MqttProducer; -import com.ard.utils.util.ByteUtils; -import com.ard.utils.util.GisUtils; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.EmptyByteBuf; -import io.netty.channel.*; -import io.netty.util.CharsetUtil; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; - -import javax.xml.bind.DatatypeConverter; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.text.SimpleDateFormat; -import java.util.*; - -import static com.ard.utils.util.ByteUtils.byteToBitString; -import static com.ard.utils.util.ByteUtils.toLittleEndian; - -@Slf4j(topic = "netty") -public class BootNettyChannelInboundHandlerAdapter extends SimpleChannelInboundHandler<ByteBuf> { - - /** - * 浠庢湇鍔$鏀跺埌鏂扮殑鏁版嵁鏃讹紝杩欎釜鏂规硶浼氬湪鏀跺埌娑堟伅鏃惰璋冪敤 - */ - @Override - protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) { - InetSocketAddress inSocket = (InetSocketAddress) ctx.channel().remoteAddress(); - String host = inSocket.getAddress().getHostAddress(); - int port = inSocket.getPort(); - //log.info("鏀跺埌鏉ヨ嚜 {}:{} 鐨勬暟鎹畕}", host, port,msg.toString(CharsetUtil.UTF_8)); - ArdEquipRadar ardEquipRadar = BootNettyClientChannelCache.getRadar(host + ":" + port); - if (ardEquipRadar != null) { - //// 鍒涘缓缂撳啿涓瓧鑺傛暟鐨勫瓧鑺傛暟缁� - //byte[] byteArray = new byte[msg.readableBytes()]; - //// 鍐欏叆鏁扮粍 - //msg.readBytes(byteArray); - //// 澶勭悊鎺ユ敹鍒扮殑娑堟伅 - //byte[] bytes = MessageParsing.receiveCompletePacket(byteArray); - //if (bytes != null) { - // processData(ardEquipRadar, bytes); - //} - } - } - - /** - * 浠庢湇鍔$鏀跺埌鏂扮殑鏁版嵁銆佽鍙栧畬鎴愭椂璋冪敤 - */ - @Override - public void channelReadComplete(ChannelHandlerContext ctx) throws IOException { - //System.out.println("channelReadComplete"); - ctx.flush(); - } - - /** - * 褰撳嚭鐜� Throwable 瀵硅薄鎵嶄細琚皟鐢紝鍗冲綋 Netty 鐢变簬 IO 閿欒鎴栬�呭鐞嗗櫒鍦ㄥ鐞嗕簨浠舵椂鎶涘嚭鐨勫紓甯告椂 - */ - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws IOException { -// System.out.println("exceptionCaught"); - cause.printStackTrace(); - ctx.close();//鎶涘嚭寮傚父锛屾柇寮�涓庡鎴风鐨勮繛鎺� - } - - /** - * 瀹㈡埛绔笌鏈嶅姟绔涓�娆″缓绔嬭繛鎺ユ椂 鎵ц - */ - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - // 瀹㈡埛绔笌鏈嶅姟绔� 寤虹珛杩炴帴 - InetSocketAddress inSocket = (InetSocketAddress) ctx.channel().remoteAddress(); - String host = inSocket.getAddress().getHostAddress(); - int port = inSocket.getPort(); - log.debug("杩炴帴鎴愬姛锛氥��" + host + ":" + port + "銆�"); - } - - /** - * 瀹㈡埛绔笌鏈嶅姟绔� 鏂繛鏃� 鎵ц - */ - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - super.channelInactive(ctx); - InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress(); - int port = ipSocket.getPort(); - String host = ipSocket.getHostString(); - log.error("涓庤澶�" + host + ":" + port + "杩炴帴鏂紑!"); - // 閲嶈繛 - ArdEquipRadar ardEquipRadar = BootNettyClientChannelCache.getRadar(host + ":" + port); - if (ardEquipRadar != null) { - BootNettyClientThread thread = new BootNettyClientThread(ardEquipRadar); - thread.start(); - } - } - - /** - * 瑙f瀽鎶ヨ鏁版嵁 - */ - public void processData(ArdEquipRadar ardEquipRadarbyte, byte[] data) { - try { - String radarId = ardEquipRadarbyte.getId(); - String radarName = ardEquipRadarbyte.getName(); - Double radarLongitude = ardEquipRadarbyte.getLongitude(); - Double radarLagitude = ardEquipRadarbyte.getLatitude(); - Double radarAltitude = ardEquipRadarbyte.getAltitude(); - //region crc鏍¢獙-鐩墠浠呯敤浜庢樉绀烘牎楠岀粨鏋� - Boolean crc32Check = MessageParsing.CRC32Check(data); - if (!crc32Check) { - log.debug("CRC32鏍¢獙涓嶉�氳繃"); - } else { - //log.debug("CRC32鏍¢獙閫氳繃"); - } - //endregion - //log.info("鍘熷鏁版嵁:" + DatatypeConverter.printHexBinary(data)); - //log.info("闆疯揪淇℃伅锛�" + host + "銆恜ort銆�" + port + "銆怷銆�" + longitude + "銆怸銆�" + lagitude + "銆怹銆�" + altitude); - data = MessageParsing.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); - //log.info("鍛戒护ID:" + DatatypeConverter.printHexBinary(cmdId)); - byte[] payloadSize = Arrays.copyOfRange(data, 2, 4);//鏈夋晥璐熻浇澶у皬 - payloadSize = toLittleEndian(payloadSize); - //log.info("payloadSize:" + DatatypeConverter.printHexBinary(payloadSize)); - int payloadSizeToDecimal = ByteUtils.bytesToDecimal(payloadSize); - // log.info("鏈夋晥璐熻浇澶у皬(杞暣鍨�):" + payloadSizeToDecimal); - //endregion - List<ArdAlarmRadar> radarAlarmInfos = new ArrayList<>(); - ArdAlarmRadar radarFollowInfo = null; - //鎶芥补鏈虹姸鎬侀浄杈炬帹閫侀泦鍚� - List<ArdAlarmRadar> well = new ArrayList<>(); - String alarmTime = ""; - Integer targetNum = 0; - log.debug("Processing radar data 銆�" + radarName + "銆戞暟鎹�-->鍛戒护ID:" + cmdIdStr + "浜岃繘鍒�:" + byteToBitString(cmdId[0])); - //闆疯揪绉诲姩闃茬伀鎶ヨ - if (Arrays.equals(cmdId, new byte[]{0x01})) { - //region 鍛婅淇℃伅鍙嶉 - byte[] dwTim = Arrays.copyOfRange(data, 4, 8); - dwTim = toLittleEndian(dwTim); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - long l = ByteUtils.bytesToDecimal(dwTim); - alarmTime = sdf.format(l * 1000); - // log.info("鍛ㄨ鍥惧儚鐨勫嚭鐜版椂闂�(杞琩ate):" + alarmTime); - - byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10); - wTargetNum = toLittleEndian(wTargetNum); - targetNum = ByteUtils.bytesToDecimal(wTargetNum); - if (targetNum == 0) { - return; - } - //log.debug("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum); - - //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟) - int uintSize = (payloadSizeToDecimal - 64) / targetNum; - // log.info("鍗曟潯鎶ヨ澶у皬:" + uintSize); - - for (int i = 0; i < targetNum; i++) { - - Integer index = 68 + uintSize * i; - byte[] dwID = Arrays.copyOfRange(data, index, index + 4); - // log.info("鐩爣ID:" + DatatypeConverter.printHexBinary(cmdId)); - dwID = toLittleEndian(dwID); - int targetId = ByteUtils.bytesToDecimal(dwID); - // log.info("鐩爣ID鍙凤細" + targetId); - - byte[] iDistance = Arrays.copyOfRange(data, index + 8, index + 12); - iDistance = toLittleEndian(iDistance); - double Distance = ByteUtils.bytesToDecimal(iDistance); - //log.debug("鐩爣褰撳墠鐩寸嚎璺濈(m):" + Distance); - - //region 涓嶉渶瑕佺殑瀛楁 -// byte[] dwGSum = Arrays.copyOfRange(data, index + 4, index + 8); -// dwGSum = toLittleEndian(dwGSum); -// int GSum = byteArrayToDecimal(dwGSum); -// log.info("鐩爣褰撳墠鍍忕礌鐏板害鍜岋細" + GSum); -// byte[] iTw = Arrays.copyOfRange(data, index + 12, index + 16); -// iTw = toLittleEndian(iTw); -// int Tw = byteArrayToDecimal(iTw); -// log.info("鐩爣褰撳墠鐨勫儚绱犲搴�:" + Tw); -// -// byte[] iTh = Arrays.copyOfRange(data, index + 16, index + 20); -// iTh = toLittleEndian(iTh); -// int Th = byteArrayToDecimal(iTh); -// log.info("鐩爣褰撳墠鐨勫儚绱犻珮搴�:" + Th); -// -// byte[] wPxlArea = Arrays.copyOfRange(data, index + 20, index + 22); -// wPxlArea = toLittleEndian(wPxlArea); -// int PxlArea = byteArrayToDecimal(wPxlArea); -// log.info("鐩爣褰撳墠鍍忕礌闈㈢Н:" + PxlArea); -// -// byte[] cTrkNum = Arrays.copyOfRange(data, index + 22, index + 23); -// cTrkNum = toLittleEndian(cTrkNum); -// int TrkNum = byteArrayToDecimal(cTrkNum); -// log.info("杞ㄨ抗鐐规暟:" + TrkNum); - -// byte[] sVx = Arrays.copyOfRange(data, index + 24, index + 26); -// sVx = toLittleEndian(sVx); -// int Vx = byteArrayToDecimal(sVx); -// log.info("鐩爣褰撳墠閫熷害鐭㈤噺(鍍忕礌璺濈)X:" + Vx); -// -// byte[] sVy = Arrays.copyOfRange(data, index + 26, index + 28); -// sVy = toLittleEndian(sVy); -// int Vy = byteArrayToDecimal(sVy); -// log.info("鐩爣褰撳墠閫熷害鐭㈤噺(鍍忕礌璺濈)Y:" + Vy); -// -// byte[] sAreaNo = Arrays.copyOfRange(data, index + 28, index + 30); -// sAreaNo = toLittleEndian(sAreaNo); -// int AreaNo = byteArrayToDecimal(sAreaNo); -// log.info("鐩爣褰掑睘鐨勫憡璀﹀尯鍩熷彿:" + AreaNo); -// -// byte[] cGrp = Arrays.copyOfRange(data, index + 30, index + 31); -// cGrp = toLittleEndian(cGrp); -// int Grp = byteArrayToDecimal(cGrp); -// log.info("鎵�灞炵粍:" + Grp); - //endregion - String alarmType = ""; - byte[] cStat = Arrays.copyOfRange(data, index + 23, index + 24); - log.info("鍘熷鐘舵��:" + byteToBitString(cStat[0])); - // cStat = toLittleEndian(cStat); - // 鎻愬彇绗�4浣嶈嚦绗�6浣嶇殑鍊� - int extractedValue = (cStat[0] >> 4) & 0b00001111; - // 鍒ゆ柇鎻愬彇鐨勫�� - if (extractedValue == 0b0000) { - alarmType = "杩愬姩鐩爣妫�娴�"; - } else if (extractedValue == 0b0001) { - alarmType = "鐑簮妫�娴�"; - } - // log.info("鎶ヨ绫诲瀷:" + alarmType); - byte[] szName = Arrays.copyOfRange(data, index + 64, index + 96); - String alarmPointName = ByteUtils.bytesToStringZh(szName); - // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName); - byte[] afTx = Arrays.copyOfRange(data, index + 96, index + 100); - afTx = toLittleEndian(afTx); - float fTx = ByteUtils.bytesToFloat(afTx); - // log.info("姘村钩瑙掑害:" + fTx); - byte[] afTy = Arrays.copyOfRange(data, index + 112, index + 116); - afTy = toLittleEndian(afTy); - float fTy = ByteUtils.bytesToFloat(afTy); - //log.debug("鍨傜洿瑙掑害:" + fTy); - // 灏嗚搴﹁浆鎹负寮у害 - double thetaRadians = Math.toRadians(fTy + 90); - // 浣跨敤姝e鸡鍑芥暟璁$畻瀵硅竟闀垮害 - Distance = Math.sin(thetaRadians) * Distance; - //log.debug("鐩爣鎶曞奖璺濈(m):" + Distance); - - Double[] radarXY = {radarLongitude, radarLagitude}; - Double[] alarmXY = GisUtils.CalculateCoordinates(radarXY, Distance, (double) fTx); - log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName); - ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar(); - ardAlarmRadar.setTargetId(targetId); - ardAlarmRadar.setName(alarmPointName); - ardAlarmRadar.setLongitude(alarmXY[0]); - ardAlarmRadar.setLatitude(alarmXY[1]); - ardAlarmRadar.setAlarmType(alarmType); - radarAlarmInfos.add(ardAlarmRadar); - - int bit1 = (cStat[0] >> 1) & 0x1; - //鐩爣鐨凚1=1 閿佸畾 - if (bit1 == 1) { - radarFollowInfo = ardAlarmRadar; - //灏嗚拷韪攣瀹氱殑鎶ヨ瀵硅薄灞炴�у鍒剁粰radarFollowInfo瀵硅薄 - //BeanUtils.copyProperties(ardAlarmRadar, radarFollowInfo); - } - } - //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)); - if (radarFollowInfo != null) { - //褰撳墠闆疯揪鎵弿瀛樺湪寮曞璺熻釜鏁版嵁锛屽彧淇濈暀鏈�鍚庝竴娆¢攣瀹氱殑鏁版嵁 - MqttProducer.publish(2, false, "radarFollowGuide", JSON.toJSONString(radarFollowInfo)); - } - //鎶芥补鏈虹姸鎬丮QTT闃熷垪 - radarAlarmData.setArdAlarmRadars(well); - MqttProducer.publish(2, false, "radarWellData", JSON.toJSONString(radarAlarmData)); - - } - //鎶芥补鏈篈I鐘舵�佸弽棣� - if (Arrays.equals(cmdId, new byte[]{0x04})) { - //region鎶芥补鏈篈I鐘舵�佸弽棣� - String hexString = DatatypeConverter.printHexBinary(data); - //log.info(hexString); - - byte[] dwTim = Arrays.copyOfRange(data, 4, 8); - dwTim = toLittleEndian(dwTim); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - long l = ByteUtils.bytesToDecimal(dwTim); - alarmTime = sdf.format(l * 1000); - //log.info("鍛ㄨ鍥惧儚鐨勫嚭鐜版椂闂�(杞琩ate):" + alarmTime); - - byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10); - wTargetNum = toLittleEndian(wTargetNum); - targetNum = ByteUtils.bytesToDecimal(wTargetNum); - //log.debug("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum); - if (targetNum == 0) { - return; - } - //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟) - int uintSize = (payloadSizeToDecimal - 64) / targetNum; - //log.info("鍗曟潯鎶ヨ澶у皬:" + uintSize); - for (int i = 0; i < targetNum; i++) { - Integer index = 68 + uintSize * i; - byte[] dwID = Arrays.copyOfRange(data, index, index + 4); - //log.info("鐩爣ID:" + DatatypeConverter.printHexBinary(dwID)); - dwID = toLittleEndian(dwID); - int targetId = ByteUtils.bytesToDecimal(dwID); - //log.info("鐩爣ID鍙凤細" + targetId); - //region 涓嶉渶瑕佺殑瀛楁 - byte[] iTw = Arrays.copyOfRange(data, index + 4, index + 8); - iTw = toLittleEndian(iTw); - int Tw = ByteUtils.bytesToDecimal(iTw); - // log.info("鐩爣褰撳墠鐨勫儚绱犲搴�:" + Tw); - - byte[] iTh = Arrays.copyOfRange(data, index + 8, index + 12); - iTh = toLittleEndian(iTh); - int Th = ByteUtils.bytesToDecimal(iTh); - //log.info("鐩爣褰撳墠鐨勫儚绱犻珮搴�:" + Th); - - byte[] fTx = Arrays.copyOfRange(data, index + 12, index + 16); - fTx = toLittleEndian(fTx); - float fTxAngle = ByteUtils.bytesToFloat(fTx); - //log.debug("p瑙掑害:" + fTxAngle); - byte[] fTy = Arrays.copyOfRange(data, index + 16, index + 20); - fTy = toLittleEndian(fTy); - float fTyAngle = ByteUtils.bytesToFloat(fTy); - //log.debug("t瑙掑害:" + fTyAngle); - - byte[] sAreaNo = Arrays.copyOfRange(data, index + 20, index + 22); - sAreaNo = toLittleEndian(sAreaNo); - int AreaNo = ByteUtils.bytesToDecimal(sAreaNo); - //log.debug("鐩爣褰掑睘鐨勫憡璀﹀尯鍩熷彿:" + AreaNo); - - byte[] cGrp = Arrays.copyOfRange(data, index + 22, index + 23); - cGrp = toLittleEndian(cGrp); - int Grp = ByteUtils.bytesToDecimal(cGrp); - //log.info("鎵�灞炵粍:" + Grp); - //endregion - String alarmType; - //鎶芥补鏈虹姸鎬佸彉閲� - String wellType; - byte[] cStat = Arrays.copyOfRange(data, index + 23, index + 24); - cStat = toLittleEndian(cStat); - //String binaryString = String.format("%8s", Integer.toBinaryString(cStat[0] & 0xFF)).replace(' ', '0'); - //log.info("鐩爣褰撳墠鐘舵��:" + binaryString); - // 鎻愬彇绗�0浣嶅�� - // 浣跨敤浣嶈繍绠楁搷浣滃垽鏂0浣嶆槸鍚︿负1 - boolean isB0 = (cStat[0] & 0x01) == 0x00; - // 鍒ゆ柇鎻愬彇鐨勫�� - if (isB0) { - alarmType = "闆疯揪鎶芥补鏈哄仠鏈�"; - byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64); - //log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + DatatypeConverter.printHexBinary(szName)); - String alarmPointName = ByteUtils.bytesToStringZh(szName); - // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName); - //log.debug("鎶ヨ淇℃伅锛�"+ "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime); - ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar(); - ardAlarmRadar.setTargetId(targetId); - ardAlarmRadar.setName(alarmPointName); - ardAlarmRadar.setAlarmType(alarmType); - radarAlarmInfos.add(ardAlarmRadar); - wellType = "鍋滄満"; - } else { - wellType = "杩愯"; - } - //鎶芥补鏈虹姸鎬侀泦鍚堜腑瑁呭叆鏁版嵁 - byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64); - String alarmPointName = ByteUtils.bytesToStringZh(szName); - log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恆larmType銆戞娊娌规満鐘舵�佹姤璀�" + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName + "銆恆larmState銆�" + wellType); - ArdAlarmRadar wellAlarm = new ArdAlarmRadar(); - wellAlarm.setTargetId(targetId); - wellAlarm.setName(alarmPointName); - wellAlarm.setAlarmType(wellType); - 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)); - //鎶芥补鏈虹姸鎬丮QTT闃熷垪 - radarAlarmData.setArdAlarmRadars(well); - MqttProducer.publish(2, false, "radarWellData", JSON.toJSONString(radarAlarmData)); - } - //寮哄埗寮曞 - if (Arrays.equals(cmdId, new byte[]{0x02})) { - //region 鍛婅鍓嶇鍙戦�佺殑寮哄埗寮曞淇℃伅 - byte[] iDistance = Arrays.copyOfRange(data, 4, 8); - iDistance = toLittleEndian(iDistance); - long distance = ByteUtils.bytesToDecimal(iDistance); - log.info("鐩爣褰撳墠璺濈(m):" + distance); - byte[] fTx = Arrays.copyOfRange(data, 8, 12); - fTx = toLittleEndian(fTx); - float tx = ByteUtils.bytesToFloat(fTx); - log.debug("鏂逛綅:" + tx); - byte[] fTy = Arrays.copyOfRange(data, 12, 16); - fTy = 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)); - } - } catch (Exception ex) { - log.error("闆疯揪鎶ユ枃瑙f瀽寮傚父:" + ex.getMessage()); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInitializer.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInitializer.java deleted file mode 100644 index d87b9ff..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInitializer.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ard.utils.netty.tcp; - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.codec.string.StringEncoder; -import io.netty.util.CharsetUtil; - -public class BootNettyChannelInitializer extends ChannelInitializer<SocketChannel> { - - @Override - protected void initChannel(SocketChannel ch){ - //ch.pipeline().addLast("encoder", new StringEncoder(CharsetUtil.UTF_8)); - //ch.pipeline().addLast("decoder", new StringDecoder(CharsetUtil.UTF_8)); - /** - * 鑷畾涔塁hannelInboundHandlerAdapter - */ - ch.pipeline().addLast(new BootNettyChannelInboundHandlerAdapter()); - } -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyClient.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyClient.java deleted file mode 100644 index 6a44e88..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/BootNettyClient.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.ard.utils.netty.tcp; - -import com.ard.alarm.radar.domain.ArdEquipRadar; -import com.ard.alarm.radar.service.IArdEquipRadarService; -import com.ard.utils.netty.config.NettyTcpConfiguration; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.nio.channels.SocketChannel; -import java.util.List; - -@Slf4j(topic = "netty") -@Component -public class BootNettyClient { - @Resource - IArdEquipRadarService ardEquipRadarService; - @Resource - NettyTcpConfiguration nettyTcpConfig; - - - static Integer waitTimes = 1; - static EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); - /** - * 鍒濆鍖朆ootstrap - */ - public static final Bootstrap getBootstrap(EventLoopGroup group) { - if (null == group) { - group = eventLoopGroup; - } - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(group).channel(NioSocketChannel.class) - .option(ChannelOption.TCP_NODELAY, true) - .option(ChannelOption.SO_KEEPALIVE, true) - .handler(new BootNettyChannelInitializer()); - return bootstrap; - } - - public void connect(ArdEquipRadar radar) throws Exception { - String host = radar.getIp(); - int port=radar.getPort(); - log.debug("姝e湪杩涜杩炴帴锛氥��" + host+":"+port+"銆�"); - eventLoopGroup.shutdownGracefully(); - eventLoopGroup = new NioEventLoopGroup(); - Bootstrap bootstrap = getBootstrap(null); - - try { - bootstrap.remoteAddress(host, port); - // 寮傛杩炴帴tcp鏈嶅姟绔� - ChannelFuture future = bootstrap.connect().addListener((ChannelFuture futureListener) -> { - final EventLoop eventLoop = futureListener.channel().eventLoop(); - if (futureListener.isSuccess()) { - BootNettyClientChannel bootNettyClientChannel = new BootNettyClientChannel(); - Channel channel = futureListener.channel(); - String id = futureListener.channel().id().toString(); -// String id = host; - bootNettyClientChannel.setChannel(channel); - bootNettyClientChannel.setCode("clientId:" + id); - BootNettyClientChannelCache.save("clientId:" + id, bootNettyClientChannel); - BootNettyClientChannelCache.save(host+":"+port,radar); - log.debug("netty client start success=" + id); - } else { -// System.err.println("杩炴帴澶辫触锛�" + waitTimes.toString() + "绉掑悗閲嶆柊杩炴帴:" + host); - try { - Thread.sleep(waitTimes * 1000); - } finally { - connect(radar); - } - } - }); - future.channel().closeFuture().sync(); - } catch (Exception e) { - System.err.println("杩炴帴寮傚父锛�" + waitTimes.toString() + "绉掑悗閲嶆柊杩炴帴:" + host); - try { - Thread.sleep(waitTimes * 1000); - } finally { - connect(radar); - } - e.printStackTrace(); - } finally { - /** - * 閫�鍑猴紝閲婃斁璧勬簮 - */ - eventLoopGroup.shutdownGracefully().sync(); - } - - } - /** - * 鍒濆鍖栨柟娉� - */ - public void run(ApplicationArguments args) { - if (!nettyTcpConfig.getEnabled()) { - return; - } - List<ArdEquipRadar> ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar()); - for (ArdEquipRadar ardEquipRadar : ardEquipRadars) { - String host = ardEquipRadar.getIp(); - Integer port = Integer.valueOf(ardEquipRadar.getPort()); - log.debug("TCP client try to connect radar銆愶細" + host + ":" + port+"銆�"); - BootNettyClientThread thread = new BootNettyClientThread(ardEquipRadar); - thread.start(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannel.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannel.java deleted file mode 100644 index f8c9dba..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannel.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.ard.utils.netty.tcp; - -import io.netty.channel.Channel; -import lombok.Data; - -@Data -public class BootNettyClientChannel { - - // 杩炴帴瀹㈡埛绔敮涓�鐨刢ode - private String code; - - // 瀹㈡埛绔渶鏂板彂閫佺殑娑堟伅鍐呭 - private String last_data; - - private transient volatile Channel channel; -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannelCache.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannelCache.java deleted file mode 100644 index 4d31833..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannelCache.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ard.utils.netty.tcp; - -import com.ard.alarm.radar.domain.ArdEquipRadar; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class BootNettyClientChannelCache { - public static volatile Map<String, ArdEquipRadar> radarMapCache = new ConcurrentHashMap<String, ArdEquipRadar>(); - public static volatile Map<String, BootNettyClientChannel> channelMapCache = new ConcurrentHashMap<String, BootNettyClientChannel>(); - - public static void add(String code, BootNettyClientChannel channel){ - channelMapCache.put(code,channel); - } - public static void addRadar(String code, ArdEquipRadar radar){ - radarMapCache.put(code,radar); - } - public static BootNettyClientChannel get(String code){ - return channelMapCache.get(code); - } - public static ArdEquipRadar getRadar(String code){ - return radarMapCache.get(code); - } - public static void remove(String code){ - channelMapCache.remove(code); - } - public static void removeRadar(String code){ - radarMapCache.remove(code); - } - public static void save(String code, BootNettyClientChannel channel) { - if(channelMapCache.get(code) == null) { - add(code,channel); - } - } - public static void save(String code, ArdEquipRadar radar) { - if(radarMapCache.get(code) == null) { - addRadar(code,radar); - } - } - -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyClientThread.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyClientThread.java deleted file mode 100644 index 8aa85ff..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/BootNettyClientThread.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ard.utils.netty.tcp; - -import com.ard.alarm.radar.domain.ArdEquipRadar; - -public class BootNettyClientThread extends Thread { - - private final ArdEquipRadar ardEquipRadar; - - public BootNettyClientThread(ArdEquipRadar ardEquipRadar){ - this.ardEquipRadar = ardEquipRadar; - } - - public void run() { - try { - new BootNettyClient().connect(ardEquipRadar); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/netty/tcp/ClientHandler.java b/src/main/java/com/ard/utils/netty/tcp/ClientHandler.java index c59dd32..6e12a61 100644 --- a/src/main/java/com/ard/utils/netty/tcp/ClientHandler.java +++ b/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(); - // 灏嗗け璐ヤ俊鎭彃鍏et闆嗗悎 - 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 @@ /** * 瑙f瀽鎶ヨ鏁版嵁 */ - 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 + "銆恜ort銆�" + port + "銆怷銆�" + longitude + "銆怸銆�" + lagitude + "銆怹銆�" + 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); // 浣跨敤姝e鸡鍑芥暟璁$畻瀵硅竟闀垮害 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("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�"+ targetId + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName+"銆怐istance銆�"+Distance); + log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName + "銆怐istance銆�" + 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("鎶ヨ淇℃伅锛�"+ "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime); + log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime); ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar(); ardAlarmRadar.setTargetId(targetId); ardAlarmRadar.setName(alarmPointName); diff --git a/src/main/java/com/ard/utils/netty/tcp/ClientHelper.java b/src/main/java/com/ard/utils/netty/tcp/ClientHelper.java deleted file mode 100644 index cbad3c0..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/ClientHelper.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ard.utils.netty.tcp; - -import com.ard.utils.util.ByteUtils; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import javax.xml.bind.DatatypeConverter; -import java.util.Map; - -@Component -@EnableScheduling -public class ClientHelper { - - // 浣跨敤瀹氭椂鍣ㄥ彂閫佸績璺� - @Scheduled(cron = "0/3 * * * * ?") - public void heart_timer() { - //System.err.println("BootNettyClientChannelCache.channelMapCache.size():" + BootNettyClientChannelCache.channelMapCache.size()); - if (BootNettyClientChannelCache.channelMapCache.size() > 0) { - for (Map.Entry<String, BootNettyClientChannel> entry : BootNettyClientChannelCache.channelMapCache.entrySet()) { - BootNettyClientChannel bootNettyChannel = entry.getValue(); - //System.out.println(bootNettyChannel.getCode()); - try { - byte[] header = {0x01, 0x02, 0x01}; - byte[] payload = {0x10, 0x00, 0x00, 0x00}; - byte[] payloadCrc32 = ByteUtils.parseCrc32(payload); - byte[] footer = {0x01, 0x02, 0x00}; - byte[] heart = ByteUtils.appendArrays(header, payload, payloadCrc32, footer); - // log.debug("鍙戦�佸績璺�:" + hexString); - //message.writeBytes(heart); - bootNettyChannel.getChannel().writeAndFlush(Unpooled.buffer().writeBytes(heart)); - } catch (Exception e) { - continue; - } - } - } - - } -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java b/src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java index ddd4f9c..b30b2b5 100644 --- a/src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java +++ b/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();//澶辫触杩炴帴鐨勯浄杈維et + public static ConcurrentHashMap<String, ArdEquipRadar> trueConnectMap = new ConcurrentHashMap();//鎴愬姛杩炴帴鐨刬p绔彛瀵瑰簲鐨勯浄杈� + public static ConcurrentHashMap<String, MessageHandler> SucMessageHandlerMap = new ConcurrentHashMap();//鎴愬姛杩炴帴鐨刬p绔彛瀵瑰簲鐨勬姤鏂囪В鏋愬櫒 + public static ConcurrentHashMap<String, Channel> SucChannelMap = new ConcurrentHashMap();//鎴愬姛杩炴帴鐨刬p绔彛瀵瑰簲鐨刵etty閫氶亾 + /** * 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); - // 杩炴帴澶辫触淇℃伅浠巑ap绉婚櫎 - tureConnectMap.remove( host + ":" + port); - SuccessConnectMap.remove(ardEquipRadar.getId()); - } else { - log.debug("闆疯揪銆�" + host + ":" + port + "銆戣繛鎺ユ垚鍔�"); + if (futureListener.isSuccess()) { + log.debug("闆疯揪銆�" + ipPort + "銆戣繛鎺ユ垚鍔�"); // 杩炴帴鎴愬姛淇℃伅浠嶴et鎷旈櫎 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);//杩炴帴姣忎竴涓浄杈炬湇鍔� } } diff --git a/src/main/java/com/ard/utils/netty/tcp/DynamicClient.java b/src/main/java/com/ard/utils/netty/tcp/DynamicClient.java deleted file mode 100644 index 82dfcdc..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/DynamicClient.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.ard.utils.netty.tcp; - -import com.ard.alarm.radar.domain.ArdEquipRadar; -import com.ard.alarm.radar.service.IArdEquipRadarService; -import com.ard.utils.netty.config.NettyTcpConfiguration; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - - -/** - * @Description: 闆疯揪鍔ㄦ�乼cp瀹㈡埛绔紙澶囩敤锛� - * @ClassName: DynamicClient - * @Author: 鍒樿嫃涔� - * @Date: 2023骞�11鏈�30鏃�9:25:48 - **/ -@Slf4j(topic = "netty") -@Component -public class DynamicClient{ - @Resource - IArdEquipRadarService ardEquipRadarService; - @Resource - NettyTcpConfiguration nettyTcpConfig; - - private static List<Channel> serverChannels = new ArrayList<>(); - public static ConcurrentHashMap<Channel, ArdEquipRadar> ConnectMap = new ConcurrentHashMap(); - - public static void main(String[] args) throws InterruptedException { - EventLoopGroup group = new NioEventLoopGroup(); - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(group) - .channel(NioSocketChannel.class) - .option(ChannelOption.TCP_NODELAY, true) - .option(ChannelOption.SO_KEEPALIVE, true) - .handler(new DynamicClientInitializer()); - - DynamicClient dynamicClient = new DynamicClient(); - ArdEquipRadar radar1 = new ArdEquipRadar(); - radar1.setName("511"); - radar1.setIp("112.98.126.2"); - radar1.setPort(1200); - dynamicClient.connect(bootstrap, radar1); - - Thread.sleep(2000); // 绛夊緟杩炴帴寤虹珛 - - // 妯℃嫙鍔ㄦ�佸鍔犱竴涓湇鍔$ - ArdEquipRadar radar2 = new ArdEquipRadar(); - radar2.setName("140"); - radar2.setIp("112.98.126.2"); - radar2.setPort(1201); - dynamicClient.connect(bootstrap, radar2); - - } - - public void connectToServer(ArdEquipRadar radar) { - EventLoopGroup group = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(group) - .channel(NioSocketChannel.class) - .option(ChannelOption.TCP_NODELAY, true) - .option(ChannelOption.SO_KEEPALIVE, true) - .handler(new DynamicClientInitializer()); - // 杩炴帴鏈嶅姟绔� - ChannelFuture channelFuture = bootstrap.connect(radar.getIp(), radar.getPort()).sync(); - Channel serverChannel = channelFuture.channel(); - // 灏嗚繛鎺ョ殑鏈嶅姟绔� Channel 娣诲姞鍒扮鐞嗗垪琛� - serverChannels.add(serverChannel); - ConnectMap.put(serverChannel, radar); - log.debug("闆疯揪銆�" + radar.getIp() + ":" + radar.getPort() + "銆戣繛鎺ユ垚鍔�"); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public Channel connect(Bootstrap bootstrap, ArdEquipRadar radar) { - ChannelFuture future = bootstrap.connect(radar.getIp(), radar.getPort()); - future.addListener((ChannelFutureListener) futureListener -> { - if (futureListener.isSuccess()) { - log.info("Connected to radar device: " + radar.getName() + "銆�" + radar.getIp() + ":" + radar.getPort() + "銆�" + " successful"); - // 鍦ㄨ繛鎺ュ缓绔嬪悗锛屼綘鍙互鍦ㄨ繖閲屾坊鍔犱笟鍔¢�昏緫鎴栧叾浠栧鐞� - serverChannels.add(future.channel()); - ConnectMap.put(future.channel(), radar); - } else { - log.error("Connection to radar device " + radar.getName() + "銆�" + radar.getIp() + ":" + radar.getPort() + "銆�" + " failed. Retrying..."); - // 杩炴帴澶辫触鏃讹紝瀹氭椂杩涜閲嶈繛 - futureListener.channel().eventLoop().schedule( - () -> connect(bootstrap, radar), - 1L, TimeUnit.SECONDS - ); - } - }); - - return future.channel(); - } - - // 鍦ㄨ繛鎺ュ缓绔嬪悗鍙互閫氳繃璋冪敤杩欎釜鏂规硶鍚戞寚瀹氱殑鏈嶅姟绔彂閫佹暟鎹� - public void sendDataToServer(Channel serverChannel, Object data) { - serverChannel.writeAndFlush(data); - } - - // 鍏抽棴鎸囧畾鐨勬湇鍔$杩炴帴 - public void closeServerConnection(Channel serverChannel) { - serverChannel.close(); - serverChannels.remove(serverChannel); - } - - // 鍏抽棴鎵�鏈夋湇鍔$杩炴帴 - public void closeAllServerConnections() { - for (Channel serverChannel : serverChannels) { - serverChannel.close(); - } - serverChannels.clear(); - } - - /** - * 鍒濆鍖栨柟娉� - */ - - public void run(ApplicationArguments args) { - if (!nettyTcpConfig.getEnabled()) { - return; - } - EventLoopGroup group = new NioEventLoopGroup(); - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(group) - .channel(NioSocketChannel.class) - .option(ChannelOption.TCP_NODELAY, true) - .option(ChannelOption.SO_KEEPALIVE, true) - .handler(new DynamicClientInitializer()); - List<ArdEquipRadar> ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar()); - for (ArdEquipRadar ardEquipRadar : ardEquipRadars) { - String host = ardEquipRadar.getIp(); - Integer port = Integer.valueOf(ardEquipRadar.getPort()); - log.debug("TCP client try to connect radar銆愶細" + host + ":" + port + "銆�"); - // connectServer(ardEquipRadar);//杩炴帴姣忎竴涓浄杈炬湇鍔� - connect(bootstrap, ardEquipRadar); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/netty/tcp/DynamicClientHandler.java b/src/main/java/com/ard/utils/netty/tcp/DynamicClientHandler.java deleted file mode 100644 index 1809740..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/DynamicClientHandler.java +++ /dev/null @@ -1,436 +0,0 @@ -package com.ard.utils.netty.tcp; - -import com.alibaba.fastjson2.JSON; -import com.ard.alarm.radar.domain.ArdAlarmRadar; -import com.ard.alarm.radar.domain.ArdEquipRadar; -import com.ard.alarm.radar.domain.RadarAlarmData; -import com.ard.utils.mqtt.MqttProducer; -import com.ard.utils.util.ByteUtils; -import com.ard.utils.util.GisUtils; -import io.netty.buffer.ByteBuf; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import javax.xml.bind.DatatypeConverter; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import static com.ard.utils.util.ByteUtils.byteToBitString; -import static com.ard.utils.util.ByteUtils.toLittleEndian; - -/** - * @Description: 瀹㈡埛绔暟鎹鐞嗗櫒锛堝鐢級 - * @ClassName: DynamicClientHandler - * @Author: 鍒樿嫃涔� - * @Date: 2023骞�11鏈�30鏃�9:27:55 - **/ -@Slf4j(topic = "netty") -class DynamicClientHandler extends SimpleChannelInboundHandler<ByteBuf> { - /** - * 杩炴帴寤虹珛 - * - * @param ctx - * @throws Exception - */ - @Override - public void channelActive(ChannelHandlerContext ctx) { - context = ctx; - startHeartbeatTask();//寮�濮嬪彂閫佸績璺� - } - - @Override - protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) { - // 澶勭悊鎺ユ敹鍒扮殑鏁版嵁 - Channel channel = ctx.channel(); - ArdEquipRadar ardEquipRadar = DynamicClient.ConnectMap.get(channel); - // 澶勭悊鎺ユ敹鍒扮殑娑堟伅 - //byte[] byteArray = new byte[msg.readableBytes()]; - //msg.getBytes(msg.readerIndex(), byteArray); - //byte[] bytes = messageParsing.receiveCompletePacket(byteArray); - //if (bytes != null) { - // processData(ardEquipRadar, bytes); - //} - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - // 澶勭悊寮傚父 - // ... - log.error("澶勭悊寮傚父"+cause.getMessage()); - } - - private ScheduledFuture<?> heartbeatTask; - private ChannelHandlerContext context; - - /** - * 寮�濮嬪績璺充换鍔� - */ - private void startHeartbeatTask() { - heartbeatTask = context.executor().scheduleAtFixedRate(() -> { - // 鍙戦�佸績璺虫秷鎭� - ByteBuf message = context.alloc().buffer(); - byte[] header = {0x01, 0x02, 0x01}; - byte[] payload = {0x10, 0x00, 0x00, 0x00}; - 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}; - String hexString = DatatypeConverter.printHexBinary(heart); - // log.debug("鍙戦�佸績璺�:" + hexString); - message.writeBytes(heart); - context.writeAndFlush(message); - - }, 0, 5, TimeUnit.SECONDS); - } - - /** - * 鍋滄蹇冭烦浠诲姟 - */ - private void stopHeartbeatTask() { - if (heartbeatTask != null) { - heartbeatTask.cancel(false); - heartbeatTask = null; - } - } - - /** - * 瑙f瀽鎶ヨ鏁版嵁 - */ - public void processData(ArdEquipRadar ardEquipRadarbyte, byte[] data) { - try { - String radarId = ardEquipRadarbyte.getId(); - String radarName = ardEquipRadarbyte.getName(); - Double radarLongitude = ardEquipRadarbyte.getLongitude(); - Double radarLagitude = ardEquipRadarbyte.getLatitude(); - Double radarAltitude = ardEquipRadarbyte.getAltitude(); - //region crc鏍¢獙-鐩墠浠呯敤浜庢樉绀烘牎楠岀粨鏋� - Boolean crc32Check = MessageParsing.CRC32Check(data); - if (!crc32Check) { - log.debug("CRC32鏍¢獙涓嶉�氳繃"); - } else { - //log.debug("CRC32鏍¢獙閫氳繃"); - } - //endregion - //log.info("鍘熷鏁版嵁:" + DatatypeConverter.printHexBinary(data)); - //log.info("闆疯揪淇℃伅锛�" + host + "銆恜ort銆�" + port + "銆怷銆�" + longitude + "銆怸銆�" + lagitude + "銆怹銆�" + altitude); - data = MessageParsing.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); - //log.info("鍛戒护ID:" + DatatypeConverter.printHexBinary(cmdId)); - byte[] payloadSize = Arrays.copyOfRange(data, 2, 4);//鏈夋晥璐熻浇澶у皬 - payloadSize = toLittleEndian(payloadSize); - //log.info("payloadSize:" + DatatypeConverter.printHexBinary(payloadSize)); - int payloadSizeToDecimal = ByteUtils.bytesToDecimal(payloadSize); - // log.info("鏈夋晥璐熻浇澶у皬(杞暣鍨�):" + payloadSizeToDecimal); - //endregion - List<ArdAlarmRadar> radarAlarmInfos = new ArrayList<>(); - ArdAlarmRadar radarFollowInfo = null; - //鎶芥补鏈虹姸鎬侀浄杈炬帹閫侀泦鍚� - List<ArdAlarmRadar> well = new ArrayList<>(); - String alarmTime = ""; - Integer targetNum = 0; - log.debug("Processing radar data 銆�" + radarName + "銆戞暟鎹�-->鍛戒护ID:" + cmdIdStr + "浜岃繘鍒�:" + byteToBitString(cmdId[0])); - //闆疯揪绉诲姩闃茬伀鎶ヨ - if (Arrays.equals(cmdId, new byte[]{0x01})) { - //region 鍛婅淇℃伅鍙嶉 - byte[] dwTim = Arrays.copyOfRange(data, 4, 8); - dwTim = toLittleEndian(dwTim); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - long l = ByteUtils.bytesToDecimal(dwTim); - alarmTime = sdf.format(l * 1000); - // log.info("鍛ㄨ鍥惧儚鐨勫嚭鐜版椂闂�(杞琩ate):" + alarmTime); - - byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10); - wTargetNum = toLittleEndian(wTargetNum); - targetNum = ByteUtils.bytesToDecimal(wTargetNum); - if (targetNum == 0) { - return; - } - //log.debug("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum); - - //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟) - int uintSize = (payloadSizeToDecimal - 64) / targetNum; - // log.info("鍗曟潯鎶ヨ澶у皬:" + uintSize); - - for (int i = 0; i < targetNum; i++) { - - Integer index = 68 + uintSize * i; - byte[] dwID = Arrays.copyOfRange(data, index, index + 4); - // log.info("鐩爣ID:" + DatatypeConverter.printHexBinary(cmdId)); - dwID = toLittleEndian(dwID); - int targetId = ByteUtils.bytesToDecimal(dwID); - // log.info("鐩爣ID鍙凤細" + targetId); - - byte[] iDistance = Arrays.copyOfRange(data, index + 8, index + 12); - iDistance = toLittleEndian(iDistance); - double Distance = ByteUtils.bytesToDecimal(iDistance); - //log.debug("鐩爣褰撳墠鐩寸嚎璺濈(m):" + Distance); - - //region 涓嶉渶瑕佺殑瀛楁 -// byte[] dwGSum = Arrays.copyOfRange(data, index + 4, index + 8); -// dwGSum = toLittleEndian(dwGSum); -// int GSum = byteArrayToDecimal(dwGSum); -// log.info("鐩爣褰撳墠鍍忕礌鐏板害鍜岋細" + GSum); -// byte[] iTw = Arrays.copyOfRange(data, index + 12, index + 16); -// iTw = toLittleEndian(iTw); -// int Tw = byteArrayToDecimal(iTw); -// log.info("鐩爣褰撳墠鐨勫儚绱犲搴�:" + Tw); -// -// byte[] iTh = Arrays.copyOfRange(data, index + 16, index + 20); -// iTh = toLittleEndian(iTh); -// int Th = byteArrayToDecimal(iTh); -// log.info("鐩爣褰撳墠鐨勫儚绱犻珮搴�:" + Th); -// -// byte[] wPxlArea = Arrays.copyOfRange(data, index + 20, index + 22); -// wPxlArea = toLittleEndian(wPxlArea); -// int PxlArea = byteArrayToDecimal(wPxlArea); -// log.info("鐩爣褰撳墠鍍忕礌闈㈢Н:" + PxlArea); -// -// byte[] cTrkNum = Arrays.copyOfRange(data, index + 22, index + 23); -// cTrkNum = toLittleEndian(cTrkNum); -// int TrkNum = byteArrayToDecimal(cTrkNum); -// log.info("杞ㄨ抗鐐规暟:" + TrkNum); - -// byte[] sVx = Arrays.copyOfRange(data, index + 24, index + 26); -// sVx = toLittleEndian(sVx); -// int Vx = byteArrayToDecimal(sVx); -// log.info("鐩爣褰撳墠閫熷害鐭㈤噺(鍍忕礌璺濈)X:" + Vx); -// -// byte[] sVy = Arrays.copyOfRange(data, index + 26, index + 28); -// sVy = toLittleEndian(sVy); -// int Vy = byteArrayToDecimal(sVy); -// log.info("鐩爣褰撳墠閫熷害鐭㈤噺(鍍忕礌璺濈)Y:" + Vy); -// -// byte[] sAreaNo = Arrays.copyOfRange(data, index + 28, index + 30); -// sAreaNo = toLittleEndian(sAreaNo); -// int AreaNo = byteArrayToDecimal(sAreaNo); -// log.info("鐩爣褰掑睘鐨勫憡璀﹀尯鍩熷彿:" + AreaNo); -// -// byte[] cGrp = Arrays.copyOfRange(data, index + 30, index + 31); -// cGrp = toLittleEndian(cGrp); -// int Grp = byteArrayToDecimal(cGrp); -// log.info("鎵�灞炵粍:" + Grp); - //endregion - String alarmType = ""; - byte[] cStat = Arrays.copyOfRange(data, index + 23, index + 24); - log.info("鍘熷鐘舵��:" + byteToBitString(cStat[0])); - // cStat = toLittleEndian(cStat); - // 鎻愬彇绗�4浣嶈嚦绗�6浣嶇殑鍊� - int extractedValue = (cStat[0] >> 4) & 0b00001111; - // 鍒ゆ柇鎻愬彇鐨勫�� - if (extractedValue == 0b0000) { - alarmType = "杩愬姩鐩爣妫�娴�"; - } else if (extractedValue == 0b0001) { - alarmType = "鐑簮妫�娴�"; - } - // log.info("鎶ヨ绫诲瀷:" + alarmType); - byte[] szName = Arrays.copyOfRange(data, index + 64, index + 96); - String alarmPointName = ByteUtils.bytesToStringZh(szName); - // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName); - byte[] afTx = Arrays.copyOfRange(data, index + 96, index + 100); - afTx = toLittleEndian(afTx); - float fTx = ByteUtils.bytesToFloat(afTx); - // log.info("姘村钩瑙掑害:" + fTx); - byte[] afTy = Arrays.copyOfRange(data, index + 112, index + 116); - afTy = toLittleEndian(afTy); - float fTy = ByteUtils.bytesToFloat(afTy); - //log.debug("鍨傜洿瑙掑害:" + fTy); - // 灏嗚搴﹁浆鎹负寮у害 - double thetaRadians = Math.toRadians(fTy + 90); - // 浣跨敤姝e鸡鍑芥暟璁$畻瀵硅竟闀垮害 - Distance = Math.sin(thetaRadians) * Distance; - //log.debug("鐩爣鎶曞奖璺濈(m):" + Distance); - - Double[] radarXY = {radarLongitude, radarLagitude}; - Double[] alarmXY = GisUtils.CalculateCoordinates(radarXY, Distance, (double) fTx); - log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName); - ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar(); - ardAlarmRadar.setTargetId(targetId); - ardAlarmRadar.setName(alarmPointName); - ardAlarmRadar.setLongitude(alarmXY[0]); - ardAlarmRadar.setLatitude(alarmXY[1]); - ardAlarmRadar.setAlarmType(alarmType); - radarAlarmInfos.add(ardAlarmRadar); - - int bit1 = (cStat[0] >> 1) & 0x1; - //鐩爣鐨凚1=1 閿佸畾 - if (bit1 == 1) { - radarFollowInfo = ardAlarmRadar; - //灏嗚拷韪攣瀹氱殑鎶ヨ瀵硅薄灞炴�у鍒剁粰radarFollowInfo瀵硅薄 - //BeanUtils.copyProperties(ardAlarmRadar, radarFollowInfo); - } - } - //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)); - if (radarFollowInfo != null) { - //褰撳墠闆疯揪鎵弿瀛樺湪寮曞璺熻釜鏁版嵁锛屽彧淇濈暀鏈�鍚庝竴娆¢攣瀹氱殑鏁版嵁 - MqttProducer.publish(2, false, "radarFollowGuide", JSON.toJSONString(radarFollowInfo)); - } - //鎶芥补鏈虹姸鎬丮QTT闃熷垪 - radarAlarmData.setArdAlarmRadars(well); - MqttProducer.publish(2, false, "radarWellData", JSON.toJSONString(radarAlarmData)); - - } - //鎶芥补鏈篈I鐘舵�佸弽棣� - if (Arrays.equals(cmdId, new byte[]{0x04})) { - //region鎶芥补鏈篈I鐘舵�佸弽棣� - String hexString = DatatypeConverter.printHexBinary(data); - //log.info(hexString); - - byte[] dwTim = Arrays.copyOfRange(data, 4, 8); - dwTim = toLittleEndian(dwTim); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - long l = ByteUtils.bytesToDecimal(dwTim); - alarmTime = sdf.format(l * 1000); - //log.info("鍛ㄨ鍥惧儚鐨勫嚭鐜版椂闂�(杞琩ate):" + alarmTime); - - byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10); - wTargetNum = toLittleEndian(wTargetNum); - targetNum = ByteUtils.bytesToDecimal(wTargetNum); - //log.debug("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum); - if (targetNum == 0) { - return; - } - //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟) - int uintSize = (payloadSizeToDecimal - 64) / targetNum; - //log.info("鍗曟潯鎶ヨ澶у皬:" + uintSize); - for (int i = 0; i < targetNum; i++) { - Integer index = 68 + uintSize * i; - byte[] dwID = Arrays.copyOfRange(data, index, index + 4); - //log.info("鐩爣ID:" + DatatypeConverter.printHexBinary(dwID)); - dwID = toLittleEndian(dwID); - int targetId = ByteUtils.bytesToDecimal(dwID); - //log.info("鐩爣ID鍙凤細" + targetId); - //region 涓嶉渶瑕佺殑瀛楁 - byte[] iTw = Arrays.copyOfRange(data, index + 4, index + 8); - iTw = toLittleEndian(iTw); - int Tw = ByteUtils.bytesToDecimal(iTw); - // log.info("鐩爣褰撳墠鐨勫儚绱犲搴�:" + Tw); - - byte[] iTh = Arrays.copyOfRange(data, index + 8, index + 12); - iTh = toLittleEndian(iTh); - int Th = ByteUtils.bytesToDecimal(iTh); - //log.info("鐩爣褰撳墠鐨勫儚绱犻珮搴�:" + Th); - - byte[] fTx = Arrays.copyOfRange(data, index + 12, index + 16); - fTx = toLittleEndian(fTx); - float fTxAngle = ByteUtils.bytesToFloat(fTx); - //log.debug("p瑙掑害:" + fTxAngle); - byte[] fTy = Arrays.copyOfRange(data, index + 16, index + 20); - fTy = toLittleEndian(fTy); - float fTyAngle = ByteUtils.bytesToFloat(fTy); - //log.debug("t瑙掑害:" + fTyAngle); - - byte[] sAreaNo = Arrays.copyOfRange(data, index + 20, index + 22); - sAreaNo = toLittleEndian(sAreaNo); - int AreaNo = ByteUtils.bytesToDecimal(sAreaNo); - //log.debug("鐩爣褰掑睘鐨勫憡璀﹀尯鍩熷彿:" + AreaNo); - - byte[] cGrp = Arrays.copyOfRange(data, index + 22, index + 23); - cGrp = toLittleEndian(cGrp); - int Grp = ByteUtils.bytesToDecimal(cGrp); - //log.info("鎵�灞炵粍:" + Grp); - //endregion - String alarmType; - //鎶芥补鏈虹姸鎬佸彉閲� - String wellType; - byte[] cStat = Arrays.copyOfRange(data, index + 23, index + 24); - cStat = toLittleEndian(cStat); - //String binaryString = String.format("%8s", Integer.toBinaryString(cStat[0] & 0xFF)).replace(' ', '0'); - //log.info("鐩爣褰撳墠鐘舵��:" + binaryString); - // 鎻愬彇绗�0浣嶅�� - // 浣跨敤浣嶈繍绠楁搷浣滃垽鏂0浣嶆槸鍚︿负1 - boolean isB0 = (cStat[0] & 0x01) == 0x00; - // 鍒ゆ柇鎻愬彇鐨勫�� - if (isB0) { - alarmType = "闆疯揪鎶芥补鏈哄仠鏈�"; - byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64); - //log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + DatatypeConverter.printHexBinary(szName)); - String alarmPointName = ByteUtils.bytesToStringZh(szName); - // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName); - //log.debug("鎶ヨ淇℃伅锛�"+ "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime); - ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar(); - ardAlarmRadar.setTargetId(targetId); - ardAlarmRadar.setName(alarmPointName); - ardAlarmRadar.setAlarmType(alarmType); - radarAlarmInfos.add(ardAlarmRadar); - wellType = "鍋滄満"; - } else { - wellType = "杩愯"; - } - //鎶芥补鏈虹姸鎬侀泦鍚堜腑瑁呭叆鏁版嵁 - byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64); - String alarmPointName = ByteUtils.bytesToStringZh(szName); - log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恆larmType銆戞娊娌规満鐘舵�佹姤璀�" + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName + "銆恆larmState銆�" + wellType); - ArdAlarmRadar wellAlarm = new ArdAlarmRadar(); - wellAlarm.setTargetId(targetId); - wellAlarm.setName(alarmPointName); - wellAlarm.setAlarmType(wellType); - 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)); - //鎶芥补鏈虹姸鎬丮QTT闃熷垪 - radarAlarmData.setArdAlarmRadars(well); - MqttProducer.publish(2, false, "radarWellData", JSON.toJSONString(radarAlarmData)); - } - //寮哄埗寮曞 - if (Arrays.equals(cmdId, new byte[]{0x02})) { - //region 鍛婅鍓嶇鍙戦�佺殑寮哄埗寮曞淇℃伅 - byte[] iDistance = Arrays.copyOfRange(data, 4, 8); - iDistance = toLittleEndian(iDistance); - long distance = ByteUtils.bytesToDecimal(iDistance); - log.info("鐩爣褰撳墠璺濈(m):" + distance); - byte[] fTx = Arrays.copyOfRange(data, 8, 12); - fTx = toLittleEndian(fTx); - float tx = ByteUtils.bytesToFloat(fTx); - log.debug("鏂逛綅:" + tx); - byte[] fTy = Arrays.copyOfRange(data, 12, 16); - fTy = 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)); - } - } catch (Exception ex) { - log.error("闆疯揪鎶ユ枃瑙f瀽寮傚父:" + ex.getMessage()); - } - } -} diff --git a/src/main/java/com/ard/utils/netty/tcp/DynamicClientInitializer.java b/src/main/java/com/ard/utils/netty/tcp/DynamicClientInitializer.java deleted file mode 100644 index 909c5d9..0000000 --- a/src/main/java/com/ard/utils/netty/tcp/DynamicClientInitializer.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ard.utils.netty.tcp; - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; - -/** - * @Description: 鍒濆鍖栧鎴风鐨勯�氶亾锛堝鐢級 - * @ClassName: DynamicClientInitializer - * @Author: 鍒樿嫃涔� - * @Date: 2023骞�11鏈�30鏃�9:27:03 - **/ -public class DynamicClientInitializer extends ChannelInitializer<SocketChannel> { - @Override - protected void initChannel(SocketChannel ch){ - try { - ChannelPipeline pipeline = ch.pipeline(); - // 娣诲姞浣犻渶瑕佺殑澶勭悊鍣� - pipeline.addLast(new DynamicClientHandler()); - }catch (Exception e) - { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/ard/utils/netty/tcp/MessageParsing.java b/src/main/java/com/ard/utils/netty/tcp/MessageHandler.java similarity index 98% rename from src/main/java/com/ard/utils/netty/tcp/MessageParsing.java rename to src/main/java/com/ard/utils/netty/tcp/MessageHandler.java index 4aac19d..e6286fb 100644 --- a/src/main/java/com/ard/utils/netty/tcp/MessageParsing.java +++ b/src/main/java/com/ard/utils/netty/tcp/MessageHandler.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<>(); -- Gitblit v1.9.3