Przeglądaj źródła

feat(gas):优化数据解析逻辑并增强报警信息处理

- 修改帧类型、短地址和自动应答字段的解析方式,使用位运算替代格式化字符串
- 调整协议版本与报警信息字段的解析顺序及大小端转换逻辑
- 在 GasMonitorData 类中新增 parseAlarmBits 方法用于解析报警位信息
- 实现 getLatestWithAlarmBits 接口以获取带报警位解析的最新监测数据
- 为 WarningThreshold 类增加 deviceType 字段及其映射配置
林仔 7 miesięcy temu
rodzic
commit
79f7e70ed4

+ 8 - 7
flammable-gas-service/src/main/java/com/zksy/gas/utils/DataParser.java

@@ -10,8 +10,8 @@ public class DataParser {
     public static GasMonitorData parseMessage(byte[] frame) {
         GasMonitorData data = new GasMonitorData();
 
-        // 帧类型(直接输出)
-        data.setFrameType(Integer.valueOf(String.format("%02X", frame[3])));
+        // 帧类型
+        data.setFrameType(frame[3] & 0xFF);
 
         // MAC 地址 (4~11)
         byte[] macBytes = new byte[8];
@@ -19,10 +19,11 @@ public class DataParser {
         data.setMacAddress(ProtocolUtils.bytesToHex(macBytes));
 
         // 短地址 (12~13)
-        data.setShortAddress(String.format("%02X%02X", frame[12], frame[13]));
+        int shortAddressDecimal = ((frame[12] & 0xFF) << 8) | (frame[13] & 0xFF);
+        data.setShortAddress(String.valueOf(shortAddressDecimal));
 
         // 自动应答 (14)
-        data.setAutoReplyOption(Integer.valueOf(String.format("%02X", frame[14])));
+        data.setAutoReplyOption( frame[14] & 0xFF);
 
         // 跳过 AA 帧头(15) 和数据长度(16)
         int offset = 17;
@@ -40,11 +41,11 @@ public class DataParser {
         offset++;
 
         // 协议版本 (20)
-        data.setProtocolVersion(String.format("%02X", frame[offset]));
+        data.setProtocolVersion(String.valueOf(frame[offset] & 0xFF));
         offset++;
 
         // 报警信息 (21~22)
-        int alarmInfo = ((frame[offset + 1] & 0xFF) << 8) | (frame[offset] & 0xFF);
+        int alarmInfo = (frame[offset] & 0xFF ) | ((frame[offset + 1] & 0xFF) << 8);
         data.setAlarmInfo(alarmInfo);
         offset += 2;
 
@@ -133,7 +134,7 @@ public class DataParser {
         System.out.println("命令: " + parsed.getCommand());
         System.out.println("设备属性: " + parsed.getDeviceAttr());
         System.out.println("协议版本: " + parsed.getProtocolVersion());
-        System.out.println("报警信息: " + parsed.getAlarmInfo());
+        System.out.println("报警信息: " + parsed.getAlarmInfo()); // 此处输出已为大小端转换后的值
         System.out.println("时间戳: " + parsed.getReportTime());
         System.out.println("气体浓度: " + parsed.getGasConcentration() + " " + parsed.getGasUnit());
         System.out.println("气体类型: " + parsed.getGasType());

+ 26 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/gas/domain/GasMonitorData.java

@@ -10,6 +10,8 @@ import lombok.Data;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 可燃气体监测仪数据表
@@ -129,4 +131,28 @@ public class GasMonitorData implements Serializable {
 
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
+
+    public Map<String, Boolean> parseAlarmBits() {
+        Map<String, Boolean> alarmBits = new HashMap<>();
+        if (alarmInfo == null) {
+            alarmInfo = 0;
+        }
+        alarmBits.put("unknownAlarm", (alarmInfo & (1 << 0)) != 0); // Bit0:未知报警
+        alarmBits.put("highAlarm", (alarmInfo & (1 << 1)) != 0);     // Bit1:高报警
+        alarmBits.put("overRange", (alarmInfo & (1 << 2)) != 0);     // Bit2:超量程
+        alarmBits.put("calibrationCycle", (alarmInfo & (1 << 3)) != 0); // Bit3:标定周期
+        alarmBits.put("overLife", (alarmInfo & (1 << 4)) != 0);       // Bit4:超寿命
+        alarmBits.put("fallAlarm", (alarmInfo & (1 << 5)) != 0);      // Bit5:跌倒报警
+        alarmBits.put("undervoltage", (alarmInfo & (1 << 6)) != 0);   // Bit6:欠压报警
+        alarmBits.put("rangeAlarm", (alarmInfo & (1 << 7)) != 0);     // Bit7:区间报警
+        alarmBits.put("keyAlarm", (alarmInfo & (1 << 8)) != 0);       // Bit8:按键报警
+        alarmBits.put("vibrationAlarm", (alarmInfo & (1 << 9)) != 0); // Bit9:震动报警
+        alarmBits.put("waterLevelAlarm", (alarmInfo & (1 << 10)) != 0); // Bit10:水位报警
+        alarmBits.put("powerOffAlarm", (alarmInfo & (1 << 11)) != 0); // Bit11:断电报警
+        alarmBits.put("sensorFault", (alarmInfo & (1 << 12)) != 0);   // Bit12:传感器故障
+        alarmBits.put("overHumidity", (alarmInfo & (1 << 13)) != 0);  // Bit13:超湿报警
+        alarmBits.put("overTemperature", (alarmInfo & (1 << 14)) != 0); // Bit14:超温报警
+        alarmBits.put("systemFault", (alarmInfo & (1 << 15)) != 0);   // Bit15:系统故障
+        return alarmBits;
+    }
 }

+ 4 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/gas/service/GasMonitorDataService.java

@@ -23,4 +23,8 @@ public interface GasMonitorDataService extends IService<GasMonitorData> {
     List<GasMonitorData> getAlarms(String deviceId, LocalDateTime start, LocalDateTime end, double threshold);
 
     List<Map<String, Object>> getTrend(String deviceId, LocalDateTime start, LocalDateTime end);
+    /**
+     * 查询带报警位解析的监测数据
+     */
+    GasMonitorData getLatestWithAlarmBits(String deviceId);
 }

+ 13 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/gas/service/impl/GasMonitorDataServiceImpl.java

@@ -101,6 +101,19 @@ public class GasMonitorDataServiceImpl extends ServiceImpl<GasMonitorDataMapper,
                 })
                 .collect(Collectors.toList());
     }
+    @Override
+    public GasMonitorData getLatestWithAlarmBits(String deviceId) {
+        GasMonitorData data = lambdaQuery()
+                .eq(GasMonitorData::getMacAddress, deviceId)
+                .orderByDesc(GasMonitorData::getCreateTime)
+                .last("limit 1")
+                .one();
+        // 若数据存在,调用parseAlarmBits解析报警位
+        if (data != null) {
+            data.parseAlarmBits();
+        }
+        return data;
+    }
 }
 
 

+ 7 - 0
zk-api-service/src/main/java/com/zksy/api/domain/WarningThreshold.java

@@ -38,6 +38,13 @@ public class WarningThreshold implements Serializable {
     @ApiModelProperty(value = "设备编码")
     private String deviceCode;
 
+    /**
+     * 设备类型
+     */
+    @TableField(value = "device_type")
+    @ApiModelProperty(value = "设备类型")
+    private String deviceType;
+
     /**
      * 预警类型
      */

+ 2 - 1
zk-api-service/src/main/resources/mapper/WarningThresholdMapper.xml

@@ -8,6 +8,7 @@
             <id property="id" column="id" jdbcType="VARCHAR"/>
             <result property="deviceName" column="device_name" jdbcType="VARCHAR"/>
             <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
+            <result property="deviceType" column="device_type" jdbcType="VARCHAR"/>
             <result property="warningType" column="warning_type" jdbcType="VARCHAR"/>
             <result property="warningCode" column="warning_code" jdbcType="VARCHAR"/>
             <result property="warningValue" column="warning_value" jdbcType="DOUBLE"/>
@@ -17,7 +18,7 @@
     </resultMap>
 
     <sql id="Base_Column_List">
-        id,device_name,device_code,
+        id,device_name,device_code,device_type
         warning_type,warning_code,warning_value,
         remark,create_time,update_time
     </sql>