Bläddra i källkod

feat(修改modbus监听,使用端口作为区分设备标识,适配冰箱内网代理到外网环境): 修改modbus监听,使用端口作为区分设备标识,适配冰箱内网代理到外网环境

修改modbus监听,使用端口作为区分设备标识,适配冰箱内网代理到外网环境
zjian 1 dag sedan
förälder
incheckning
19299419ac

+ 13 - 6
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/meiling/ModBusTcpServer.java

@@ -14,6 +14,8 @@ import vip.xiaonuo.coldchain.modular.monitordevice.mapper.MonitorDeviceMapper;
 import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
 import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
 
 
 import java.net.InetSocketAddress;
 import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
 
 
 /**
 /**
  * 基于netty开启监听modbus端口
  * 基于netty开启监听modbus端口
@@ -31,20 +33,25 @@ public class ModBusTcpServer {
         this.monitorDeviceService = monitorDeviceService;
         this.monitorDeviceService = monitorDeviceService;
     }
     }
 
 
-    public void start(InetSocketAddress address) {
+    public void start(List<Integer> address) {
         EventLoopGroup bossGroup = new NioEventLoopGroup();
         EventLoopGroup bossGroup = new NioEventLoopGroup();
         NioEventLoopGroup workerGroup = new NioEventLoopGroup();
         NioEventLoopGroup workerGroup = new NioEventLoopGroup();
 
 
         try {
         try {
             ServerBootstrap bootstrap = (new ServerBootstrap()).group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
             ServerBootstrap bootstrap = (new ServerBootstrap()).group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
-                    .localAddress(address)
+//                    .localAddress(address)
                     .childHandler(new ModbusTcpServerChannelInitializer(meilingColdChainDataHandler,monitorDeviceService))
                     .childHandler(new ModbusTcpServerChannelInitializer(meilingColdChainDataHandler,monitorDeviceService))
                     .option(ChannelOption.SO_BACKLOG, 1024).childOption(ChannelOption.SO_KEEPALIVE, true).childOption(ChannelOption.TCP_NODELAY, true);
                     .option(ChannelOption.SO_BACKLOG, 1024).childOption(ChannelOption.SO_KEEPALIVE, true).childOption(ChannelOption.TCP_NODELAY, true);
-            ChannelFuture future = bootstrap.bind(address).sync();
-            if (future.isSuccess()) {
-                log.info("modbus服务端开始监听端口:{}", address.getPort());
+            List<ChannelFuture> channelFutures = new ArrayList<>(address.size());
+            for (Integer port : address) {
+                ChannelFuture future = bootstrap.bind(port).sync();
+                if (future.isSuccess()) {
+                    log.info("modbus服务端开始监听端口:{}", port);
+                }
+            }
+            for (ChannelFuture channelFuture : channelFutures) {
+                channelFuture.channel().closeFuture().sync();
             }
             }
-            future.channel().closeFuture().sync();
         } catch (Exception var7) {
         } catch (Exception var7) {
             var7.printStackTrace();
             var7.printStackTrace();
             bossGroup.shutdownGracefully();
             bossGroup.shutdownGracefully();

+ 11 - 12
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/meiling/adapter/ModbusDataHandlerAdapter.java

@@ -45,12 +45,12 @@ public class ModbusDataHandlerAdapter extends ChannelInboundHandlerAdapter {
     @Override
     @Override
     public void channelActive(ChannelHandlerContext ctx) {
     public void channelActive(ChannelHandlerContext ctx) {
         Channel channel = ctx.channel();
         Channel channel = ctx.channel();
-        log.info("客户端连接:" + channel.remoteAddress());
+        log.info("客户端连接:remote={},local={}" ,channel.remoteAddress(),channel.localAddress());
         // 启动定时询问任务(首次延迟1秒,之后每隔QUERY_INTERVAL秒执行)
         // 启动定时询问任务(首次延迟1秒,之后每隔QUERY_INTERVAL秒执行)
         startQueryTask(channel);
         startQueryTask(channel);
         //设备上线
         //设备上线
         MonitorDevice device = monitorDeviceService.getOne(new LambdaQueryWrapper<MonitorDevice>()
         MonitorDevice device = monitorDeviceService.getOne(new LambdaQueryWrapper<MonitorDevice>()
-                .eq(MonitorDevice::getIp, getIP(ctx)),false);
+                .eq(MonitorDevice::getIp, getLocalAddress(ctx)),false);
         if(device!=null){
         if(device!=null){
             meilingColdChainDataHandler.login(new MeilingColdChainMessageData(device.getDeviceCode()));
             meilingColdChainDataHandler.login(new MeilingColdChainMessageData(device.getDeviceCode()));
         }
         }
@@ -60,19 +60,19 @@ public class ModbusDataHandlerAdapter extends ChannelInboundHandlerAdapter {
     // 收到客户端消息时触发
     // 收到客户端消息时触发
     @Override
     @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) {
     public void channelRead(ChannelHandlerContext ctx, Object msg) {
-        Channel channel = ctx.channel();
         // 只处理客户端的响应指令(0x02)
         // 只处理客户端的响应指令(0x02)
-        log.info("收到客户端[" + channel.remoteAddress() + "]响应:" + msg);
+        String localAddress = getLocalAddress(ctx);
+        log.info("收到客户端[" + localAddress + "]响应:" + msg);
         // 取消当前超时任务(响应正常,无需断开连接)
         // 取消当前超时任务(响应正常,无需断开连接)
         if (queryTimeout != null && !queryTimeout.isCancelled()) {
         if (queryTimeout != null && !queryTimeout.isCancelled()) {
             queryTimeout.cancel();
             queryTimeout.cancel();
         }
         }
         MeilingColdChainMessageData meilingColdChainMessageData = new MeilingColdChainMessageData();
         MeilingColdChainMessageData meilingColdChainMessageData = new MeilingColdChainMessageData();
-        meilingColdChainMessageData.setHost(getIP(ctx));
+        meilingColdChainMessageData.setHost(localAddress);
         String data = String.valueOf(msg);
         String data = String.valueOf(msg);
         MonitorDevice device = monitorDeviceService.getOne(new LambdaQueryWrapper<MonitorDevice>()
         MonitorDevice device = monitorDeviceService.getOne(new LambdaQueryWrapper<MonitorDevice>()
                 .eq(MonitorDevice::getIp, meilingColdChainMessageData.getHost()),false);
                 .eq(MonitorDevice::getIp, meilingColdChainMessageData.getHost()),false);
-        if(device!=null){
+        if(device!=null && StrUtil.isNotBlank(data)){
             meilingColdChainMessageData.setHexData(data);
             meilingColdChainMessageData.setHexData(data);
             meilingColdChainMessageData.setDeviceId(device.getDeviceCode());
             meilingColdChainMessageData.setDeviceId(device.getDeviceCode());
             meilingColdChainMessageData.setModelName(MonitorDataProcessor.ML_WD_MODBUS);
             meilingColdChainMessageData.setModelName(MonitorDataProcessor.ML_WD_MODBUS);
@@ -83,10 +83,9 @@ public class ModbusDataHandlerAdapter extends ChannelInboundHandlerAdapter {
     /**
     /**
      * 获取IP地址
      * 获取IP地址
      */
      */
-    private String getIP(ChannelHandlerContext ctx) {
-        String socketString = ctx.channel().remoteAddress().toString();
-        int index = socketString.indexOf(":");
-        return socketString.substring(1, index);
+    private String getLocalAddress(ChannelHandlerContext ctx) {
+        String socketString = ctx.channel().localAddress().toString();
+        return socketString;
     }
     }
 
 
 
 
@@ -94,7 +93,7 @@ public class ModbusDataHandlerAdapter extends ChannelInboundHandlerAdapter {
     @Override
     @Override
     public void channelInactive(ChannelHandlerContext ctx) {
     public void channelInactive(ChannelHandlerContext ctx) {
         Channel channel = ctx.channel();
         Channel channel = ctx.channel();
-        log.warn("客户端断开连接:" + channel.remoteAddress());
+        log.warn("客户端断开连接:" + channel.localAddress());
         // 取消定时任务,避免内存泄漏
         // 取消定时任务,避免内存泄漏
         if (queryTimeout != null && !queryTimeout.isCancelled()) {
         if (queryTimeout != null && !queryTimeout.isCancelled()) {
             queryTimeout.cancel();
             queryTimeout.cancel();
@@ -107,7 +106,7 @@ public class ModbusDataHandlerAdapter extends ChannelInboundHandlerAdapter {
             if (channel.isActive()) { // 连接仍活跃时发送询问
             if (channel.isActive()) { // 连接仍活跃时发送询问
                 // 美菱冰箱固定 发送固定询问指令(0x01)
                 // 美菱冰箱固定 发送固定询问指令(0x01)
                 channel.writeAndFlush("01 03 00 00 00 04 44 09");
                 channel.writeAndFlush("01 03 00 00 00 04 44 09");
-                log.info("向客户端[" + channel.remoteAddress() + "]发送询问");
+                log.info("向客户端[" + channel.localAddress() + "]发送询问");
 
 
                 // 启动响应超时任务:若RESPONSE_TIMEOUT秒内未收到响应,断开连接
                 // 启动响应超时任务:若RESPONSE_TIMEOUT秒内未收到响应,断开连接
 //                    queryTimeout = timer.newTimeout(timeout1 -> {
 //                    queryTimeout = timer.newTimeout(timeout1 -> {

+ 18 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/renke/config/JfcloudColdChainServerAutoConfiguration.java

@@ -1,5 +1,6 @@
 package vip.xiaonuo.coldchain.core.renke.config;
 package vip.xiaonuo.coldchain.core.renke.config;
 
 
+import cn.hutool.core.util.StrUtil;
 import lombok.SneakyThrows;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,6 +22,8 @@ import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
 
 
 import javax.annotation.PreDestroy;
 import javax.annotation.PreDestroy;
 import java.net.InetSocketAddress;
 import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Executors;
@@ -107,7 +110,7 @@ public class JfcloudColdChainServerAutoConfiguration {
     @ConditionalOnMissingBean
     @ConditionalOnMissingBean
     @SneakyThrows
     @SneakyThrows
     public ModBusTcpServer jfcloudColdChainModbusServer(JfcloudColdChainServerProperties properties, MeilingColdChainDataHandler meilingColdChainDataHandler, @Autowired @Lazy MonitorDeviceService monitorDeviceService) {
     public ModBusTcpServer jfcloudColdChainModbusServer(JfcloudColdChainServerProperties properties, MeilingColdChainDataHandler meilingColdChainDataHandler, @Autowired @Lazy MonitorDeviceService monitorDeviceService) {
-        if ((Objects.nonNull(properties.getModbusPort()) && properties.getModbusPort() > 0)) {
+        if (StrUtil.isNotBlank(properties.getModbusPort())) {
             // 初始化 ModbusServer,并注入数据监听器
             // 初始化 ModbusServer,并注入数据监听器
             log.info("""
             log.info("""
                     ----------------------------------------------------------
                     ----------------------------------------------------------
@@ -133,8 +136,20 @@ public class JfcloudColdChainServerAutoConfiguration {
         executorService.submit(() -> {
         executorService.submit(() -> {
             try {
             try {
                 if (modBusTcpServer != null) {
                 if (modBusTcpServer != null) {
-                    modBusTcpServer.start(new InetSocketAddress(properties.getModbusPort()));
-                    log.info("ModBusTcpServer 已成功启动");
+                    String modbusPort = properties.getModbusPort();
+                    if(!StrUtil.equals(modbusPort,"-1")){
+                        List<Integer> ports= new ArrayList<>();
+                        String[] split = modbusPort.split("-");
+                        if(split.length==2){
+                            Integer start = Integer.parseInt(split[0]);
+                            Integer end = Integer.parseInt(split[1]);
+                            for(int i=start;i<=end;i++){
+                                ports.add(i);
+                            }
+                            modBusTcpServer.start(ports);
+                            log.info("ModBusTcpServer 已成功启动");
+                        }
+                    }
                 } else {
                 } else {
                     log.error("ModBusTcpServer 未启动");
                     log.error("ModBusTcpServer 未启动");
                 }
                 }

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/renke/config/JfcloudColdChainServerProperties.java

@@ -38,7 +38,7 @@ public class JfcloudColdChainServerProperties {
     /**
     /**
      * modbusTCP端口监听
      * modbusTCP端口监听
      */
      */
-    private Integer modbusPort = 0;
+    private String modbusPort = "-1";
 
 
 
 
 }
 }

+ 18 - 14
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/ModbusMeilingTempProcessor.java

@@ -31,6 +31,10 @@ public class ModbusMeilingTempProcessor extends AbsMeilingMonitorDataProcessor {
     @Override
     @Override
     List<SensorData> transRealTimeData2SensorDatas(MeilingColdChainMessageData meilingColdChainMessageData) {
     List<SensorData> transRealTimeData2SensorDatas(MeilingColdChainMessageData meilingColdChainMessageData) {
         String data = meilingColdChainMessageData.getHexData();
         String data = meilingColdChainMessageData.getHexData();
+        //如果数据格式不对
+        if(!data.startsWith("01 03 08")){
+            return ListUtil.empty();
+        }
         //解析数据
         //解析数据
         //查询设备id
         //查询设备id
         String[] split = data.split(" ");
         String[] split = data.split(" ");
@@ -64,20 +68,20 @@ public class ModbusMeilingTempProcessor extends AbsMeilingMonitorDataProcessor {
         sensorData.setTemperature(temperatureFloat);
         sensorData.setTemperature(temperatureFloat);
         //设置路数
         //设置路数
         sensorData.setRoads(1);
         sensorData.setRoads(1);
-        //温度2
-        SensorData sensorData2 = defaultSensorData(meilingColdChainMessageData);
-        String formatted2 = String.format("%.2f", NumberUtil.div((tempure2 - Integer.parseInt("FFFF", 16) - 100), 10, 2));
-        float temperatureFloat2 = Float.parseFloat(formatted2);
-        sensorData2.setTemperature(temperatureFloat2);
-        //设置路数
-        sensorData2.setRoads(2);
-        //判断数据有效性
-        if(sensorData.getTemperature()>30 || sensorData.getTemperature()<-86
-                || sensorData2.getTemperature()>30 || sensorData2.getTemperature()<-86){
-            log.error("无效数据 sensorData1={} sensorData2 ={}", JSONObject.toJSONString(sensorData),JSONObject.toJSONString(sensorData2));
-            return ListUtil.empty();
-        }
-        return ListUtil.of(sensorData, sensorData2);
+        //温度2 暂时不需要
+//        SensorData sensorData2 = defaultSensorData(meilingColdChainMessageData);
+//        String formatted2 = String.format("%.2f", NumberUtil.div((tempure2 - Integer.parseInt("FFFF", 16) - 100), 10, 2));
+//        float temperatureFloat2 = Float.parseFloat(formatted2);
+//        sensorData2.setTemperature(temperatureFloat2);
+//        //设置路数
+//        sensorData2.setRoads(2);
+//        //判断数据有效性
+//        if(sensorData.getTemperature()>30 || sensorData.getTemperature()<-86
+//                || sensorData2.getTemperature()>30 || sensorData2.getTemperature()<-86){
+//            log.error("无效数据 sensorData1={} sensorData2 ={}", JSONObject.toJSONString(sensorData),JSONObject.toJSONString(sensorData2));
+//            return ListUtil.empty();
+//        }
+        return ListUtil.of(sensorData);
     }
     }
 
 
 
 

+ 1 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/model/MeilingColdChainMessageData.java

@@ -11,6 +11,7 @@ import lombok.Data;
 @Data
 @Data
 public class MeilingColdChainMessageData implements ColdChainMessageData {
 public class MeilingColdChainMessageData implements ColdChainMessageData {
     private String host;
     private String host;
+    private String port;
     private String deviceId;
     private String deviceId;
     private String modelName;
     private String modelName;
     private Float temperature;
     private Float temperature;