diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index 331b0f9..501f3ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -25,6 +27,21 @@ return super.toString() + "[value: " + interval + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("interval", interval); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("interval", interval); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index 331b0f9..501f3ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -25,6 +27,21 @@ return super.toString() + "[value: " + interval + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("interval", interval); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("interval", interval); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index f7fdeda..df2af9a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -5,12 +5,16 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @EqualsAndHashCode(callSuper = true) @Data +@Component("systemTime") +@Scope("prototype") public class DateTimeTag extends BirmmBaseTag { final String DATETIME_TAG_OID = "10000051"; diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index 331b0f9..501f3ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -25,6 +27,21 @@ return super.toString() + "[value: " + interval + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("interval", interval); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("interval", interval); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index f7fdeda..df2af9a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -5,12 +5,16 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @EqualsAndHashCode(callSuper = true) @Data +@Component("systemTime") +@Scope("prototype") public class DateTimeTag extends BirmmBaseTag { final String DATETIME_TAG_OID = "10000051"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java index 71995f5..406fcd0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestIPTag") +@Component("ip") public class DestIPTag extends BirmmBaseTag { final String DESTINATION_IP_TAG_OID = "10000022"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + ip + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("ip", ip); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("ip", ip); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index 331b0f9..501f3ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -25,6 +27,21 @@ return super.toString() + "[value: " + interval + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("interval", interval); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("interval", interval); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index f7fdeda..df2af9a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -5,12 +5,16 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @EqualsAndHashCode(callSuper = true) @Data +@Component("systemTime") +@Scope("prototype") public class DateTimeTag extends BirmmBaseTag { final String DATETIME_TAG_OID = "10000051"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java index 71995f5..406fcd0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestIPTag") +@Component("ip") public class DestIPTag extends BirmmBaseTag { final String DESTINATION_IP_TAG_OID = "10000022"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + ip + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("ip", ip); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("ip", ip); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java index 1c92a1e..05c583b 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestPortTag") +@Component("port") public class DestPortTag extends BirmmBaseTag { final String DESTINATION_PORT_TAG_OID = "10000023"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + port + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("port", port); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("port", port); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index 331b0f9..501f3ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -25,6 +27,21 @@ return super.toString() + "[value: " + interval + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("interval", interval); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("interval", interval); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index f7fdeda..df2af9a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -5,12 +5,16 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @EqualsAndHashCode(callSuper = true) @Data +@Component("systemTime") +@Scope("prototype") public class DateTimeTag extends BirmmBaseTag { final String DATETIME_TAG_OID = "10000051"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java index 71995f5..406fcd0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestIPTag") +@Component("ip") public class DestIPTag extends BirmmBaseTag { final String DESTINATION_IP_TAG_OID = "10000022"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + ip + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("ip", ip); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("ip", ip); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java index 1c92a1e..05c583b 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestPortTag") +@Component("port") public class DestPortTag extends BirmmBaseTag { final String DESTINATION_PORT_TAG_OID = "10000023"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + port + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("port", port); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("port", port); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java index da05817..d1431b2 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("lowerLimit") +@Scope("prototype") public class LowerLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000900"; @@ -19,6 +25,21 @@ return super.toString() + "[value: " + lowerLimit + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("lowerLimit", lowerLimit); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("lowerLimit", lowerLimit); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index 331b0f9..501f3ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -25,6 +27,21 @@ return super.toString() + "[value: " + interval + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("interval", interval); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("interval", interval); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index f7fdeda..df2af9a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -5,12 +5,16 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @EqualsAndHashCode(callSuper = true) @Data +@Component("systemTime") +@Scope("prototype") public class DateTimeTag extends BirmmBaseTag { final String DATETIME_TAG_OID = "10000051"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java index 71995f5..406fcd0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestIPTag") +@Component("ip") public class DestIPTag extends BirmmBaseTag { final String DESTINATION_IP_TAG_OID = "10000022"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + ip + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("ip", ip); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("ip", ip); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java index 1c92a1e..05c583b 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestPortTag") +@Component("port") public class DestPortTag extends BirmmBaseTag { final String DESTINATION_PORT_TAG_OID = "10000023"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + port + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("port", port); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("port", port); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java index da05817..d1431b2 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("lowerLimit") +@Scope("prototype") public class LowerLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000900"; @@ -19,6 +25,21 @@ return super.toString() + "[value: " + lowerLimit + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("lowerLimit", lowerLimit); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("lowerLimit", lowerLimit); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index a18915a..67c4a67 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; @@ -17,22 +19,37 @@ final String RETRY_TIMES_TAG_OID = "1000000A"; // TYPE_U8整型,重传次数 1-10 - int times; + int repeat; @Override public String toString() { - return super.toString() + "[value: " + times + "]"; + return super.toString() + "[value: " + repeat + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("repeat", repeat); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("repeat", repeat); +// return obj; +// } + @Override public void setValueDecStr(String valueDecStr) { - times = NumberUtil.parseNumber(valueDecStr).intValue(); + repeat = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - times = Integer.parseInt(valueStr, 16); + repeat = Integer.parseInt(valueStr, 16); } @Override @@ -40,7 +57,7 @@ String result = ""; result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", repeat); return result; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index 331b0f9..501f3ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -25,6 +27,21 @@ return super.toString() + "[value: " + interval + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("interval", interval); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("interval", interval); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index f7fdeda..df2af9a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -5,12 +5,16 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @EqualsAndHashCode(callSuper = true) @Data +@Component("systemTime") +@Scope("prototype") public class DateTimeTag extends BirmmBaseTag { final String DATETIME_TAG_OID = "10000051"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java index 71995f5..406fcd0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestIPTag") +@Component("ip") public class DestIPTag extends BirmmBaseTag { final String DESTINATION_IP_TAG_OID = "10000022"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + ip + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("ip", ip); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("ip", ip); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java index 1c92a1e..05c583b 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestPortTag") +@Component("port") public class DestPortTag extends BirmmBaseTag { final String DESTINATION_PORT_TAG_OID = "10000023"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + port + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("port", port); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("port", port); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java index da05817..d1431b2 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("lowerLimit") +@Scope("prototype") public class LowerLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000900"; @@ -19,6 +25,21 @@ return super.toString() + "[value: " + lowerLimit + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("lowerLimit", lowerLimit); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("lowerLimit", lowerLimit); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index a18915a..67c4a67 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; @@ -17,22 +19,37 @@ final String RETRY_TIMES_TAG_OID = "1000000A"; // TYPE_U8整型,重传次数 1-10 - int times; + int repeat; @Override public String toString() { - return super.toString() + "[value: " + times + "]"; + return super.toString() + "[value: " + repeat + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("repeat", repeat); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("repeat", repeat); +// return obj; +// } + @Override public void setValueDecStr(String valueDecStr) { - times = NumberUtil.parseNumber(valueDecStr).intValue(); + repeat = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - times = Integer.parseInt(valueStr, 16); + repeat = Integer.parseInt(valueStr, 16); } @Override @@ -40,7 +57,7 @@ String result = ""; result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", repeat); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index c25d8ba..95a882d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -23,6 +25,21 @@ return super.toString() + "[value: " + startMinute + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("acqStart", startMinute); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("acqStart", startMinute); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index 331b0f9..501f3ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -25,6 +27,21 @@ return super.toString() + "[value: " + interval + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("interval", interval); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("interval", interval); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index f7fdeda..df2af9a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -5,12 +5,16 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @EqualsAndHashCode(callSuper = true) @Data +@Component("systemTime") +@Scope("prototype") public class DateTimeTag extends BirmmBaseTag { final String DATETIME_TAG_OID = "10000051"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java index 71995f5..406fcd0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestIPTag") +@Component("ip") public class DestIPTag extends BirmmBaseTag { final String DESTINATION_IP_TAG_OID = "10000022"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + ip + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("ip", ip); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("ip", ip); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java index 1c92a1e..05c583b 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestPortTag") +@Component("port") public class DestPortTag extends BirmmBaseTag { final String DESTINATION_PORT_TAG_OID = "10000023"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + port + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("port", port); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("port", port); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java index da05817..d1431b2 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("lowerLimit") +@Scope("prototype") public class LowerLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000900"; @@ -19,6 +25,21 @@ return super.toString() + "[value: " + lowerLimit + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("lowerLimit", lowerLimit); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("lowerLimit", lowerLimit); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index a18915a..67c4a67 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; @@ -17,22 +19,37 @@ final String RETRY_TIMES_TAG_OID = "1000000A"; // TYPE_U8整型,重传次数 1-10 - int times; + int repeat; @Override public String toString() { - return super.toString() + "[value: " + times + "]"; + return super.toString() + "[value: " + repeat + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("repeat", repeat); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("repeat", repeat); +// return obj; +// } + @Override public void setValueDecStr(String valueDecStr) { - times = NumberUtil.parseNumber(valueDecStr).intValue(); + repeat = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - times = Integer.parseInt(valueStr, 16); + repeat = Integer.parseInt(valueStr, 16); } @Override @@ -40,7 +57,7 @@ String result = ""; result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", repeat); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index c25d8ba..95a882d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -23,6 +25,21 @@ return super.toString() + "[value: " + startMinute + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("acqStart", startMinute); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("acqStart", startMinute); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index 78596be..5b805b4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String UPLOAD_INTERVAL_TAG_OID = "10000062"; // TYPE_U16整型,数据上报间隔,范围: 3 – 1440 - int interval; + int period; @Override public String toString() { - return super.toString() + "[value: " + interval + "]"; + return super.toString() + "[value: " + period + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("period", period); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("period", period); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - interval = BytesUtil.hexStringToUInt(valueStr); + period = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - interval = NumberUtil.parseNumber(valueDecStr).intValue(); + period = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", period); return result; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java index 8ed6f2f..098f9f7 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/WebSocket.java @@ -47,7 +47,7 @@ @OnMessage public void onMessage(String message) { - log.info("【websocket消息】收到客户端消息:" + message); + log.debug("【websocket消息】收到客户端消息:" + message); // System.out.println("【websocket消息】收到客户端消息:" + message); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java new file mode 100644 index 0000000..17a1764 --- /dev/null +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceConfigMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface DeviceConfigMapper extends BaseMapper { + +} diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index deb5d9e..b3534c2 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -81,11 +81,11 @@ diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml index 7f0a356..4f11813 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceBizDataMapper.xml @@ -5,7 +5,7 @@ - + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml new file mode 100644 index 0000000..13f3913 --- /dev/null +++ b/casic-iot-dao/src/main/resources/mapper/DeviceConfigMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + + + device_id, devCode, config_json, logtime, frame_log_id + + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java new file mode 100644 index 0000000..b508cef --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceConfig.java @@ -0,0 +1,66 @@ +package com.casic.missiles.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.enums.DictCodeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 设备配置 设备下发配置所用表 + *

+ * + * @author cz + * @since 2023-11-22 + */ +@Data +@TableName("device_config") +public class DeviceConfig implements Serializable, DictCodeEnum { + + private static final long serialVersionUID = 1L; + + /** + * 设备编号 + */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ + @TableField("devCode") + @NotNull + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + /** + * 下发配置内容 + */ + @TableField("config_json") + @ApiModelProperty(value = "{\"repeat\":\"重传次数\",\"lowerThreshold\":\"低报\",\"upperThreshold\":\"高报\",\"collectTime\":\"采集时间\",\"period\":\"上传周期\",\"ip\":\"\",\"port\":\"\"}", dataType = "String") + private String configJson; + + + @TableField("logtime") + @ApiModelProperty(value = "上传时间", dataType = "LocalDateTime") + private LocalDateTime logtime; + + /** + * 编号 + */ + @TableField("frame_log_id") + private Long frameLogId; + +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index 06d131c..7fae695 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -28,6 +28,6 @@ ReturnDTO deleteBusConfig(List ids); BusConfig findLatestConfigToBeSend(Long deviceId); - BusConfig findLatestConfigSendToDevice(Long deviceId); + List findLatestConfigSendToDevice(Long deviceId); } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java new file mode 100644 index 0000000..8e8194f --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceConfigService.java @@ -0,0 +1,17 @@ +package com.casic.missiles.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.model.DeviceConfig; + +/** + *

+ * 设备配置 设备下发配置所用表 服务类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +public interface IDeviceConfigService extends IService { + + void saveOrUpdateByDeviceId(DeviceConfig deviceConfig); +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java index 619725a..04e38ee 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceService.java @@ -32,6 +32,7 @@ ReturnDTO updateDevice(Device deviceGroup); void updateDeviceImei(String deviceCode, String imei, String iccid); + void updateDeviceStatus(String deviceCode, Integer status); ReturnDTO deleteDevice(List ids); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index c86f230..7b902dd 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -93,13 +93,8 @@ } @Override - public BusConfig findLatestConfigSendToDevice(Long deviceId) { - List configList = baseMapper.findConfigListSendToDevice(deviceId); - if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { - return configList.get(0); - } - - return null; + public List findLatestConfigSendToDevice(Long deviceId) { + return baseMapper.findConfigListSendToDevice(deviceId); } /** diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java new file mode 100644 index 0000000..845f39d --- /dev/null +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceConfigServiceImpl.java @@ -0,0 +1,35 @@ +package com.casic.missiles.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.mapper.DeviceConfigMapper; +import com.casic.missiles.model.DeviceConfig; +import com.casic.missiles.service.IDeviceConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备配置 设备下发配置所用表 服务实现类 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Service +@RequiredArgsConstructor +public class DeviceConfigServiceImpl extends ServiceImpl implements IDeviceConfigService { + + @Override + public void saveOrUpdateByDeviceId(DeviceConfig deviceConfig) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("device_id", deviceConfig.getDeviceId()); + + // 先执行update 如果返回为0 则再执行insert + int count = baseMapper.update(deviceConfig, wrapper); + if (count == 0) { + baseMapper.insert(deviceConfig); + } + } +} diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java index 1a5c8bf..bd5e566 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceServiceImpl.java @@ -121,6 +121,15 @@ } @Override + public void updateDeviceStatus(String deviceCode, Integer status) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device)) { + device.setStatus(status); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-web/src/main/resources/config/application-dev.yml b/casic-iot-web/src/main/resources/config/application-dev.yml index ec165dc..5199412 100644 --- a/casic-iot-web/src/main/resources/config/application-dev.yml +++ b/casic-iot-web/src/main/resources/config/application-dev.yml @@ -6,16 +6,16 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/casic_iot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 # use-ping-method: false sensorhub: #实现动态的双库操作,暂时不想合并 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java index 29a6594..0839e26 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/GeneralServiceImpl.java @@ -3,11 +3,16 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; +import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; +import com.casic.missiles.frame.base.BirmmStartupRequestFrame; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; @@ -17,7 +22,6 @@ import com.casic.missiles.service.*; import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; -import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.buf.HexUtils; import org.springframework.stereotype.Service; @@ -47,6 +51,9 @@ IBusConfigService configService; @Resource + IDeviceConfigService devConfigService; + + @Resource IDeviceImeiIccidService imeiService; @Resource @@ -148,6 +155,10 @@ @Override public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + // 更新设备状态 + deviceService.updateDeviceStatus(baseFrame.getDevCode(), 1); + + // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { case UP_TRAP_REQUEST: @@ -157,7 +168,7 @@ case UP_STARTUP_REQUEST: // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei(baseFrame, frameLogId); + saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); break; case UP_ONLINE_REQUEST: @@ -170,7 +181,7 @@ case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus(baseFrame); + updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); break; default: @@ -178,55 +189,87 @@ } } - private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { - List bizDataList = baseFrame.convertToBizDataList(); + private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { + List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 bizData.setId(new SnowflakeUtil().nextId()); bizData.setFrameLogId(frameLogId); // 关联日志记录id - bizData.setDevcode(baseFrame.getDevCode()); - bizData.setDeviceType(Integer.valueOf(baseFrame.getDeviceType())); - bizData.setLogtime(baseFrame.getLogTime()); + bizData.setDevcode(trapRequest.getDevCode()); + bizData.setDeviceType(Integer.valueOf(trapRequest.getDeviceType())); + bizData.setLogtime(trapRequest.getLogTime()); } // 批量保存 bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { - List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); + private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + List imeiTags = startupRequest.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); - deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + deviceService.updateDeviceImei(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setDevcode(startupRequest.getDevCode()); imeiIccid.setImei(imeiTag.getImei()); imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setLogtime(startupRequest.getLogTime()); imeiIccid.setFrameLogId(frameLogId); imeiService.save(imeiIccid); } } - private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - // TODO-LIST - // 需要检查返回的配置项是否与下发的值一致 + // 更新设备当前配置项表的项目 + DeviceConfig newDevConfig = new DeviceConfig(); + newDevConfig.setDeviceId(device.getId()); + newDevConfig.setDevCode(device.getDevcode()); + newDevConfig.setFrameLogId(frameLogId); + newDevConfig.setLogtime(setResponse.getLogTime()); + newDevConfig.setConfigJson(setResponse.getConfigJSON().toJSONString()); + devConfigService.saveOrUpdateByDeviceId(newDevConfig); + // 更新下发表的状态 + // 查询所有已下发等待响应的下发配置记录 + List latestConfigList = configService.findLatestConfigSendToDevice(device.getId()); + for (BusConfig config : latestConfigList) { + // 转换成Map来进行匹配 + List configMap = JSONArray.parseArray(config.getConfigJson(), Map.class); // 数据库中的 + List responseMap = JSONArray.parseArray(setResponse.getConfigJSON().toJSONString(), Map.class); // 设备返回的 - // 更新状态 - latestConfig.setStatus(1); // 配置成功 - latestConfig.setResponseTime(LocalDateTime.now()); - configService.updateById(latestConfig); + // 检查与返回的配置项值是否一致 + if (setResponseMatchBusConfig(configMap, responseMap)) { + // 如果一致则更新为下发成功 + config.setStatus(1); // 配置成功 + config.setResponseTime(LocalDateTime.now()); + configService.updateById(config); + log.info("收到设备[{}]的SetResponse响应,配置{}成功成功", device.getDevcode(), config.getConfigJson()); + } } } } + private boolean setResponseMatchBusConfig(List configMap, List responseMap) { + for (Map configItem : configMap) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + for (Map responseItem : responseMap) { + if (responseItem.containsKey(configItemName) && !configItemValue.equals(responseItem.get(configItemName))) { + log.info("配置项[{}],下发的值[{}]和响应回复的值[{}]不匹配,跳过处理", configItemName, configItemValue, responseItem.get(configItemName)); + return false; + } + } + } + } + + return true; + } + @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { @@ -317,7 +360,7 @@ BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); if (ObjectUtil.isNotNull(latestConfig)) { log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItem(JSON.parseObject(latestConfig.getConfigJson(), Map.class)); + configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); // 更新下发配置的时间 diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java index 05c2e2b..2cb47f3 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseFrame.java @@ -8,6 +8,7 @@ import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; +import com.casic.missiles.util.SpringContextUtil; import lombok.Data; import java.io.Serializable; @@ -54,7 +55,7 @@ Map> tagList; // 待下发的配置项 - Map configItem; + List configItemList; // CRC String crc; @@ -72,18 +73,10 @@ return ""; } - public boolean isBizDataFrame() { - return false; - } - public boolean needPushToApplication() { return false; } - public boolean hasSensorStartupTag() { - return getTagList().containsKey(SensorStartupTag.class.getSimpleName()); - } - public List convertToBizDataList() { return new ArrayList<>(); } @@ -95,6 +88,22 @@ return json; } + /** + * 将配置项的tag生成简单的json对象 + * @return + */ +// public JSONObject getConfigTagJSONSimple() { +// JSONObject json = new JSONObject(); +// +// for (List sameTypeTags : tagList.values()) { +// for (BirmmBaseTag tag : sameTypeTags) { +// json = tag.toSimpleJSON(json); +// } +// } +// +// return json; +// } + public void doParseBizTag() {} public void replyPduType() { @@ -119,14 +128,17 @@ tagList.put(DateTimeTag.class.getSimpleName(), tags); // 有其他的配置项 - if (ObjectUtil.isNotNull(configItem)) { - for (String configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); + if (ObjectUtil.isNotEmpty(configItemList)) { + for (Map configItem : configItemList) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); - BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); - if (ObjectUtil.isNotNull(tag)) { - tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 - tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index a636eb4..978e8a7 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -1,5 +1,6 @@ package com.casic.missiles.frame.base; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -14,6 +15,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public JSONObject toJSON() { + return null; + } + public void setValueDecStr(String valueDecStr) { } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java new file mode 100644 index 0000000..f00f93b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java @@ -0,0 +1,54 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component("SetResponse") +@Scope("prototype") +public class BirmmSetResponseFrame extends BirmmBaseFrame { + + public final String MESSAGE_TYPE = "SetResponse"; + + public JSONArray getConfigJSON() { + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + + return configItems; + } + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", MESSAGE_TYPE); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + JSONArray configItems = new JSONArray(); + for (List configTag : getTagList().values()) { + // 配置项只取第一个 List中不会有多个 + if (configTag.isEmpty() || ObjectUtil.isNull(configTag.get(0).toJSON())) { + continue; + } + configItems.add(configTag.get(0).toJSON()); + } + body.put("configs", configItems); + + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 518507d..730f7db 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,15 +1,13 @@ package com.casic.missiles.frame.methane; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") @Scope("prototype") -public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class MethaneSetResponseFrame extends BirmmSetResponseFrame implements MethaneBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +18,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java index adb7ce0..fb363ae 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapRequestFrame.java @@ -76,11 +76,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java index 35ef234..d33805d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,15 +1,20 @@ package com.casic.missiles.frame.sentinel; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmDataBizTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.frame.base.BirmmSetResponseFrame; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.List; + @Component("SentinelSetResponse") @Scope("prototype") -public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { - - private final String MESSAGE_TYPE = "SetResponse"; +public class SentinelSetResponseFrame extends BirmmSetResponseFrame implements SentinelBaseFrame { @Override public String getDeviceTypeName() { @@ -20,11 +25,9 @@ public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - JSONObject body = new JSONObject(); + JSONObject body = json.getJSONObject("mBody"); body.put("bType", DEV_TYPE + "ConfigSuccess"); - json.put("mBody", body); return json; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 26b4eb4..c645062 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -10,6 +10,11 @@ public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } + + @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java index 544e203..1fa6a64 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapRequestFrame.java @@ -86,11 +86,6 @@ } @Override - public boolean isBizDataFrame() { - return true; - } - - @Override public boolean needPushToApplication() { return true; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java deleted file mode 100644 index 1ab8c70..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.missiles.frame.tag; - -import com.casic.missiles.frame.tag.config.CollectIntervalTag; -import com.casic.missiles.frame.tag.config.UploadIntervalTag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class BirmmTagConfig { - - // 首选 - @Bean("interval") - @Scope("prototype") - public CollectIntervalTag interval() { - System.out.println("create a new interval tag"); - return new CollectIntervalTag(); - } - - @Bean("period") - @Scope("prototype") - public UploadIntervalTag period() { - return new UploadIntervalTag(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 4e7ca70..9863377 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String COLLECT_COUNT_TAG_OID = "10000106"; // TYPE_U16整型,数据上报的采集次数,范围: 1 – 1440 - int count; + int times; @Override public String toString() { - return super.toString() + "[value: " + count + "]"; + return super.toString() + "[value: " + times + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("times", times); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("times", times); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - count = BytesUtil.hexStringToUInt(valueStr); + times = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - count = NumberUtil.parseNumber(valueDecStr).intValue(); + times = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", times); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index 331b0f9..501f3ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -25,6 +27,21 @@ return super.toString() + "[value: " + interval + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("interval", interval); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("interval", interval); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index f7fdeda..df2af9a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -5,12 +5,16 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @EqualsAndHashCode(callSuper = true) @Data +@Component("systemTime") +@Scope("prototype") public class DateTimeTag extends BirmmBaseTag { final String DATETIME_TAG_OID = "10000051"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java index 71995f5..406fcd0 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestIPTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestIPTag") +@Component("ip") public class DestIPTag extends BirmmBaseTag { final String DESTINATION_IP_TAG_OID = "10000022"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + ip + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("ip", ip); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("ip", ip); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java index 1c92a1e..05c583b 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DestPortTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -8,7 +10,7 @@ @EqualsAndHashCode(callSuper = true) @Data -@Component("DestPortTag") +@Component("port") public class DestPortTag extends BirmmBaseTag { final String DESTINATION_PORT_TAG_OID = "10000023"; @@ -20,6 +22,21 @@ return super.toString() + "[value: " + port + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("port", port); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("port", port); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java index da05817..d1431b2 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/LowerLimitTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("lowerLimit") +@Scope("prototype") public class LowerLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000900"; @@ -19,6 +25,21 @@ return super.toString() + "[value: " + lowerLimit + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("lowerLimit", lowerLimit); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("lowerLimit", lowerLimit); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index a18915a..67c4a67 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; @@ -17,22 +19,37 @@ final String RETRY_TIMES_TAG_OID = "1000000A"; // TYPE_U8整型,重传次数 1-10 - int times; + int repeat; @Override public String toString() { - return super.toString() + "[value: " + times + "]"; + return super.toString() + "[value: " + repeat + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("repeat", repeat); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("repeat", repeat); +// return obj; +// } + @Override public void setValueDecStr(String valueDecStr) { - times = NumberUtil.parseNumber(valueDecStr).intValue(); + repeat = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - times = Integer.parseInt(valueStr, 16); + repeat = Integer.parseInt(valueStr, 16); } @Override @@ -40,7 +57,7 @@ String result = ""; result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", repeat); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index c25d8ba..95a882d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -1,5 +1,7 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -23,6 +25,21 @@ return super.toString() + "[value: " + startMinute + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("acqStart", startMinute); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("acqStart", startMinute); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index 78596be..5b805b4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; @@ -18,22 +20,37 @@ final String UPLOAD_INTERVAL_TAG_OID = "10000062"; // TYPE_U16整型,数据上报间隔,范围: 3 – 1440 - int interval; + int period; @Override public String toString() { - return super.toString() + "[value: " + interval + "]"; + return super.toString() + "[value: " + period + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("period", period); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("period", period); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); - interval = BytesUtil.hexStringToUInt(valueStr); + period = BytesUtil.hexStringToUInt(valueStr); } @Override public void setValueDecStr(String valueDecStr) { - interval = NumberUtil.parseNumber(valueDecStr).intValue(); + period = NumberUtil.parseNumber(valueDecStr).intValue(); } @Override @@ -41,7 +58,7 @@ String result = ""; result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 - result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", period); return result; } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index 5acbd78..1f21ba6 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,6 +1,8 @@ package com.casic.missiles.frame.tag.config; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; @@ -24,6 +26,21 @@ return super.toString() + "[value: " + upperLimit + "]"; } + public JSONObject toJSON() { + JSONObject obj = new JSONObject(); + obj.put("upperLimit", upperLimit); + return obj; + } + +// @Override +// public JSONObject toSimpleJSON(JSONObject obj) { +// if (ObjectUtil.isNull(obj)) { +// obj = new JSONObject(); +// } +// obj.put("upperLimit", upperLimit); +// return obj; +// } + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr);