Przeglądaj źródła

继电器补充代码添加

qidingqiang 5 miesięcy temu
rodzic
commit
6e6c54f6e7

+ 67 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/ATCommandValidator.java

@@ -0,0 +1,67 @@
+package com.zd.laboratory.utils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ATCommandValidator {
+    // 正则表达式:匹配 AT+STACH 后跟任意内容,再跟 =1 和 OK
+    private static final Pattern COMMAND_PATTERN = Pattern.compile(
+            "AT\\+STACH.*?=1OK",
+            Pattern.CASE_INSENSITIVE | Pattern.DOTALL  // 忽略大小写,允许 . 匹配换行符
+    );
+
+    /**
+     * 判断命令是否匹配 AT+STACH...=1OK 格式
+     * @param command 待验证的命令字符串
+     * @return 匹配到 =1 返回 true,匹配到 =0 或不匹配返回 false
+     */
+    public static boolean checkCommand(String command) {
+        if (command == null) return false;
+        Matcher matcher = COMMAND_PATTERN.matcher(command);
+        return matcher.find();
+    }
+
+
+
+
+    // 正则表达式模式(匹配 AT+STACH4 和 OK 之间的任意字符串)
+     static final Pattern COMMAND_PATTERN_ALL = Pattern.compile(
+            "AT\\+STACH.*?OK",
+            Pattern.DOTALL  // 允许 . 匹配换行符
+    );
+
+    //匹配返回命令  判断是否有返回值
+     static boolean isCommandValid(String command) {
+        Matcher matcher = COMMAND_PATTERN_ALL.matcher(command);
+        return matcher.find();
+    }
+
+
+
+
+
+
+    // 正则表达式:匹配 STACH 后跟数字,直到 = 号
+    private static final Pattern NUMBER_PATTERN = Pattern.compile(
+            "STACH(\\d+)=",
+            Pattern.CASE_INSENSITIVE  // 忽略大小写
+    );
+
+    /**
+     * 从命令中提取 STACH 和 = 之间的数字
+     * @param command 输入的命令字符串
+     * @return 提取的数字,如果未匹配到则返回空字符串
+     */
+    public static String extractNumber(String command) {
+        if (command == null) return "";
+
+        Matcher matcher = NUMBER_PATTERN.matcher(command);
+        if (matcher.find()) {
+            // 捕获组1包含 STACH 和 = 之间的数字
+            return matcher.group(1);
+        }
+        return "";  // 未匹配到数字
+    }
+
+
+}

+ 45 - 24
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/RelayUtils.java

@@ -1,5 +1,6 @@
 package com.zd.laboratory.utils;
 
+import com.alibaba.fastjson.JSONObject;
 import com.zd.common.core.redis.RedisService;
 import com.zd.common.core.utils.SpringUtils;
 import com.zd.common.core.utils.StringUtils;
@@ -33,51 +34,71 @@ public class RelayUtils {
 
     /**
      * 继电器的开和关
+     *
      * @param data
      */
-    public static void relayOpenClose(String data,String relayCode) throws IOException {
-        log.info("relayOpenClose data:"+data);
-        if(data.contains(SocketTypes.NRKJ_IDENTIFY) && !data.contains(SocketTypes.AT_NRKJ_IDENTIFY)){
+    public static void relayOpenClose(String data, String relayCode) throws IOException {
+        log.info("relayOpenClose data:" + data);
+        if (data.contains(SocketTypes.NRKJ_IDENTIFY) && !data.contains(SocketTypes.AT_NRKJ_IDENTIFY)) {
             //继电器打开关闭
-            String statusData[]= data.split(",")[0].split(":");
-            String bitData[]= data.split(",")[0].split("\\+")[1].split(":");
-            Integer bit=Integer.parseInt(bitData[0].replace(RelayConstants.STACH,""));
-            Integer status=Integer.parseInt(statusData[statusData.length-1]);
-            log.info("status:"+status+"bit:"+bit);
+            String statusData[] = data.split(",")[0].split(":");
+            String bitData[] = data.split(",")[0].split("\\+")[1].split(":");
+            Integer bit = Integer.parseInt(bitData[0].replace(RelayConstants.STACH, ""));
+            Integer status = Integer.parseInt(statusData[statusData.length - 1]);
+            log.info("status:" + status + "bit:" + bit);
             LabRelayStatus labRelayStatus = new LabRelayStatus();
             labRelayStatus.setBit(bit);
-            if(status.equals(RelayConstants.AT_OPEN) ){
+            if (status.equals(RelayConstants.AT_OPEN)) {
                 log.info("打开了");
                 labRelayStatus.setNum(relayCode);
                 labRelayStatus.setHardwareOperate(HardwareOperate.OPEN);
-            }else{
+            } else {
                 log.info("关闭了");
                 labRelayStatus.setNum(relayCode);
                 labRelayStatus.setHardwareOperate(HardwareOperate.CLOSE);
             }
             //抛出继电器开关切换事件
-            LabRelayNrStatusEvent relayNrStatusEvent=new LabRelayNrStatusEvent(labRelayStatus);
+            LabRelayNrStatusEvent relayNrStatusEvent = new LabRelayNrStatusEvent(labRelayStatus);
             SpringUtils.getApplicationContext().publishEvent(relayNrStatusEvent);
+            //匹配返回命令
+        } else if (ATCommandValidator.isCommandValid(data)) {
+            // 提取操作位数
+            String bit = ATCommandValidator.extractNumber(data);
+
+            // 判断继电器状态(开/关) true 开发  false 关
+            HardwareOperate command = ATCommandValidator.checkCommand(data) ?
+                    HardwareOperate.OPEN : HardwareOperate.CLOSE;
+
+            // 记录操作日志并构建JSON对象
+            log.info("relayOpenClose继电器{}操作: 设备编号={}, 操作位={}", data, relayCode, bit);
+            LabRelayStatus labRelayStatus = new LabRelayStatus();
+            labRelayStatus.setNum(relayCode);
+            labRelayStatus.setBit(Integer.valueOf(bit));
+            labRelayStatus.setHardwareOperate(command);
+            // 发布设备开关切换事件
+            LabRelayNrStatusEvent event = new LabRelayNrStatusEvent(labRelayStatus);
+            SpringUtils.getApplicationContext().publishEvent(event);
         }
-        Object code= concurrentMap.get(RelayConstants.AT_RELAY_DATA+relayCode);
-        Integer activeCode=redisService.getCacheObject(RelayConstants.AT_RELAY_DATA+relayCode);
-        String dataStr= data.substring(0,17)+SocketTypes.NRKJ_PREFIX;
-        log.info("code:"+code+"activeCode:"+activeCode+"data:"+data);
-        if(StringUtils.isNull(code) || StringUtils.isNull(activeCode) || dataStr.equals(data)){
-            NettyPushMsgService.push(relayCode,RelayConstants.AT_STACH_ALL.getBytes());
-            concurrentMap.put(RelayConstants.AT_RELAY_DATA+relayCode,HardwareOperate.CLOSE.getCode());
+        Object code = concurrentMap.get(RelayConstants.AT_RELAY_DATA + relayCode);
+        Integer activeCode = redisService.getCacheObject(RelayConstants.AT_RELAY_DATA + relayCode);
+        String dataStr = data.substring(0, 17) + SocketTypes.NRKJ_PREFIX;
+        log.info("code:" + code + "activeCode:" + activeCode + "data:" + data);
+        if (StringUtils.isNull(code) || StringUtils.isNull(activeCode) || dataStr.equals(data)) {
+            NettyPushMsgService.push(relayCode, RelayConstants.AT_STACH_ALL.getBytes());
+            concurrentMap.put(RelayConstants.AT_RELAY_DATA + relayCode, HardwareOperate.CLOSE.getCode());
         }
-        redisService.setCacheObject(RelayConstants.AT_RELAY_DATA+relayCode,HardwareOperate.CLOSE.getCode(),1L, TimeUnit.MINUTES);
+        redisService.setCacheObject(RelayConstants.AT_RELAY_DATA + relayCode, HardwareOperate.CLOSE.getCode(), 1L, TimeUnit.MINUTES);
     }
 
     public static void relayOpenClose(String relayCode) throws IOException {
-        NettyPushMsgService.push(relayCode,RelayConstants.AT_STACH_ALL.getBytes());
-        redisService.setCacheObject(RelayConstants.AT_RELAY_DATA+relayCode,HardwareOperate.CLOSE.getCode(),15L, TimeUnit.SECONDS);
+        NettyPushMsgService.push(relayCode, RelayConstants.AT_STACH_ALL.getBytes());
+        redisService.setCacheObject(RelayConstants.AT_RELAY_DATA + relayCode, HardwareOperate.CLOSE.getCode(), 15L, TimeUnit.SECONDS);
 
     }
 
     /**
      * 继电器状态保存
+     *
      * @param data
      */
     public static void relayRefreshStatus(String data, String relayCode, String codeStr) {
@@ -88,15 +109,15 @@ public class RelayUtils {
         if (data.contains(RelayConstants.AT_STACH_ALL_STR)) {
             log.info("【继电器状态刷新】数据信息: {} ", data);
             String disposeCommand = data.replace(codeStr + RelayConstants.AT_STACH_ALL_STR, "");
-            disposeCommand=disposeCommand.replace(RelayConstants.PLUS_STACH,"");
-            log.info("disposeCommand:{}",disposeCommand);
+            disposeCommand = disposeCommand.replace(RelayConstants.PLUS_STACH, "");
+            log.info("disposeCommand:{}", disposeCommand);
             String splitCommand[] = disposeCommand.split("100000");
             //String disposeCommand = data.replace(codeStr + RelayConstants.AT_STACH_ALL, "");
             //String splitCommand[] = disposeCommand.split(RelayConstants.AT_SPLITE);
             LabRelayStatus labRelayStatus = new LabRelayStatus();
             for (String split : splitCommand) {
                 String status[] = split.split(",")[0].split(":");
-                if(status.length > 1){
+                if (status.length > 1) {
                     String bitStr = status[0].replace(RelayConstants.PLUS_STACH, "");
                     log.info("bit:" + bitStr + "继电器设备状态 status[]:" + Arrays.toString(status));
                     labRelayStatus.setNum(relayCode);