diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - return json; - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java deleted file mode 100644 index 2bd88df..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -public interface SentinelBaseFrame { - - String DEV_TYPE = "Tube"; -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java deleted file mode 100644 index 2bd88df..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -public interface SentinelBaseFrame { - - String DEV_TYPE = "Tube"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java deleted file mode 100644 index f9265d9..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -//import com.casic.missiles.frame.sentinel.SentinelGetRequestFrame; -//import com.casic.missiles.frame.sentinel.SentinelGetResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class SentinelFrameBuilderFactory { - - public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: -// return new MethaneGetRequestFrame(); - - case UP_TRAP_REQUEST: - return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - return new SentinelOnlineRequestFrame(); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(SentinelStartupRequestFrame.class); - - case UP_SET_RESPONSE: - return new SentinelSetResponseFrame(); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 -// return new MethaneGetResponseReply(); - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE - return SpringContextUtil.getBean(SentinelTrapResponseReply.class); - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseReply(); - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } else { - return null; - } - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java deleted file mode 100644 index 2bd88df..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -public interface SentinelBaseFrame { - - String DEV_TYPE = "Tube"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java deleted file mode 100644 index f9265d9..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -//import com.casic.missiles.frame.sentinel.SentinelGetRequestFrame; -//import com.casic.missiles.frame.sentinel.SentinelGetResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class SentinelFrameBuilderFactory { - - public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: -// return new MethaneGetRequestFrame(); - - case UP_TRAP_REQUEST: - return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - return new SentinelOnlineRequestFrame(); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(SentinelStartupRequestFrame.class); - - case UP_SET_RESPONSE: - return new SentinelSetResponseFrame(); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 -// return new MethaneGetResponseReply(); - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE - return SpringContextUtil.getBean(SentinelTrapResponseReply.class); - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseReply(); - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } else { - return null; - } - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java deleted file mode 100644 index 240c332..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; - -import java.time.format.DateTimeFormatter; - -public class SentinelOnlineRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java deleted file mode 100644 index 2bd88df..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -public interface SentinelBaseFrame { - - String DEV_TYPE = "Tube"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java deleted file mode 100644 index f9265d9..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -//import com.casic.missiles.frame.sentinel.SentinelGetRequestFrame; -//import com.casic.missiles.frame.sentinel.SentinelGetResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class SentinelFrameBuilderFactory { - - public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: -// return new MethaneGetRequestFrame(); - - case UP_TRAP_REQUEST: - return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - return new SentinelOnlineRequestFrame(); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(SentinelStartupRequestFrame.class); - - case UP_SET_RESPONSE: - return new SentinelSetResponseFrame(); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 -// return new MethaneGetResponseReply(); - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE - return SpringContextUtil.getBean(SentinelTrapResponseReply.class); - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseReply(); - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } else { - return null; - } - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java deleted file mode 100644 index 240c332..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; - -import java.time.format.DateTimeFormatter; - -public class SentinelOnlineRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java deleted file mode 100644 index 873cd37..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SentinelOnlineResponseReply extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - Map> tagList = new HashMap<>(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java deleted file mode 100644 index 2bd88df..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -public interface SentinelBaseFrame { - - String DEV_TYPE = "Tube"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java deleted file mode 100644 index f9265d9..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -//import com.casic.missiles.frame.sentinel.SentinelGetRequestFrame; -//import com.casic.missiles.frame.sentinel.SentinelGetResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class SentinelFrameBuilderFactory { - - public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: -// return new MethaneGetRequestFrame(); - - case UP_TRAP_REQUEST: - return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - return new SentinelOnlineRequestFrame(); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(SentinelStartupRequestFrame.class); - - case UP_SET_RESPONSE: - return new SentinelSetResponseFrame(); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 -// return new MethaneGetResponseReply(); - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE - return SpringContextUtil.getBean(SentinelTrapResponseReply.class); - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseReply(); - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } else { - return null; - } - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java deleted file mode 100644 index 240c332..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; - -import java.time.format.DateTimeFormatter; - -public class SentinelOnlineRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java deleted file mode 100644 index 873cd37..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SentinelOnlineResponseReply extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - Map> tagList = new HashMap<>(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index d33805d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ /dev/null @@ -1,34 +0,0 @@ -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 BirmmSetResponseFrame implements SentinelBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java deleted file mode 100644 index 2bd88df..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -public interface SentinelBaseFrame { - - String DEV_TYPE = "Tube"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java deleted file mode 100644 index f9265d9..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -//import com.casic.missiles.frame.sentinel.SentinelGetRequestFrame; -//import com.casic.missiles.frame.sentinel.SentinelGetResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class SentinelFrameBuilderFactory { - - public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: -// return new MethaneGetRequestFrame(); - - case UP_TRAP_REQUEST: - return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - return new SentinelOnlineRequestFrame(); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(SentinelStartupRequestFrame.class); - - case UP_SET_RESPONSE: - return new SentinelSetResponseFrame(); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 -// return new MethaneGetResponseReply(); - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE - return SpringContextUtil.getBean(SentinelTrapResponseReply.class); - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseReply(); - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } else { - return null; - } - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java deleted file mode 100644 index 240c332..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; - -import java.time.format.DateTimeFormatter; - -public class SentinelOnlineRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java deleted file mode 100644 index 873cd37..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SentinelOnlineResponseReply extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - Map> tagList = new HashMap<>(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index d33805d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ /dev/null @@ -1,34 +0,0 @@ -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 BirmmSetResponseFrame implements SentinelBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - 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 deleted file mode 100644 index c645062..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("SentinelStartupRequest") -@Scope("prototype") -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); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - return json; - } -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java deleted file mode 100644 index 2bd88df..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -public interface SentinelBaseFrame { - - String DEV_TYPE = "Tube"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java deleted file mode 100644 index f9265d9..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -//import com.casic.missiles.frame.sentinel.SentinelGetRequestFrame; -//import com.casic.missiles.frame.sentinel.SentinelGetResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class SentinelFrameBuilderFactory { - - public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: -// return new MethaneGetRequestFrame(); - - case UP_TRAP_REQUEST: - return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - return new SentinelOnlineRequestFrame(); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(SentinelStartupRequestFrame.class); - - case UP_SET_RESPONSE: - return new SentinelSetResponseFrame(); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 -// return new MethaneGetResponseReply(); - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE - return SpringContextUtil.getBean(SentinelTrapResponseReply.class); - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseReply(); - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } else { - return null; - } - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java deleted file mode 100644 index 240c332..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; - -import java.time.format.DateTimeFormatter; - -public class SentinelOnlineRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java deleted file mode 100644 index 873cd37..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SentinelOnlineResponseReply extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - Map> tagList = new HashMap<>(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index d33805d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ /dev/null @@ -1,34 +0,0 @@ -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 BirmmSetResponseFrame implements SentinelBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - 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 deleted file mode 100644 index c645062..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("SentinelStartupRequest") -@Scope("prototype") -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); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - return json; - } -} 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 1fa6a64..a251c26 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 @@ -23,23 +23,18 @@ import java.util.List; @Slf4j -@Component("SentinelTrapRequestFrame") +@Component("SentinelTrapRequest") @Scope("prototype") -public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { +public class SentinelTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -188,12 +183,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java deleted file mode 100644 index 2bd88df..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -public interface SentinelBaseFrame { - - String DEV_TYPE = "Tube"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java deleted file mode 100644 index f9265d9..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -//import com.casic.missiles.frame.sentinel.SentinelGetRequestFrame; -//import com.casic.missiles.frame.sentinel.SentinelGetResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class SentinelFrameBuilderFactory { - - public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: -// return new MethaneGetRequestFrame(); - - case UP_TRAP_REQUEST: - return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - return new SentinelOnlineRequestFrame(); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(SentinelStartupRequestFrame.class); - - case UP_SET_RESPONSE: - return new SentinelSetResponseFrame(); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 -// return new MethaneGetResponseReply(); - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE - return SpringContextUtil.getBean(SentinelTrapResponseReply.class); - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseReply(); - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } else { - return null; - } - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java deleted file mode 100644 index 240c332..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; - -import java.time.format.DateTimeFormatter; - -public class SentinelOnlineRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java deleted file mode 100644 index 873cd37..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SentinelOnlineResponseReply extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - Map> tagList = new HashMap<>(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index d33805d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ /dev/null @@ -1,34 +0,0 @@ -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 BirmmSetResponseFrame implements SentinelBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - 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 deleted file mode 100644 index c645062..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("SentinelStartupRequest") -@Scope("prototype") -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); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - return json; - } -} 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 1fa6a64..a251c26 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 @@ -23,23 +23,18 @@ import java.util.List; @Slf4j -@Component("SentinelTrapRequestFrame") +@Component("SentinelTrapRequest") @Scope("prototype") -public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { +public class SentinelTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -188,12 +183,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java deleted file mode 100644 index 02e5678..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("SentinelTrapResponseFrame") -@Scope("prototype") -public class SentinelTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java index 7637652..34a4133 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceMapper.java @@ -7,6 +7,7 @@ import com.casic.missiles.dto.device.DeviceListVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.model.Device; +import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -20,6 +21,7 @@ * @author cz * @since 2023-11-20 */ +@CacheNamespace public interface DeviceMapper extends BaseMapper { List listPage(@Param("page") Page page, diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java index 24fa5ad..6b18b14 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceUpgradeTaskMapper.java @@ -22,4 +22,6 @@ List listPage(@Param("page") Page page, @Param("request") UpgradeTaskDTO request, @Param("dataScope") DataScope dataScope); + + List findUpgradeTaskListToBeSend(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml index f1442aa..21e7564 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceUpgradeTaskMapper.xml @@ -8,13 +8,16 @@ + + + - id, version_id, device_id, status, create_time, create_user_id + id, version_id, device_id, task_name, upgrade_version_name, status, create_time, create_user_id, version_desc @@ -70,4 +73,14 @@ order by dv.create_time desc + + diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java index e8b968d..b6733e0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/Device.java @@ -128,6 +128,13 @@ */ @TableField("create_user_id") private Long createUserId; + + /** + * 固件版本号 + */ + @TableField("version") + private String version; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java index b2cf3d5..2238de0 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceUpgradeTask.java @@ -27,7 +27,7 @@ /** * 编号 */ - @TableId("id") + @TableId("id") private Long id; /** @@ -42,8 +42,15 @@ @TableField("device_id") private Long deviceId; + + @TableField("task_name") + private String taskName; + + @TableField("upgrade_version_name") + private String upgradeVersionName; + /** - * 升级状态 选项:0=正常 1=审核中 2=被否决 -1=已删除 -2=草稿 + * 升级状态 选项:0=正常 1=成功 2=失败 */ @TableField("status") private Integer status; @@ -64,8 +71,11 @@ /** * 创建用户id */ - @TableField("create_user_name") + @TableField(exist = false) private String createUserName; + @TableField("version_desc") + private String versionDesc; + } 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 04e38ee..e1eb579 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 @@ -31,9 +31,29 @@ ReturnDTO addDevice(Device deviceGroup); ReturnDTO updateDevice(Device deviceGroup); + + /** + * 更新IMEI和ICCID字段 如果没有变化则不再更新 + * @param deviceCode + * @param imei + * @param iccid + */ void updateDeviceImei(String deviceCode, String imei, String iccid); + + /** + * 更新状态字段 如果没有变化则不再更新 + * @param deviceCode + * @param status + */ void updateDeviceStatus(String deviceCode, Integer status); + /** + * 更新设备固件版本信息 如果没有变化则不再更新 + * @param deviceCode + * @param version + */ + void updateDeviceVersion(String deviceCode, String version); + ReturnDTO deleteDevice(List ids); Device deviceDetail(Long id) throws Exception; diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java index 7b36b61..b8e5d66 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceUpgradeTaskService.java @@ -26,4 +26,6 @@ ReturnDTO addUpgradeTask(DeviceUpgradeTask deviceVersion); ReturnDTO deleteUpgradeTask(List ids); + + DeviceUpgradeTask getByDeviceId(Long deviceId); } 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 bd5e566..b276a17 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 @@ -113,7 +113,8 @@ @Override public void updateDeviceImei(String deviceCode, String imei, String iccid) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && + (!imei.equals(device.getImei()) || !iccid.equals(device.getIccid()))) { device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); @@ -123,13 +124,22 @@ @Override public void updateDeviceStatus(String deviceCode, Integer status) { Device device = getDeviceByDeviceCode(deviceCode); - if (ObjectUtil.isNotNull(device)) { + if (ObjectUtil.isNotNull(device) && status.intValue() != device.getStatus().intValue()) { device.setStatus(status); baseMapper.updateById(device); } } @Override + public void updateDeviceVersion(String deviceCode, String version) { + Device device = getDeviceByDeviceCode(deviceCode); + if (ObjectUtil.isNotNull(device) && !version.equalsIgnoreCase(device.getVersion())) { + device.setVersion(version); + baseMapper.updateById(device); + } + } + + @Override public ReturnDTO deleteDevice(List ids) { if (this.baseMapper.deleteBatchIds(ids) > 0) { return ReturnUtil.success(); diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java index dd5f7fc..c872654 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceUpgradeTaskServiceImpl.java @@ -1,5 +1,7 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -13,6 +15,8 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.DeviceUpgradeTaskMapper; +import com.casic.missiles.model.BusConfig; +import com.casic.missiles.model.DeviceConfig; import com.casic.missiles.model.DeviceUpgradeTask; import com.casic.missiles.service.IDeviceUpgradeTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,4 +66,14 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public DeviceUpgradeTask getByDeviceId(Long deviceId) { + List taskList = baseMapper.findUpgradeTaskListToBeSend(deviceId); + if (ObjectUtil.isNotNull(taskList) && !taskList.isEmpty()) { + return taskList.get(0); + } + + return null; + } + } diff --git a/casic-iot-web/src/main/resources/config/application.yml b/casic-iot-web/src/main/resources/config/application.yml index 910a176..0fcd40b 100644 --- a/casic-iot-web/src/main/resources/config/application.yml +++ b/casic-iot-web/src/main/resources/config/application.yml @@ -54,6 +54,7 @@ # 配置结果集属性为空时 是否映射返回结果 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 map-underscore-to-camel-case: true + cache-enabled: true mapper-locations: classpath*:/mapper/**/*.xml,classpath:com/casic/missiles/modular/system/dao/**/*.xml ################### spring?? ################### diff --git a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java index 713e926..057250b 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/controller/GeneralDataReceiver.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.device.DeviceCtnbDTO; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.service.*; import com.casic.missiles.util.aep.AepCommandSend; @@ -63,10 +64,10 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); + BirmmBaseReply configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(configFrame); log.info("下行HEX字节消息帧:{}", replyMessage); int retCode = -1; @@ -88,7 +89,7 @@ } if (retCode == 0) { - log.info("回复设备成功"); + log.debug("回复设备成功"); } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java index c313a70..160a4e3 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/BirmmHexDecoder.java @@ -1,6 +1,7 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; import com.casic.missiles.service.IGeneralService; import com.casic.missiles.service.impl.GeneralServiceImpl; import com.casic.missiles.util.SpringContextUtil; @@ -56,17 +57,16 @@ defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 - BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); - if (configFrame != null) { + BirmmBaseReply baseReply = defaultService.buildReplyFrame(birmmFrame); + if (baseReply != null) { // 根据协议进行封装 - String replyMessage = defaultService.replyMessage(configFrame); + String replyMessage = defaultService.doReplyParse(baseReply); log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); + } else { + log.debug("{}类消息,无需回复", birmmFrame.getOperationTypeName()); } - - // 查询是否需要远程升级 - } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java index a0634ad..b267e8d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/IGeneralService.java @@ -1,6 +1,7 @@ package com.casic.missiles.service; import com.casic.missiles.frame.base.BirmmBaseFrame; +import com.casic.missiles.frame.base.BirmmBaseReply; public interface IGeneralService { @@ -24,12 +25,12 @@ * @param uploadFrame 收到的消息帧 * @return */ - BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame); + BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame); /** * 查找需要下发的配置 * 组装下发消息帧 * @return */ - String replyMessage(BirmmBaseFrame frameObj); + String doReplyParse(BirmmBaseReply reply); } 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 0839e26..446078c 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 @@ -2,18 +2,14 @@ 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.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.base.BirmmStartupRequest; +import com.casic.missiles.frame.base.*; import com.casic.missiles.frame.tag.biz.SensorStartupTag; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; import com.casic.missiles.model.*; import com.casic.missiles.parser.BirmmProtocolParser; import com.casic.missiles.parser.safe.SafeStrategy; @@ -54,7 +50,7 @@ IDeviceConfigService devConfigService; @Resource - IDeviceImeiIccidService imeiService; + IDeviceUpgradeTaskService otaService; @Resource ISubscribeStoreService subscribeService; @@ -113,7 +109,7 @@ Map> tagList = protocol.getTagList(plainBytes); // 创建Frame - BirmmBaseFrame birmmFrame = BirmmFrameBuilderFactory.createBirmmFrame(deviceType, operaType); + BirmmBaseFrame birmmFrame = createBirmmFrame(deviceType, operaType); if (birmmFrame != null) { birmmFrame.setLogTime(LocalDateTime.now()); // 记录日志时间 取服务器本地时间 birmmFrame.setDevCode(devCode); @@ -161,27 +157,28 @@ // 根据操作类型 执行业务后处理 BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); switch (operationType) { + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + case UP_TRAP_REQUEST: // 上报业务数据后处理 保存业务数据 saveBizData(baseFrame, frameLogId); break; - case UP_STARTUP_REQUEST: - // 上报三码数据后处理 保存三码记录 更新device表的对应字段 - saveSensorDevCodeAndImei((BirmmStartupRequestFrame) baseFrame, frameLogId); - break; - case UP_ONLINE_REQUEST: // 查询是否需要升级固件程序 + updateDeviceVersion((BirmmOnlineRequest) baseFrame); break; - case UP_GET_REQUEST: - // 请求远程升级固件程序的数据 + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei((BirmmStartupRequest) baseFrame, frameLogId); break; case UP_SET_RESPONSE: // 设置响应消息后处理 更新config表对应状态 - updateConfigStatus((BirmmSetResponseFrame) baseFrame, frameLogId); + updateConfigStatus((BirmmSetResponse) baseFrame, frameLogId); break; default: @@ -189,6 +186,11 @@ } } + /** + * 保存业务数据 + * @param trapRequest + * @param frameLogId + */ private void saveBizData(BirmmBaseFrame trapRequest, Long frameLogId) { List bizDataList = trapRequest.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { @@ -204,23 +206,37 @@ bizDataService.saveBatch(bizDataList); } - private void saveSensorDevCodeAndImei(BirmmStartupRequestFrame startupRequest, Long frameLogId) { + /** + * 保存三码到数据库 + * 更新对应设备编号的IMEI和ICCID + * @param startupRequest + * @param frameLogId + */ + private void saveSensorDevCodeAndImei(BirmmStartupRequest 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(startupRequest.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(startupRequest.getDevCode()); - imeiIccid.setImei(imeiTag.getImei()); - imeiIccid.setIccid(imeiTag.getIccid()); - imeiIccid.setLogtime(startupRequest.getLogTime()); - imeiIccid.setFrameLogId(frameLogId); - imeiService.save(imeiIccid); + // 设备基本信息表中有IMEI和ICCID字段 不再保存历史记录 } } - private void updateConfigStatus(BirmmSetResponseFrame setResponse, Long frameLogId) { + private void updateDeviceVersion(BirmmOnlineRequest onlineRequest) { + List softwareTags = onlineRequest.getTagList().get(SoftwareVersionTag.class.getSimpleName()); + if (ObjectUtil.isNotNull(softwareTags) && !softwareTags.isEmpty()) { + SoftwareVersionTag softwareTag = (SoftwareVersionTag) softwareTags.get(0); + deviceService.updateDeviceVersion(onlineRequest.getDevCode(), softwareTag.getVersion()); + } + } + + /** + * 更新设备当前配置项的值 + * 更新最新的下发配置项的状态 + * @param setResponse + * @param frameLogId + */ + private void updateConfigStatus(BirmmSetResponse setResponse, Long frameLogId) { // 查询数据库找到待下发的内容 Device device = deviceService.getDeviceByDeviceCode(setResponse.getDevCode()); if (ObjectUtil.isNotNull(device)) { @@ -273,7 +289,7 @@ @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { - log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + log.debug("[{}][{}, {}]类消息,无需推送", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } @@ -299,90 +315,34 @@ } @Override - public BirmmBaseFrame buildReplyFrame(BirmmBaseFrame uploadFrame) { - BirmmBaseFrame configFrame = BirmmFrameBuilderFactory.createBirmmReplyFrame(uploadFrame.getDeviceType(), uploadFrame.getOperationType()); + public BirmmBaseReply buildReplyFrame(BirmmBaseFrame uploadFrame) { + BirmmBaseReply replyFrame = createBirmmReplyFrame(uploadFrame.getOperationType(), uploadFrame.getDevCode()); - if (null != configFrame) { - configFrame.setDevCode(uploadFrame.getDevCode()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.setCommunicationType(uploadFrame.getCommunicationType()); - configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); - configFrame.setSequence(uploadFrame.getSequence()); + if (null != replyFrame) { + replyFrame.setDevCode(uploadFrame.getDevCode()); + replyFrame.setDeviceType(uploadFrame.getDeviceType()); + replyFrame.setDeviceTypeName(uploadFrame.getDeviceTypeName()); + replyFrame.setCommunicationType(uploadFrame.getCommunicationType()); + replyFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); + replyFrame.setSequence(uploadFrame.getSequence()); - BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); - switch (typeEnums) { - case UP_GET_REQUEST: - // 请求远程升级数据 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - replyGetRequestHandler(configFrame); - break; - - case UP_ONLINE_REQUEST: - // 查询是否需要远程升级 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - replyOnlineRequestHandler(configFrame); - break; - - case UP_STARTUP_REQUEST: - // 开机上报三码 - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // 根据是否有配置回复操作类型 - replyTrapRequestHandler(configFrame); - break; - - default: - break; - - } - - configFrame.replyPduType(); // 生成pduType - configFrame.replyBizTag(); // 生成回复业务tag + replyFrame.replyPduType(); // 生成pduType + replyFrame.replyBizTag(); // 生成回复业务tag } - return configFrame; - } - - private void replyGetRequestHandler(BirmmBaseFrame configFrame) { - // 组装升级包的数据 - } - - private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { - // 查询是否需要远程升级 - } - - private void replyTrapRequestHandler(BirmmBaseFrame configFrame) { - // 查询数据库找到待下发的内容 - Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); - if (ObjectUtil.isNotNull(device)) { - BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); - if (ObjectUtil.isNotNull(latestConfig)) { - log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); - configFrame.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue()); - - // 更新下发配置的时间 - latestConfig.setSendTime(LocalDateTime.now()); - latestConfig.setStatus(3); // 配置中 - configService.updateById(latestConfig); - } else { - configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - } - } + return replyFrame; } @Override - public String replyMessage(BirmmBaseFrame configFrame) { + public String doReplyParse(BirmmBaseReply baseReply) { StringBuilder frame = new StringBuilder(); // A320 - frame.append(configFrame.getPRE_CODE()); - frame.append(configFrame.getVERSION()); + frame.append(baseReply.getPRE_CODE()); + frame.append(baseReply.getVERSION()); // 处理tag - String plainTagListStr = protocol.buildTagListStr(configFrame.getTagList()); + String plainTagListStr = protocol.buildTagListStr(baseReply.getTagList()); log.info("下行业务字段:{}", plainTagListStr); // 计算长度 @@ -396,22 +356,22 @@ frame.append(String.format("%04x", length)); log.debug("下行帧结构字段:[长度:{}],[设备编号:{}],[通信方式:{}],[目标节点地址:{}],[PDUType:{}],[序号:{}]", - length, configFrame.getDevCode(), configFrame.getCommunicationType(), - configFrame.getDestinationAddr(), configFrame.getPduType(), configFrame.getSequence()); + length, baseReply.getDevCode(), baseReply.getCommunicationType(), + baseReply.getDestinationAddr(), baseReply.getPduType(), baseReply.getSequence()); // 设备编号 - PDUType字段 - frame.append(configFrame.getDevCode()); - frame.append(configFrame.getCommunicationType()); - frame.append(configFrame.getDestinationAddr()); - frame.append(configFrame.getPduType()); - frame.append(configFrame.getSequence()); + frame.append(baseReply.getDevCode()); + frame.append(baseReply.getCommunicationType()); + frame.append(baseReply.getDestinationAddr()); + frame.append(baseReply.getPduType()); + frame.append(baseReply.getSequence()); // 加密 // TODO-LIST // 密钥根据设备编号获取 SafeStrategy safeStrategy; - if (configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || - configFrame.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { + if (baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.METHANE.getValue()) || + baseReply.getDeviceType().equalsIgnoreCase(BirmmDeviceTypeEnums.SENTINEL.getValue())) { safeStrategy = SpringContextUtil.getBean(Sm4.class); } else { safeStrategy = SpringContextUtil.getBean(TeaUtilsX.class); @@ -458,4 +418,111 @@ return object; } + + private BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { + BirmmBaseFrame baseFrame = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + BirmmDeviceTypeEnums devTypeEnums = BirmmDeviceTypeEnums.toType(deviceType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + if (operaType.equals(BirmmOperationTypeEnums.UP_TRAP_REQUEST.getValue())) { + // 4: UP_TRAP_REQUEST 根据设备类型来创建 + if (ObjectUtil.isNotNull(devTypeEnums)) { + baseFrame = SpringContextUtil.getBean(devTypeEnums.getDescription() + operationTypeEnums.getDescription()); + } + } else { + // 1: UP_GET_REQUEST + // 6: UP_ONLINE_REQUEST + // 8: UP_STARTUP_REQUEST + // 12: UP_SET_RESPONSE + baseFrame = SpringContextUtil.getBean(operationTypeEnums.getDescription()); + } + } + + if (ObjectUtil.isNotNull(baseFrame)) { + baseFrame.setOperationTypeName(operationTypeEnums.getDescription()); + baseFrame.setDeviceTypeName(devTypeEnums.getDescription()); + } + return baseFrame; + } + + private BirmmBaseReply createBirmmReplyFrame(String operaType, String devCode) { + BirmmBaseReply baseReply = null; + + BirmmOperationTypeEnums operationTypeEnums = BirmmOperationTypeEnums.toType(operaType); + if (ObjectUtil.isNotNull(operationTypeEnums)) { + switch (operationTypeEnums) { + case UP_GET_REQUEST: + // GetRequest回复类型为GetResponse + // TODO + replyGetRequestHandler(baseReply); + break; + + case UP_TRAP_REQUEST: + // TrapRequest回复类型为TrapResponse或者SetRequest + // 没有配置时发TrapResponse;有配置时发SetRequest + Device device = deviceService.getDeviceByDeviceCode(devCode); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigToBeSend(device.getId()); // status = 0/3 + if (ObjectUtil.isNotNull(latestConfig)) { + // 查询数据库找到待下发的内容 + baseReply = SpringContextUtil.getBean(BirmmSetRequest.class); // 构造函数中已经设置好了操作类型 + + // 组装需要下发的配置项Tag + baseReply.setConfigItemList(JSONArray.parseArray(latestConfig.getConfigJson(), Map.class)); + replyTrapRequestHandler(latestConfig); + } else { + // 没有配置时回复TrapResponse + baseReply = SpringContextUtil.getBean(BirmmTrapResponse.class); // 构造函数中已经设置好了操作类型 + } + } + break; + + case UP_ONLINE_REQUEST: + // OnlineRequest回复类型为OnlineResponse + baseReply = SpringContextUtil.getBean(BirmmOnlineResponse.class); // 构造函数中已经设置好了操作类型 + + // 需要判断是否有升级任务 + replyOnlineRequestHandler(baseReply); + break; + + case UP_STARTUP_REQUEST: + // StartupRequest回复类型为StartupResponse + baseReply = SpringContextUtil.getBean(BirmmStartupResponse.class); // 构造函数中已经设置好了操作类型 + + // 只需要返回校时Tag即可 + break; + + case UP_SET_RESPONSE: + // SET_RESPONSE类消息 无需回复 + break; + } + } + + return baseReply; + } + + private void replyGetRequestHandler(BirmmBaseFrame configFrame) { + // 组装升级包的数据 + } + + private void replyOnlineRequestHandler(BirmmBaseFrame configFrame) { + // 查询是否需要远程升级 + Device device = deviceService.getDeviceByDeviceCode(configFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + DeviceUpgradeTask task = otaService.getByDeviceId(device.getId()); + if (ObjectUtil.isNotNull(task)) { + log.info("找到待升级的任务:{},{}", configFrame.getDevCode(), task.getUpgradeVersionName()); + } + } + } + + private void replyTrapRequestHandler(BusConfig latestConfig) { + log.info("找到待下发的配置项:{},{}", latestConfig.getDevcode(), latestConfig.getConfigJson()); + + // 更新下发配置的时间 + latestConfig.setSendTime(LocalDateTime.now()); + latestConfig.setStatus(3); // 配置中 + configService.updateById(latestConfig); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java deleted file mode 100644 index 97d7142..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/BirmmFrameBuilderFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.casic.missiles.frame; - -import com.casic.missiles.enums.BirmmDeviceTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneFrameBuilderFactory; -import com.casic.missiles.frame.sentinel.SentinelFrameBuilderFactory; - -public class BirmmFrameBuilderFactory { - - public static BirmmBaseFrame createBirmmFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - - public static BirmmBaseFrame createBirmmReplyFrame(String deviceType, String operaType) { - BirmmDeviceTypeEnums type = BirmmDeviceTypeEnums.toType(deviceType); - if (type != null) { - switch (type) { - case METHANE: - return MethaneFrameBuilderFactory.createMethaneReplyFrameByOperation(operaType); - - case SENTINEL: - return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - - default: - return null; - } - - } - - return null; - } - -} 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 2cb47f3..301ab49 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 @@ -33,6 +33,7 @@ // 设备类型 String deviceType; + String deviceTypeName; // 通信方式 String communicationType; @@ -45,6 +46,7 @@ // 操作类型 String operationType; + String operationTypeName; // 序号 String sequence; @@ -54,9 +56,6 @@ Map> tagList; - // 待下发的配置项 - List configItemList; - // CRC String crc; @@ -69,10 +68,6 @@ return typeEnums.getDescription(); } - public String getDeviceTypeName() { - return ""; - } - public boolean needPushToApplication() { return false; } @@ -88,59 +83,6 @@ 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() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - public void replyBizTag() { - tagList = new HashMap<>(); - DateTimeTag dateTimeTag = new DateTimeTag(); - dateTimeTag.setDateTime(LocalDateTime.now()); - - List tags = new ArrayList<>(); - tags.add(dateTimeTag); - tagList.put(DateTimeTag.class.getSimpleName(), tags); - - // 有其他的配置项 - if (ObjectUtil.isNotEmpty(configItemList)) { - for (Map configItem : configItemList) { - for (Object configItemName : configItem.keySet()) { - Object configItemValue = configItem.get(configItemName); - - // 根据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/BirmmBaseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java new file mode 100644 index 0000000..89571b0 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseReply.java @@ -0,0 +1,41 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.frame.tag.config.DateTimeTag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BirmmBaseReply extends BirmmBaseFrame { + + // 待下发的配置项 + List configItemList; + + public void replyBizTag() { + tagList = new HashMap<>(); + DateTimeTag dateTimeTag = new DateTimeTag(); + dateTimeTag.setDateTime(LocalDateTime.now()); + + List tags = new ArrayList<>(); + tags.add(dateTimeTag); + tagList.put(DateTimeTag.class.getSimpleName(), tags); + } + + public void replyPduType() { + StringBuilder pduType; + + int pduValue = Integer.parseInt(operationType) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); + pduType = new StringBuilder(Integer.toHexString(pduValue)); + while (pduType.length() != 4) { + pduType.insert(0, "0"); + } + + this.setPduType(pduType.toString().toUpperCase()); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java new file mode 100644 index 0000000..01f9b10 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineRequest.java @@ -0,0 +1,31 @@ +package com.casic.missiles.frame.base; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; + +@Component("OnlineRequest") +@Scope("prototype") +public class BirmmOnlineRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + + JSONObject body = new JSONObject(); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { + SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); + body.put("softwareVersion", tag.getVersion()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java new file mode 100644 index 0000000..d277bde --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmOnlineResponse.java @@ -0,0 +1,35 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.ota.NeedOTATag; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component("OnlineResponse") +public class BirmmOnlineResponse extends BirmmBaseReply { + + public BirmmOnlineResponse() { + operationType = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getDescription(); + } + + @Override + public void replyBizTag() { + // 无需升级 回复NeedOTATag + // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag + // TODO-LIST + // 暂时回复不用升级 + super.replyBizTag(); + + Map> tagList = getTagList(); + NeedOTATag needTag = new NeedOTATag(); + needTag.setNeed(false); + List needTags = new ArrayList<>(); + needTags.add(needTag); + tagList.put(NeedOTATag.class.getSimpleName(), needTags); + super.setTagList(tagList); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java new file mode 100644 index 0000000..71e053b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetRequest.java @@ -0,0 +1,50 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.base.BirmmBaseReply; +import com.casic.missiles.frame.base.BirmmBaseTag; +import com.casic.missiles.util.SpringContextUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@Component("SetRequest") +@Scope("prototype") +public class BirmmSetRequest extends BirmmBaseReply { + + public BirmmSetRequest() { + operationType = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_SET_REQUEST.getDescription(); + } + + @Override + public void replyBizTag() { + super.replyBizTag(); + + // SetRequest的时候要带上其他的配置项 + // 有其他的配置项 + if (ObjectUtil.isNotEmpty(getConfigItemList())) { + for (Map configItem : getConfigItemList()) { + for (Object configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + // 根据bean的名字 新建一个对象 + BirmmBaseTag tag = SpringContextUtil.getBean(StrUtil.toString(configItemName)); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + getTagList().put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } + } + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java new file mode 100644 index 0000000..634ad8c --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponse.java @@ -0,0 +1,57 @@ +package com.casic.missiles.frame.base; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Component("SetResponse") +@Scope("prototype") +@Data +public class BirmmSetResponse 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/base/BirmmSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java deleted file mode 100644 index f00f93b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmSetResponseFrame.java +++ /dev/null @@ -1,54 +0,0 @@ -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/base/BirmmStartupRequest.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java new file mode 100644 index 0000000..f48d903 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequest.java @@ -0,0 +1,32 @@ +package com.casic.missiles.frame.base; + +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; + +@Component("StartupRequest") +@Scope("prototype") +public class BirmmStartupRequest extends BirmmBaseFrame { + + @Override + public JSONObject toJSON() { + JSONObject json = super.toJSON(); + + JSONObject body = new JSONObject(); + json.put("mType", operationTypeName); + json.put("devType", deviceTypeName); + body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { + SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); + body.put("imei", tag.getImei()); + body.put("iccid", tag.getIccid()); + } + body.put("bType", deviceTypeName + operationTypeName); + json.put("mBody", body); + + return json; + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java deleted file mode 100644 index 5e7a7a2..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupRequestFrame.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.missiles.frame.base; - -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; - -@Component("StartupRequest") -@Scope("prototype") -public class BirmmStartupRequestFrame extends BirmmBaseFrame { - - public final String MESSAGE_TYPE = "Startup"; - - @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"))); - if (getTagList().containsKey(SensorStartupTag.class.getSimpleName())) { - SensorStartupTag tag = (SensorStartupTag) getTagList().get(SensorStartupTag.class.getSimpleName()).get(0); - body.put("imei", tag.getImei()); - body.put("iccid", tag.getIccid()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java new file mode 100644 index 0000000..762512b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("StartupResponse") +@Scope("prototype") +public class BirmmStartupResponse extends BirmmBaseReply { + public BirmmStartupResponse() { + operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java deleted file mode 100644 index c485b36..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.casic.missiles.frame.base; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("StartupResponse") -@Scope("prototype") -public class BirmmStartupResponseReply extends BirmmBaseFrame { - - public BirmmStartupResponseReply() { - this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java new file mode 100644 index 0000000..8bd35fe --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmTrapResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.frame.base; + +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("TrapResponse") +@Scope("prototype") +public class BirmmTrapResponse extends BirmmBaseReply { + public BirmmTrapResponse() { + operationType = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue(); + operationTypeName = BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getDescription(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java deleted file mode 100644 index ebea11b..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.methane; - -public interface MethaneBaseFrame { - - String DEV_TYPE = "Methane"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java deleted file mode 100644 index 74fe507..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneFrameBuilderFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class MethaneFrameBuilderFactory { - - public static BirmmBaseFrame createMethaneFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GetRequest 设备请求 远程升级的数据包 - return SpringContextUtil.getBean(MethaneGetRequestFrame.class); - - case UP_TRAP_REQUEST: - // TrapRequest 设备上报数据 - return SpringContextUtil.getBean(MethaneTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - // OnlineRequest 设备检查是否需要远程升级 - return SpringContextUtil.getBean(MethaneOnlineRequestFrame.class); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(MethaneStartupRequestFrame.class); - - case UP_SET_RESPONSE: - // SetResponse 设备回复配置 - return SpringContextUtil.getBean(MethaneSetResponseFrame.class); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createMethaneReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - BirmmBaseFrame reply = null; - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - reply = SpringContextUtil.getBean(MethaneGetResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); - break; - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE 回复数据上报 - reply = SpringContextUtil.getBean(MethaneTrapResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_TRAP_RESPONSE.getValue()); - break; - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE 回复是否远程升级 - reply = SpringContextUtil.getBean(MethaneOnlineResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); - break; - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } - - return reply; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java deleted file mode 100644 index 4f9bd02..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetRequestFrame.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import com.casic.missiles.frame.tag.ota.RequestSizeTag; -import com.casic.missiles.frame.tag.signal.PCITag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "GetRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(RequestSizeTag.class.getSimpleName())) { - RequestSizeTag tag = (RequestSizeTag) getTagList().get(RequestSizeTag.class.getSimpleName()).get(0); - body.put("reqSize", tag.getRequestSize()); - } - if (getTagList().containsKey(PCITag.class.getSimpleName())) { - RequestOffsetTag tag = (RequestOffsetTag) getTagList().get(RequestOffsetTag.class.getSimpleName()).get(0); - body.put("reqOffset", tag.getRequestOffset()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java deleted file mode 100644 index 605d7d8..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneGetResponseReply.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.PackageDataTag; -import com.casic.missiles.frame.tag.ota.RequestOffsetTag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneGetResponse") -public class MethaneGetResponseReply extends BirmmBaseFrame { - - @Override - public void replyBizTag() { - // 回复升级包 RequestOffsetTag + PackageDataTag(需要请求的RequestOffsetTag + RequestSizeTag) - // TODO-LIST - - Map> tagList = new HashMap<>(); - - RequestOffsetTag offsetTag = new RequestOffsetTag(); - offsetTag.setRequestOffset(0); - List offsetTags = new ArrayList<>(); - offsetTags.add(offsetTag); - tagList.put(RequestOffsetTag.class.getSimpleName(), offsetTags); - - PackageDataTag dataTag = new PackageDataTag(); - dataTag.setData(new byte[] {0}); - List dataTags = new ArrayList<>(); - dataTags.add(dataTag); - tagList.put(PackageDataTag.class.getSimpleName(), dataTags); - - super.setTagList(tagList); - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java deleted file mode 100644 index bb05b4d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineRequestFrame.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; -import org.springframework.stereotype.Component; - -import java.time.format.DateTimeFormatter; - -@Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java deleted file mode 100644 index c9fda4e..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneOnlineResponseReply.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("MethaneOnlineResponse") -public class MethaneOnlineResponseReply extends BirmmBaseFrame { - - @Override - public String getDeviceTypeName() { - return "Methane"; - } - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - super.replyBizTag(); - - Map> tagList = getTagList(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index 730f7db..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -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 BirmmSetResponseFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java deleted file mode 100644 index dfef57f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupRequest") -@Scope("prototype") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - 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 fb363ae..a139db6 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 @@ -15,6 +15,7 @@ import com.casic.missiles.model.DeviceBizData; import com.casic.missiles.util.BytesUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -23,22 +24,18 @@ import java.util.List; @Component("MethaneTrapRequest") +@Scope("prototype") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -175,12 +172,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java deleted file mode 100644 index a066c7f..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("MethaneTrapResponse") -@Scope("prototype") -public class MethaneTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java deleted file mode 100644 index 2bd88df..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -public interface SentinelBaseFrame { - - String DEV_TYPE = "Tube"; -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java deleted file mode 100644 index f9265d9..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelFrameBuilderFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmStartupResponseReply; -//import com.casic.missiles.frame.sentinel.SentinelGetRequestFrame; -//import com.casic.missiles.frame.sentinel.SentinelGetResponseReply; -import com.casic.missiles.util.SpringContextUtil; - -public class SentinelFrameBuilderFactory { - - public static BirmmBaseFrame createSentinelFrameByOperation(String operaType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(operaType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: -// return new MethaneGetRequestFrame(); - - case UP_TRAP_REQUEST: - return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); - - case UP_ONLINE_REQUEST: - return new SentinelOnlineRequestFrame(); - - case UP_STARTUP_REQUEST: - // StartupRequest 设备开机上报三码 - return SpringContextUtil.getBean(SentinelStartupRequestFrame.class); - - case UP_SET_RESPONSE: - return new SentinelSetResponseFrame(); - - default: - return null; - } - } else { - return null; - } - } - - public static BirmmBaseFrame createSentinelReplyFrameByOperation(String uploadOperationType) { - BirmmOperationTypeEnums operation = BirmmOperationTypeEnums.toType(uploadOperationType); - if (operation != null) { - switch (operation) { - case UP_GET_REQUEST: - // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 -// return new MethaneGetResponseReply(); - - case UP_TRAP_REQUEST: - // TRAP_REQUEST消息回复TRAP_RESPONSE - return SpringContextUtil.getBean(SentinelTrapResponseReply.class); - - case UP_ONLINE_REQUEST: - // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseReply(); - - case UP_STARTUP_REQUEST: - // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(BirmmStartupResponseReply.class); - - default: - return null; - } - } else { - return null; - } - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java deleted file mode 100644 index 240c332..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineRequestFrame.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.tag.ota.SoftwareVersionTag; - -import java.time.format.DateTimeFormatter; - -public class SentinelOnlineRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { - private final String MESSAGE_TYPE = "OnlineRequest"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - json.put("mType", MESSAGE_TYPE); - - JSONObject body = new JSONObject(); - body.put("bType", BIZ_TYPE); - body.put("logtime", getLogTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - if (getTagList().containsKey(SoftwareVersionTag.class.getSimpleName())) { - SoftwareVersionTag tag = (SoftwareVersionTag) getTagList().get(SoftwareVersionTag.class.getSimpleName()).get(0); - body.put("softwareVersion", tag.getVersion()); - } - - json.put("mBody", body); - - return json; - } -} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java deleted file mode 100644 index 873cd37..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.base.BirmmBaseTag; -import com.casic.missiles.frame.tag.ota.NeedOTATag; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SentinelOnlineResponseReply extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()) * 256 + 128 + Integer.parseInt(getDeviceType(), 16); - pduType = new StringBuilder(Integer.toHexString(pduValue)); - while (pduType.length() != 4) { - pduType.insert(0, "0"); - } - - this.setPduType(pduType.toString().toUpperCase()); - } - - @Override - public void replyBizTag() { - // 无需升级 回复NeedOTATag - // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag - // TODO-LIST - // 暂时回复不用升级 - Map> tagList = new HashMap<>(); - NeedOTATag needTag = new NeedOTATag(); - needTag.setNeed(false); - List needTags = new ArrayList<>(); - needTags.add(needTag); - tagList.put(NeedOTATag.class.getSimpleName(), needTags); - super.setTagList(tagList); - } -} 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 deleted file mode 100644 index d33805d..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ /dev/null @@ -1,34 +0,0 @@ -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 BirmmSetResponseFrame implements SentinelBaseFrame { - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } - - @Override - public JSONObject toJSON() { - JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + "ConfigSuccess"); - - 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 deleted file mode 100644 index c645062..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.frame.base.BirmmStartupRequestFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("SentinelStartupRequest") -@Scope("prototype") -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); - - JSONObject body = json.getJSONObject("mBody"); - body.put("bType", DEV_TYPE + MESSAGE_TYPE); - - return json; - } -} 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 1fa6a64..a251c26 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 @@ -23,23 +23,18 @@ import java.util.List; @Slf4j -@Component("SentinelTrapRequestFrame") +@Component("SentinelTrapRequest") @Scope("prototype") -public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { +public class SentinelTrapRequestFrame extends BirmmBaseFrame { private List bizDataList; private final String MESSAGE_TYPE = "Data"; - private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; - - @Override - public String getDeviceTypeName() { - return DEV_TYPE; - } + private final String BIZ_TYPE = getDeviceTypeName() + MESSAGE_TYPE; @Override public JSONObject toJSON() { JSONObject json = super.toJSON(); - json.put("devType", DEV_TYPE); + json.put("devType", getDeviceTypeName()); json.put("mType", MESSAGE_TYPE); JSONObject body = new JSONObject(); @@ -188,12 +183,12 @@ SensorStateTag sensorStateTag = (SensorStateTag) tag; if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 - log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 - log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); + log.debug("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } // TODO-LIST diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java deleted file mode 100644 index 02e5678..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Component("SentinelTrapResponseFrame") -@Scope("prototype") -public class SentinelTrapResponseReply extends BirmmBaseFrame { - -} diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java index 4c75cda..1282614 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmDeviceTypeEnums.java @@ -10,9 +10,9 @@ @Getter public enum BirmmDeviceTypeEnums { METHANE("4", "Methane", "31"), // 燃气智能监测终端 - WELL("6", "BIRMM-WELL100N", "41"), // 井盖 + WELL("6", "Well", "41"), // 井盖 LIQUID_GAS("25", "", "32"), // 燃液一体化设备 - SENTINEL("28", "", "34"), // 管盯 + SENTINEL("28", "Sentinel", "34"), // 管盯 METHANE_BIZ("32", "", "33"), // 商用燃气 DEFAULT("", "", "");