diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: return null; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 BirmmStartupResponseReply extends BirmmBaseFrame { + + public BirmmStartupResponseReply() { + this.operationType = BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue(); + } +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +package com.casic.missiles.frame.methane; + +public interface MethaneBaseFrame { + + String DEV_TYPE = "Methane"; +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +package com.casic.missiles.frame.sentinel; + +public interface SentinelBaseFrame { + + String DEV_TYPE = "Tube"; +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index a0bbe7d..5acbd78 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,12 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("upperLimit") +@Scope("prototype") public class UpperLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000901"; @@ -24,4 +29,10 @@ super.setValueStr(valueStr); upperLimit = Float.intBitsToFloat(Integer.parseInt(BytesUtil.reverseHexString(valueStr), 16)); } + + @Override + public void setValueDecStr(String valueDecStr) { + + upperLimit = NumberUtil.parseNumber(valueDecStr).intValue(); + } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index a0bbe7d..5acbd78 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,12 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("upperLimit") +@Scope("prototype") public class UpperLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000901"; @@ -24,4 +29,10 @@ super.setValueStr(valueStr); upperLimit = Float.intBitsToFloat(Integer.parseInt(BytesUtil.reverseHexString(valueStr), 16)); } + + @Override + public void setValueDecStr(String valueDecStr) { + + upperLimit = NumberUtil.parseNumber(valueDecStr).intValue(); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java index 9daab43..2d256ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index a0bbe7d..5acbd78 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,12 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("upperLimit") +@Scope("prototype") public class UpperLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000901"; @@ -24,4 +29,10 @@ super.setValueStr(valueStr); upperLimit = Float.intBitsToFloat(Integer.parseInt(BytesUtil.reverseHexString(valueStr), 16)); } + + @Override + public void setValueDecStr(String valueDecStr) { + + upperLimit = NumberUtil.parseNumber(valueDecStr).intValue(); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java index 9daab43..2d256ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java index 0056fb8..da2c510 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index a0bbe7d..5acbd78 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,12 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("upperLimit") +@Scope("prototype") public class UpperLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000901"; @@ -24,4 +29,10 @@ super.setValueStr(valueStr); upperLimit = Float.intBitsToFloat(Integer.parseInt(BytesUtil.reverseHexString(valueStr), 16)); } + + @Override + public void setValueDecStr(String valueDecStr) { + + upperLimit = NumberUtil.parseNumber(valueDecStr).intValue(); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java index 9daab43..2d256ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java index 0056fb8..da2c510 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java index 76566e0..facb19e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getOid(); // OID result += String.format("%04d", data.length); // 长度 result += HexUtils.toHexString(data); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index a0bbe7d..5acbd78 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,12 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("upperLimit") +@Scope("prototype") public class UpperLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000901"; @@ -24,4 +29,10 @@ super.setValueStr(valueStr); upperLimit = Float.intBitsToFloat(Integer.parseInt(BytesUtil.reverseHexString(valueStr), 16)); } + + @Override + public void setValueDecStr(String valueDecStr) { + + upperLimit = NumberUtil.parseNumber(valueDecStr).intValue(); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java index 9daab43..2d256ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java index 0056fb8..da2c510 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java index 76566e0..facb19e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getOid(); // OID result += String.format("%04d", data.length); // 长度 result += HexUtils.toHexString(data); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java index 8331ebd..4903ac9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index a0bbe7d..5acbd78 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,12 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("upperLimit") +@Scope("prototype") public class UpperLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000901"; @@ -24,4 +29,10 @@ super.setValueStr(valueStr); upperLimit = Float.intBitsToFloat(Integer.parseInt(BytesUtil.reverseHexString(valueStr), 16)); } + + @Override + public void setValueDecStr(String valueDecStr) { + + upperLimit = NumberUtil.parseNumber(valueDecStr).intValue(); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java index 9daab43..2d256ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java index 0056fb8..da2c510 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java index 76566e0..facb19e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getOid(); // OID result += String.format("%04d", data.length); // 长度 result += HexUtils.toHexString(data); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java index 8331ebd..4903ac9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java index 35cf112..bc6c09c 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index a0bbe7d..5acbd78 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,12 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("upperLimit") +@Scope("prototype") public class UpperLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000901"; @@ -24,4 +29,10 @@ super.setValueStr(valueStr); upperLimit = Float.intBitsToFloat(Integer.parseInt(BytesUtil.reverseHexString(valueStr), 16)); } + + @Override + public void setValueDecStr(String valueDecStr) { + + upperLimit = NumberUtil.parseNumber(valueDecStr).intValue(); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java index 9daab43..2d256ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java index 0056fb8..da2c510 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java index 76566e0..facb19e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getOid(); // OID result += String.format("%04d", data.length); // 长度 result += HexUtils.toHexString(data); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java index 8331ebd..4903ac9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java index 35cf112..bc6c09c 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); 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 92336b6..4c75cda 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 @@ -9,7 +9,7 @@ */ @Getter public enum BirmmDeviceTypeEnums { - METHANE("4", "BIRMM-RTU100N", "31"), // 燃气智能监测终端 + METHANE("4", "Methane", "31"), // 燃气智能监测终端 WELL("6", "BIRMM-WELL100N", "41"), // 井盖 LIQUID_GAS("25", "", "32"), // 燃液一体化设备 SENTINEL("28", "", "34"), // 管盯 diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index a0bbe7d..5acbd78 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,12 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("upperLimit") +@Scope("prototype") public class UpperLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000901"; @@ -24,4 +29,10 @@ super.setValueStr(valueStr); upperLimit = Float.intBitsToFloat(Integer.parseInt(BytesUtil.reverseHexString(valueStr), 16)); } + + @Override + public void setValueDecStr(String valueDecStr) { + + upperLimit = NumberUtil.parseNumber(valueDecStr).intValue(); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java index 9daab43..2d256ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java index 0056fb8..da2c510 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java index 76566e0..facb19e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getOid(); // OID result += String.format("%04d", data.length); // 长度 result += HexUtils.toHexString(data); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java index 8331ebd..4903ac9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java index 35cf112..bc6c09c 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); 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 92336b6..4c75cda 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 @@ -9,7 +9,7 @@ */ @Getter public enum BirmmDeviceTypeEnums { - METHANE("4", "BIRMM-RTU100N", "31"), // 燃气智能监测终端 + METHANE("4", "Methane", "31"), // 燃气智能监测终端 WELL("6", "BIRMM-WELL100N", "41"), // 井盖 LIQUID_GAS("25", "", "32"), // 燃液一体化设备 SENTINEL("28", "", "34"), // 管盯 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java index 5e9956d..2cfb88b 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java @@ -9,57 +9,64 @@ */ @Getter public enum BirmmTagTypeEnums { - RETRY_TIMES_TAG("1000000A", 1), - DESTINATION_IP_TAG("10000022", -1), - DESTINATION_PORT_TAG("10000023", -1), - DATE_TAG("10000050", 3), - DATETIME_TAG("10000051", 6), - UPLOAD_INTERVAL_TAG("10000062", 2), - SENSOR_STARTUP_TAG("10000063", 35), - START_TIME_TAG("10000104", 2), - COLLECT_INTERVAL_TAG("10000105", 2), - COLLECT_COUNT_TAG("10000106", 2), - LOWER_LIMIT_TAG("10000900", 4), - UPPER_LIMIT_TAG("10000901", 4), + RETRY_TIMES_TAG("1000000A", 1, "repeat"), + DESTINATION_IP_TAG("10000022", -1, "ip"), + DESTINATION_PORT_TAG("10000023", -1, "port"), + DATE_TAG("10000050", 3, "date"), + DATETIME_TAG("10000051", 6, "dateTime"), + UPLOAD_INTERVAL_TAG("10000062", 2, "period"), + SENSOR_STARTUP_TAG("10000063", 35, "startup"), + START_TIME_TAG("10000104", 2, "startTime"), + COLLECT_INTERVAL_TAG("10000105", 2, "interval"), + COLLECT_COUNT_TAG("10000106", 2, "times"), + LOWER_LIMIT_TAG("10000900", 4, "lower"), + UPPER_LIMIT_TAG("10000901", 4, "upper"), - OTA_REQUEST_SIZE_TAG("20000100", 4), - OTA_REQUEST_OFFSET_TAG("20000102", 4), + OTA_REQUEST_SIZE_TAG("20000100", 4, "reqSize"), + OTA_REQUEST_OFFSET_TAG("20000102", 4, "reqOffset"), - SENSOR_STATE_1_TAG("60000009", 1), - SENSOR_STATE_2_TAG("6000000A", 1), - SENSOR_STATE_3_TAG("6000000B", 1), - SENSOR_STATE_4_TAG("6000000C", 1), - SENSOR_STATE_5_TAG("6000000D", 1), - CELL_TAG("60000020", 1), - VOLTAGE_TAG("60000030", 1), - SOFTWARE_VERSION_TAG("60000500", -1), - PCI_TAG("60000511", 2), - RSRP_TAG("60000513", 2), - SNR_TAG("60000516", 2), + SENSOR_STATE_1_TAG("60000009", 1, "state1"), + SENSOR_STATE_2_TAG("6000000A", 1, "state2"), + SENSOR_STATE_3_TAG("6000000B", 1, "state3"), + SENSOR_STATE_4_TAG("6000000C", 1, "state4"), + SENSOR_STATE_5_TAG("6000000D", 1, "state5"), + CELL_TAG("60000020", 1, "cell"), + VOLTAGE_TAG("60000030", 1, "voltage"), + SOFTWARE_VERSION_TAG("60000500", -1, "software"), + PCI_TAG("60000511", 2, "pci"), + RSRP_TAG("60000513", 2, "rsrp"), + SNR_TAG("60000516", 2, "snr"), - OTA_NEED_OTA_TAG("60000600", 1), - OTA_PACKAGE_DATA_TAG("60000601", -1), - OTA_PACKAGE_SIZE_TAG("60000602", 4), - OTA_PACKAGE_CRC_TAG("60000603", 2) + OTA_NEED_OTA_TAG("60000600", 1, "needOta"), + OTA_PACKAGE_DATA_TAG("60000601", -1, "packageData"), + OTA_PACKAGE_SIZE_TAG("60000602", 4, "packageSize"), + OTA_PACKAGE_CRC_TAG("60000603", 2, "packageCrc") ; /** * 名称 */ - private final String name; + private final String oid; /** * 属性字节长度 */ private final int length; - BirmmTagTypeEnums(String name, int length) { - this.name = name; + private final String alias; + + BirmmTagTypeEnums(String oid, int length, String alias) { + this.oid = oid; this.length = length; + this.alias = alias; } - public static BirmmTagTypeEnums toType(String oid) { - return Stream.of(BirmmTagTypeEnums.values()).filter(p -> p.name.equalsIgnoreCase(oid)).findAny().orElse(null); + public static BirmmTagTypeEnums toType(String tagOid) { + return Stream.of(BirmmTagTypeEnums.values()).filter(p -> p.oid.equalsIgnoreCase(tagOid)).findAny().orElse(null); + } + + public static BirmmTagTypeEnums toAlias(String sName) { + return Stream.of(BirmmTagTypeEnums.values()).filter(p -> p.alias.equalsIgnoreCase(sName)).findAny().orElse(null); } } diff --git a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java index b27acd6..1c0ce60 100644 --- a/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java +++ b/casic-iot-common/src/main/java/com/casic/missiles/util/DictCodeUtils.java @@ -32,6 +32,7 @@ } String name = dictService.getDictNameByCode(dictCodeField.cacheName(), field.get(object).toString()); if (StringUtils.isEmpty(name)) { + System.out.println(dictCodeField.cacheName() + "===" + field.get(object).toString()); throw new BusinessException(500, dictCodeField.message()); } String destFieldName = field.getName() + "Name"; diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java index f98caa1..8810f65 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/BusConfigMapper.java @@ -23,6 +23,7 @@ @Param("request") BusConfigDTO request, @Param("dataScope") DataScope dataScope); - + List findConfigListToBeSend(@Param("deviceId") Long deviceId); + List findConfigListSendToDevice(@Param("deviceId") Long deviceId); } diff --git a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java index 1eabaf7..134e4d8 100644 --- a/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java +++ b/casic-iot-dao/src/main/java/com/casic/missiles/mapper/DeviceDataMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; import com.casic.missiles.model.DeviceData; @@ -24,4 +26,9 @@ @Param("request")DeviceDataListRequest request, @Param("dataScope") DataScope dataScope); + List listPageBizData(@Param("page") Page page, + @Param("request") DeviceBizDataRequest request, + @Param("dataScope") DataScope dataScope); + DeviceBizDataDTO latestBizData(@Param("devCode") String devCode); + } diff --git a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml index b4965d6..deb5d9e 100644 --- a/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/BusConfigMapper.xml @@ -5,12 +5,16 @@ + + + + @@ -28,7 +32,7 @@ - id, Pid, devcode, config_json, status, update_time, create_time, create_user_id + id, devcode, config_json, status, send_time, create_time, create_user_id, ttl, response_time, device_id + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml index 5a0053d..07096d0 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceDataMapper.xml @@ -27,11 +27,19 @@ TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + DATA_FORMAT(#{column}, '%Y-m%-d% H%:i%:s%') + + id, devcode, device_type, cell, data_json, decrypt_before_data, decrypt_after_data, uptime, logtime + + id, frame_log_id, devcode, device_type, cell, pci, rsrp, snr, biz_type, value, uptime, logtime + + + + + + diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml index 918be8d..1677d37 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceImeiIccidMapper.xml @@ -9,11 +9,12 @@ + - ID, DEVCODE, IMEI, ICCID, logtime + ID, DEVCODE, IMEI, ICCID, LOGTIME, FRAME_LOG_ID diff --git a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml index 028dd64..962b944 100644 --- a/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml +++ b/casic-iot-dao/src/main/resources/mapper/DeviceMapper.xml @@ -25,8 +25,8 @@ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java new file mode 100644 index 0000000..d483716 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataDTO.java @@ -0,0 +1,115 @@ +package com.casic.missiles.dto.data; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.casic.missiles.annotation.DictCodeField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +import static com.casic.missiles.enums.DictCodeEnum.BIZ_TYPE; +import static com.casic.missiles.enums.DictCodeEnum.DEVICE_TYPE; + +/** + * @author cz + * @date 2023-11-23 + */ +@Data +@ApiModel +public class DeviceBizDataDTO { + + private Long id; + + @TableField("frame_log_id") + @ApiModelProperty(value = "日志记录ID", dataType = "Long") + private Long frameLogId; + + /** + * 设备编号 + */ + @TableField("devcode") + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devcode; + + /** + * 设备类型 + */ + @TableField("device_type") + @ApiModelProperty(value = "设备类型", dataType = "String") + @DictCodeField(message = "设备类型不合法", cacheName = DEVICE_TYPE) + private Integer deviceType; + + /** + * 设备类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设备类型", dataType = "String") + private String deviceTypeName; + + /** + * 电量 + */ + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("cell") + private String cell; + + /** + * 数值 + */ + @ApiModelProperty(value = "数值", dataType = "String") + @TableField("value") + private String value; + + /** + * 业务类型 + */ + @TableField("biz_type") + @ApiModelProperty(value = "业务类型", dataType = "String") + @DictCodeField(message = "业务类型不合法", cacheName = BIZ_TYPE) + private Integer bizType; + + /** + * 业务类型 + */ + @TableField(exist = false) + @ApiModelProperty(value = "业务类型", dataType = "String") + private String bizTypeName; + + /** + * 小区编号PCI + */ + @TableField("pci") + @ApiModelProperty(value = "小区编号PCI", dataType = "Integer") + private Integer pci; + + /** + * 信号强度RSRP + */ + @TableField("rsrp") + @ApiModelProperty(value = "信号强度RSRP", dataType = "Integer") + private Integer rsrp; + + /** + * 信号强度SNR + */ + @TableField("snr") + @ApiModelProperty(value = "信号强度SNR", dataType = "Integer") + private Integer snr; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间", dataType = "String") + @TableField("uptime") + private String uptime; + + /** + * 记录日期 默认为当前时间 + */ + @ApiModelProperty(value = "记录日期", dataType = "String") + @TableField("logtime") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date logtime; +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java new file mode 100644 index 0000000..d670e03 --- /dev/null +++ b/casic-iot-model/src/main/java/com/casic/missiles/dto/data/DeviceBizDataRequest.java @@ -0,0 +1,34 @@ +package com.casic.missiles.dto.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class DeviceBizDataRequest { + + @ApiModelProperty(value = "设备编号", dataType = "String") + private String devCode; + + @ApiModelProperty(value = "设备Id", dataType = "Long") + private Long deviceId; + + @ApiModelProperty(value = "分组编号", dataType = "Long") + private Long groupId; + + @ApiModelProperty(value = "业务类型(字典值)", dataType = "Integer") + private Integer bizType; + + @ApiModelProperty(value = "开始时间", dataType = "String") + private String beginTime; + + @ApiModelProperty(value = "结束时间", dataType = "String") + private String endTime; + + @ApiModelProperty(value = "ids列表(导出用)", dataType = "String") + private List ids; + +} diff --git a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java index 7647466..0757408 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/enums/DictCodeEnum.java @@ -14,6 +14,8 @@ */ String MODEL = "modelType"; + String BIZ_TYPE = "bizType"; + /** * 加密类型 */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java index 4d02b37..7592a11 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/BusConfig.java @@ -41,6 +41,14 @@ /** * 设备编号 */ + @TableField("device_id") + @NotNull + @ApiModelProperty(value = "设备id", dataType = "Long") + private Long deviceId; + + /** + * 设备编号 + */ @TableField("devcode") @NotNull @ApiModelProperty(value = "设备编号(新增请填写下发配置列表)", dataType = "String") @@ -87,16 +95,24 @@ * 更新时间 */ @TableField("send_time") - @ApiModelProperty(value = "下发时间", dataType = "String") + @ApiModelProperty(value = "下发时间", dataType = "LocalDateTime") private LocalDateTime sendTime; /** * 创建日期 默认为当前时间 */ @TableField("create_time") - @ApiModelProperty(value = "创建时间", dataType = "String") + @ApiModelProperty(value = "创建时间", dataType = "LocalDateTime") private LocalDateTime createTime; + @TableField("response_time") + @ApiModelProperty(value = "响应时间", dataType = "LocalDateTime") + private LocalDateTime responseTime; + + @TableField("ttl") + @ApiModelProperty(value = "超时时间,单位:分钟", dataType = "Integer") + private Integer ttl; + /** * 创建用户id */ diff --git a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java index 5703f6c..04a00f6 100644 --- a/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java +++ b/casic-iot-model/src/main/java/com/casic/missiles/model/DeviceImeiIccid.java @@ -30,6 +30,12 @@ private Long id; /** + * 编号 + */ + @TableField("FRAME_LOG_ID") + private Long frameLogId; + + /** * 设备编号 */ @TableField("DEVCODE") diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java index a5ebd35..06d131c 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IBusConfigService.java @@ -27,4 +27,7 @@ ReturnDTO deleteBusConfig(List ids); + BusConfig findLatestConfigToBeSend(Long deviceId); + BusConfig findLatestConfigSendToDevice(Long deviceId); + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java index 6a939cf..4f86d5b 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/IDeviceDataService.java @@ -3,8 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.model.DeviceData; /** @@ -19,4 +21,7 @@ Page listPage(Page page, DeviceDataListRequest request, DataScope dataScope) throws Exception; + Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception; + DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception; + } diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java index d194fc3..c86f230 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/BusConfigServiceImpl.java @@ -1,11 +1,9 @@ package com.casic.missiles.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.alibaba.excel.exception.ExcelCommonException; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; @@ -14,24 +12,18 @@ import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.config.BusConfigDTO; -import com.casic.missiles.dto.device.DeviceListVO; -import com.casic.missiles.dto.subscribe.SubscribeListVO; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.BusConfigMapper; import com.casic.missiles.model.BusConfig; import com.casic.missiles.model.ProductConfigItem; -import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IBusConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.util.DictCodeUtils; import com.casic.missiles.util.RedisCommon; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCommand; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -90,6 +82,26 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public BusConfig findLatestConfigToBeSend(Long deviceId) { + List configList = baseMapper.findConfigListToBeSend(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + + @Override + public BusConfig findLatestConfigSendToDevice(Long deviceId) { + List configList = baseMapper.findConfigListSendToDevice(deviceId); + if (ObjectUtil.isNotNull(configList) && !configList.isEmpty()) { + return configList.get(0); + } + + return null; + } + /** * 将参数配置项内容转换为配置项内容 * diff --git a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java index 5a442cc..2c71f49 100644 --- a/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java +++ b/casic-iot-service/src/main/java/com/casic/missiles/service/impl/DeviceDataServiceImpl.java @@ -3,9 +3,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.mapper.DeviceDataMapper; import com.casic.missiles.model.DeviceData; import com.casic.missiles.service.IDeviceDataService; @@ -40,4 +41,22 @@ return page; } + @Override + public Page listPageBizData(Page page, DeviceBizDataRequest request, DataScope dataScope) throws Exception { + if (CollectionUtils.isEmpty(request.getIds())) { + request.setIds(null); + } + List bizDataList = baseMapper.listPageBizData(page, request, dataScope); + for (DeviceBizDataDTO bizDataDTO : bizDataList) { + DictCodeUtils.convertDictCodeToName(bizDataDTO); + } + page.setRecords(bizDataList); + return page; + } + + @Override + public DeviceBizDataDTO latestBizData(DeviceBizDataRequest request) throws Exception { + return baseMapper.latestBizData(request.getDevCode()); + } + } 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 20230ca..1a5c8bf 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 @@ -29,7 +29,6 @@ import com.casic.missiles.mapper.common.SysCommonMapper; import com.casic.missiles.model.Device; import com.casic.missiles.model.DeviceGroup; -import com.casic.missiles.model.DeviceImeiIccid; import com.casic.missiles.model.ProductInfo; import com.casic.missiles.service.IDeviceService; import com.casic.missiles.util.CommonExcelListener; @@ -40,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -119,13 +117,6 @@ device.setImei(imei); device.setIccid(iccid); baseMapper.updateById(device); - - DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); - imeiIccid.setDevcode(deviceCode); - imeiIccid.setImei(imei); - imeiIccid.setIccid(iccid); - imeiIccid.setLogtime(LocalDateTime.now()); - imeiIccidMapper.insert(imeiIccid); } } diff --git a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java index 8b8179b..a4e7206 100644 --- a/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java +++ b/casic-iot-web/src/main/java/com/casic/missiles/controller/DeviceDataController.java @@ -8,13 +8,12 @@ import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.data.DeviceBizDataDTO; import com.casic.missiles.dto.data.DeviceDataListRequest; import com.casic.missiles.dto.data.DeviceDataListVO; -import com.casic.missiles.dto.device.DeviceListRequest; -import com.casic.missiles.dto.device.DeviceListVO; +import com.casic.missiles.dto.data.DeviceBizDataRequest; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.model.DeviceData; import com.casic.missiles.model.exception.enums.CoreExceptionEnum; import com.casic.missiles.service.IDeviceDataService; import io.swagger.annotations.Api; @@ -57,6 +56,20 @@ return ReturnUtil.success(super.packForBT(deviceDataService.listPage(page, request, dataScope))); } + @ApiOperation("分页列表") + @PostMapping("/bizList-page") + public ReturnDTO> bizListPage(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + DataScope dataScope = iCommonPermissionService.getAuthService().getLoginUserDataScope(); + Page page = PageFactory.defaultPage(); + return ReturnUtil.success(super.packForBT(deviceDataService.listPageBizData(page, request, dataScope))); + } + + @ApiOperation("查询最新数据") + @PostMapping("/latestBizData") + public ReturnDTO latestBizData(@RequestBody @Validated DeviceBizDataRequest request) throws Exception { + return ReturnUtil.success(deviceDataService.latestBizData(request)); + } + @ApiOperation("导出") @PostMapping("/list-export") public void export(@RequestBody @Validated DeviceDataListRequest request) throws Exception { 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 8520159..713e926 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 @@ -53,24 +53,14 @@ // 处理业务数据 defaultService.doParseBizTag(birmmFrame); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推送 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); 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 d2921af..c313a70 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,15 +1,8 @@ package com.casic.missiles.parser; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.model.DeviceBizData; -import com.casic.missiles.model.DeviceFrameLog; -import com.casic.missiles.service.IDeviceBizDataService; -import com.casic.missiles.service.IDeviceFrameLogService; import com.casic.missiles.service.IGeneralService; -import com.casic.missiles.service.impl.DeviceBizDataServiceImpl; -import com.casic.missiles.service.impl.DeviceFrameLogServiceImpl; import com.casic.missiles.service.impl.GeneralServiceImpl; -import com.casic.missiles.util.SnowflakeUtil; import com.casic.missiles.util.SpringContextUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -31,10 +24,6 @@ IGeneralService defaultService = SpringContextUtil.getBean(GeneralServiceImpl.class); - IDeviceFrameLogService frameLogService = SpringContextUtil.getBean(DeviceFrameLogServiceImpl.class); - - IDeviceBizDataService bizDataService = SpringContextUtil.getBean(DeviceBizDataServiceImpl.class); - @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info("建立连接:{}", ctx.channel().id()); @@ -49,7 +38,7 @@ public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List list) { byte[] frameBytes = new byte[buffer.readableBytes()]; buffer.readBytes(frameBytes); - log.info("设备直连上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); + log.info("直连设备上行HEX字节消息帧:{}", HexUtils.toHexString(frameBytes).toUpperCase()); // 工厂类创建frame对象 BirmmBaseFrame birmmFrame = defaultService.doFrameParse(frameBytes); @@ -57,34 +46,27 @@ // 处理业务数据 birmmFrame.doParseBizTag(); - log.info("上行HEX字节消息解析成功:{}", birmmFrame.toJSON().toJSONString()); - // 保存日志 Long logId = defaultService.saveFrameLog(birmmFrame, frameBytes); - // 推送 - // 需要异步推 + // 异步推送 defaultService.pushMessage(birmmFrame); - // 保存业务数据 - if (birmmFrame.isBizDataFrame()) { - defaultService.saveBizData(birmmFrame, logId); - } - - // 保存三码 - if (birmmFrame.hasSensorStartupTag()) { - defaultService.saveSensorDevCodeAndImei(birmmFrame); - } + // 业务上报数据/三码/远程升级/设置响应消息的后处理 + defaultService.bizDataAfterAction(birmmFrame, logId); // 创建回复消息 BirmmBaseFrame configFrame = defaultService.buildReplyFrame(birmmFrame); if (configFrame != null) { // 根据协议进行封装 String replyMessage = defaultService.replyMessage(configFrame); - log.info("下行HEX字节消息帧:{}", replyMessage); + log.info("直连设备下行HEX字节消息帧:{}", replyMessage); list.add(replyMessage); } + + // 查询是否需要远程升级 + } } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java index eef7b55..318beba 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/replier/CommonHexReplier.java @@ -10,6 +10,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.buf.HexUtils; import java.nio.charset.Charset; @@ -30,7 +31,6 @@ */ @Override public void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception { -// System.out.println("Client->Server:" + obj); byte[] replyBytes = BytesUtil.hexStringToBytes(obj.toString()); ByteBuf replyByteBuf = Unpooled.copiedBuffer(replyBytes); //进行回复 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 bd1b402..a0634ad 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 @@ -14,9 +14,8 @@ void doParseBizTag(BirmmBaseFrame baseFrame); Long saveFrameLog(BirmmBaseFrame baseFrame, byte[] frameBytes); - void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId); - void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame); + void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId); void pushMessage(BirmmBaseFrame birmmFrame); 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 704c540..29a6594 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 @@ -1,8 +1,11 @@ package com.casic.missiles.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.enums.BirmmDeviceTypeEnums; import com.casic.missiles.enums.BirmmFrameAttributeEnums; +import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; import com.casic.missiles.frame.BirmmFrameBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; @@ -41,6 +44,12 @@ IDeviceService deviceService; @Resource + IBusConfigService configService; + + @Resource + IDeviceImeiIccidService imeiService; + + @Resource ISubscribeStoreService subscribeService; byte[] keyByte = { @@ -132,11 +141,44 @@ frameLog.setLogtime(baseFrame.getLogTime()); frameLogService.save(frameLog); + log.info("上行HEX字节消息解析成功:{}", baseFrame.toJSON().toJSONString()); + return frameLog.getId(); } @Override - public void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { + public void bizDataAfterAction(BirmmBaseFrame baseFrame, Long frameLogId) { + BirmmOperationTypeEnums operationType = BirmmOperationTypeEnums.toType(baseFrame.getOperationType()); + switch (operationType) { + case UP_TRAP_REQUEST: + // 上报业务数据后处理 保存业务数据 + saveBizData(baseFrame, frameLogId); + break; + + case UP_STARTUP_REQUEST: + // 上报三码数据后处理 保存三码记录 更新device表的对应字段 + saveSensorDevCodeAndImei(baseFrame, frameLogId); + break; + + case UP_ONLINE_REQUEST: + // 查询是否需要升级固件程序 + break; + + case UP_GET_REQUEST: + // 请求远程升级固件程序的数据 + break; + + case UP_SET_RESPONSE: + // 设置响应消息后处理 更新config表对应状态 + updateConfigStatus(baseFrame); + break; + + default: + break; + } + } + + private void saveBizData(BirmmBaseFrame baseFrame, Long frameLogId) { List bizDataList = baseFrame.convertToBizDataList(); for (DeviceBizData bizData : bizDataList) { // 设置其他的属性 @@ -151,30 +193,63 @@ bizDataService.saveBatch(bizDataList); } - @Override - public void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame) { + private void saveSensorDevCodeAndImei(BirmmBaseFrame baseFrame, Long frameLogId) { List imeiTags = baseFrame.getTagList().get(SensorStartupTag.class.getSimpleName()); if (ObjectUtil.isNotNull(imeiTags) && !imeiTags.isEmpty()) { SensorStartupTag imeiTag = (SensorStartupTag) imeiTags.get(0); deviceService.updateDeviceImei(baseFrame.getDevCode(), imeiTag.getImei(), imeiTag.getIccid()); + + DeviceImeiIccid imeiIccid = new DeviceImeiIccid(); + imeiIccid.setDevcode(baseFrame.getDevCode()); + imeiIccid.setImei(imeiTag.getImei()); + imeiIccid.setIccid(imeiTag.getIccid()); + imeiIccid.setLogtime(baseFrame.getLogTime()); + imeiIccid.setFrameLogId(frameLogId); + imeiService.save(imeiIccid); + } + } + + private void updateConfigStatus(BirmmBaseFrame birmmBaseFrame) { + // 查询数据库找到待下发的内容 + Device device = deviceService.getDeviceByDeviceCode(birmmBaseFrame.getDevCode()); + if (ObjectUtil.isNotNull(device)) { + BusConfig latestConfig = configService.findLatestConfigSendToDevice(device.getId()); + if (ObjectUtil.isNotNull(latestConfig)) { + // TODO-LIST + // 需要检查返回的配置项是否与下发的值一致 + + + // 更新状态 + latestConfig.setStatus(1); // 配置成功 + latestConfig.setResponseTime(LocalDateTime.now()); + configService.updateById(latestConfig); + } } } @Override public void pushMessage(BirmmBaseFrame birmmFrame) { if (!birmmFrame.needPushToApplication()) { + log.debug("[{}][{}, {}]类消息,无需推送。", birmmFrame.getDevCode(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); return ; } Device device = deviceService.getDeviceByDeviceCode(birmmFrame.getDevCode()); if (ObjectUtil.isNotNull(device) && ObjectUtil.isNotNull(device.getGroupId())) { List ssList = subscribeService.getSubscribeListByProduct(device.getGroupId()); + + if (ssList.isEmpty()) { + log.info("[{}, groupId={}][{}, {}]类消息,没有找到推送地址配置,无需推送。", birmmFrame.getDevCode(), device.getGroupId(), birmmFrame.getDeviceTypeName(), birmmFrame.getOperationTypeName()); + } + for (SubscribeStore ss : ssList) { if (ObjectUtil.isNotNull(ss.getEnable()) && ss.getEnable() == 1) { IPushService pushService = initPushImpl(ss.getSubscribeType(), ss.getId()); // 执行推送动作 - pushService.doPush(birmmFrame); + ThreadUtil.execAsync(() -> { + pushService.doPush(birmmFrame); + }); } } } @@ -186,22 +261,75 @@ if (null != configFrame) { configFrame.setDevCode(uploadFrame.getDevCode()); + configFrame.setDeviceType(uploadFrame.getDeviceType()); configFrame.setCommunicationType(uploadFrame.getCommunicationType()); configFrame.setDestinationAddr(uploadFrame.getDestinationAddr()); configFrame.setSequence(uploadFrame.getSequence()); - configFrame.setDeviceType(uploadFrame.getDeviceType()); - configFrame.replyPduType(); + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(uploadFrame.getOperationType()); + switch (typeEnums) { + case UP_GET_REQUEST: + // 请求远程升级数据 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_GET_RESPONSE.getValue()); + replyGetRequestHandler(configFrame); + break; - // TODO-LIST - // 查询数据库找到待下发的内容 + case UP_ONLINE_REQUEST: + // 查询是否需要远程升级 + configFrame.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); + replyOnlineRequestHandler(configFrame); + break; - configFrame.replyBizTag(); + 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 } 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.setConfigItem(JSON.parseObject(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()); + } + } + } + @Override public String replyMessage(BirmmBaseFrame configFrame) { StringBuilder frame = new StringBuilder(); diff --git a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java index acfa22f..ed09d3d 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/service/impl/PushServiceImplFlume.java @@ -20,6 +20,8 @@ import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Slf4j @Component("tcpPusher") @@ -56,6 +58,7 @@ b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) .handler(handler); // 连接到服务器并发送 @@ -81,9 +84,11 @@ ByteBuf buf = (ByteBuf) msg; String message = buf.toString(CharsetUtil.UTF_8); log.info("收到接收端返回的消息[{}]", message.trim()); + } - ThreadUtil.safeSleep(1000); - ctx.channel().close(); + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("连接关闭[{}]", ctx.channel().id().asShortText()); } @Override @@ -94,5 +99,10 @@ ctx.channel().writeAndFlush(buff); log.info("通过Flume推送消息[{}] {}", ctx.channel().id().asShortText(), msg.trim()); + + // 10秒后直接关闭连接 + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + ctx.channel().close(); + }, 10, TimeUnit.SECONDS); } } 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 index ef1fd2b..97d7142 100644 --- 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 @@ -17,9 +17,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelFrameByOperation(operaType); - case WELL: - return null; - default: return null; } @@ -39,9 +36,6 @@ case SENTINEL: return SentinelFrameBuilderFactory.createSentinelReplyFrameByOperation(operaType); - case WELL: - return null; - default: 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 0702199..05c2e2b 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 @@ -1,20 +1,22 @@ package com.casic.missiles.frame.base; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.enums.BirmmOperationTypeEnums; +import com.casic.missiles.frame.tag.BirmmTagBuilderFactory; import com.casic.missiles.frame.tag.biz.SensorStartupTag; import com.casic.missiles.frame.tag.config.DateTimeTag; import com.casic.missiles.model.DeviceBizData; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -public class BirmmBaseFrame { +public class BirmmBaseFrame implements Serializable { // 前导码 固定为A3 final String PRE_CODE = "A3"; @@ -51,6 +53,9 @@ Map> tagList; + // 待下发的配置项 + Map configItem; + // CRC String crc; @@ -58,12 +63,21 @@ String rawBizFrameString; + public String getOperationTypeName() { + BirmmOperationTypeEnums typeEnums = BirmmOperationTypeEnums.toType(operationType); + return typeEnums.getDescription(); + } + + public String getDeviceTypeName() { + return ""; + } + public boolean isBizDataFrame() { return false; } public boolean needPushToApplication() { - return true; + return false; } public boolean hasSensorStartupTag() { @@ -103,5 +117,18 @@ List tags = new ArrayList<>(); tags.add(dateTimeTag); tagList.put(DateTimeTag.class.getSimpleName(), tags); + + // 有其他的配置项 + if (ObjectUtil.isNotNull(configItem)) { + for (String configItemName : configItem.keySet()) { + Object configItemValue = configItem.get(configItemName); + + BirmmBaseTag tag = BirmmTagBuilderFactory.createTagByAlias(configItemName); + if (ObjectUtil.isNotNull(tag)) { + tag.setValueDecStr(StrUtil.toString(configItemValue)); // 设置的值为10进制 + tagList.put(tag.getClass().getSimpleName(), new ArrayList<>(Collections.singletonList(tag))); + } + } + } } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java index 2dd8b3b..a636eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmBaseTag.java @@ -14,6 +14,10 @@ return "[name: " + getClass().getSimpleName() + "][oid: " + oid + "][hex: " + valueStr + "]"; } + public void setValueDecStr(String valueDecStr) { + + } + public String toProtocolString() { return null; } 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 index 8a30fc2..5e7a7a2 100644 --- 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 @@ -2,9 +2,13 @@ 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"; @@ -26,9 +30,4 @@ return json; } - - @Override - public boolean needPushToApplication() { - return false; - } } 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 new file mode 100644 index 0000000..c485b36 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/base/BirmmStartupResponseReply.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 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/methane/MethaneBaseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java new file mode 100644 index 0000000..ebea11b --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneBaseFrame.java @@ -0,0 +1,6 @@ +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 index bbe5fa9..74fe507 100644 --- 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 @@ -2,6 +2,8 @@ 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 { @@ -61,11 +63,9 @@ reply.setOperationType(BirmmOperationTypeEnums.DOWN_ONLINE_RESPONSE.getValue()); break; - case UP_SET_RESPONSE: + case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - reply = SpringContextUtil.getBean(MethaneStartupResponseReply.class); - reply.setOperationType(BirmmOperationTypeEnums.DOWN_STARTUP_RESPONSE.getValue()); - break; + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: return null; 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 index a57c1ab..4f9bd02 100644 --- 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 @@ -11,9 +11,7 @@ import java.time.format.DateTimeFormatter; @Component("MethaneGetRequest") -public class MethaneGetRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +public class MethaneGetRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private final String MESSAGE_TYPE = "GetRequest"; private final String BIZ_TYPE = DEV_TYPE + MESSAGE_TYPE; 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 index a3d4cb3..bb05b4d 100644 --- 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 @@ -8,13 +8,16 @@ import java.time.format.DateTimeFormatter; @Component("MethaneOnlineRequest") -public class MethaneOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Methane"; +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); 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 index e401e91..c9fda4e 100644 --- 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 @@ -15,6 +15,11 @@ public class MethaneOnlineResponseReply extends BirmmBaseFrame { @Override + public String getDeviceTypeName() { + return "Methane"; + } + + @Override public void replyPduType() { StringBuilder pduType; @@ -33,7 +38,9 @@ // 需要升级 回复NeedOTATag + PackageSizeTag + PackageCRCTag // TODO-LIST // 暂时回复不用升级 - Map> tagList = new HashMap<>(); + super.replyBizTag(); + + Map> tagList = getTagList(); NeedOTATag needTag = new NeedOTATag(); needTag.setNeed(false); List needTags = new ArrayList<>(); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java deleted file mode 100644 index d11f321..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetRequestFrame.java +++ /dev/null @@ -1,44 +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("MethaneSetRequest") -public class MethaneSetRequestFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_SET_REQUEST.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/methane/MethaneSetResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java index 49804e1..518507d 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneSetResponseFrame.java @@ -1,8 +1,31 @@ package com.casic.missiles.frame.methane; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("MethaneSetResponse") -public class MethaneSetResponseFrame extends BirmmBaseFrame { +@Scope("prototype") +public class MethaneSetResponseFrame extends BirmmBaseFrame implements MethaneBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + 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 index da3abfc..dfef57f 100644 --- 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 @@ -2,15 +2,20 @@ 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") -public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class MethaneStartupRequestFrame extends BirmmStartupRequestFrame implements MethaneBaseFrame { + + @Override + public String getDeviceTypeName() { + return DEV_TYPE; + } @Override public JSONObject toJSON() { - String DEV_TYPE = "Methane"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java deleted file mode 100644 index 8d9a261..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/methane/MethaneStartupResponseReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.casic.missiles.frame.methane; - -import com.casic.missiles.frame.base.BirmmBaseFrame; -import org.springframework.stereotype.Component; - -@Component("MethaneStartupResponse") -public class MethaneStartupResponseReply extends BirmmBaseFrame { - - -} 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 e7cf4f9..adb7ce0 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 @@ -24,15 +24,18 @@ @Component("MethaneTrapRequest") @Slf4j -public class MethaneTrapRequestFrame extends BirmmBaseFrame { +public class MethaneTrapRequestFrame extends BirmmBaseFrame implements MethaneBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Methane"; private final String MESSAGE_TYPE = "Data"; 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); @@ -78,6 +81,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -170,12 +178,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } 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 index f818442..a066c7f 100644 --- 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 @@ -1,22 +1,11 @@ package com.casic.missiles.frame.methane; -import com.casic.missiles.enums.BirmmOperationTypeEnums; 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 { - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } } 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 new file mode 100644 index 0000000..2bd88df --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelBaseFrame.java @@ -0,0 +1,6 @@ +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 index ff58d7c..f9265d9 100644 --- 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 @@ -2,8 +2,9 @@ import com.casic.missiles.enums.BirmmOperationTypeEnums; import com.casic.missiles.frame.base.BirmmBaseFrame; -import com.casic.missiles.frame.methane.MethaneGetRequestFrame; -import com.casic.missiles.frame.methane.MethaneGetResponseReply; +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 { @@ -13,10 +14,10 @@ if (operation != null) { switch (operation) { case UP_GET_REQUEST: - return new MethaneGetRequestFrame(); +// return new MethaneGetRequestFrame(); case UP_TRAP_REQUEST: - return new SentinelTrapRequestFrame(); + return SpringContextUtil.getBean(SentinelTrapRequestFrame.class); case UP_ONLINE_REQUEST: return new SentinelOnlineRequestFrame(); @@ -42,19 +43,19 @@ switch (operation) { case UP_GET_REQUEST: // GET_REQUEST消息回复GET_RESPONSE 用于远程升级请求数据文件 - return new MethaneGetResponseReply(); +// return new MethaneGetResponseReply(); case UP_TRAP_REQUEST: // TRAP_REQUEST消息回复TRAP_RESPONSE - return new SentinelTrapResponseFrame(); + return SpringContextUtil.getBean(SentinelTrapResponseReply.class); case UP_ONLINE_REQUEST: // ONLINE_REQUEST消息回复ONLINE_RESPONSE - return new SentinelOnlineResponseFrame(); + return new SentinelOnlineResponseReply(); case UP_STARTUP_REQUEST: // STARTUP_REQUEST消息回复STARTUP_RESPONSE 回复三码 - return SpringContextUtil.getBean(SentinelStartupResponseFrame.class); + return SpringContextUtil.getBean(BirmmStartupResponseReply.class); default: 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 index b8805c5..240c332 100644 --- 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 @@ -6,13 +6,16 @@ import java.time.format.DateTimeFormatter; -public class SentinelOnlineRequestFrame extends BirmmBaseFrame { - - private final String DEV_TYPE = "Tube"; +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); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.java deleted file mode 100644 index 9595a99..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseFrame.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 SentinelOnlineResponseFrame 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/SentinelOnlineResponseReply.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java new file mode 100644 index 0000000..873cd37 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelOnlineResponseReply.java @@ -0,0 +1,42 @@ +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 index e22140c..35ef234 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelSetResponseFrame.java @@ -1,6 +1,31 @@ package com.casic.missiles.frame.sentinel; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.frame.base.BirmmBaseFrame; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; -public class SentinelSetResponseFrame extends BirmmBaseFrame { +@Component("SentinelSetResponse") +@Scope("prototype") +public class SentinelSetResponseFrame extends BirmmBaseFrame implements SentinelBaseFrame { + + private final String MESSAGE_TYPE = "SetResponse"; + + @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", DEV_TYPE + "ConfigSuccess"); + json.put("mBody", body); + + return json; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java index 2078c1e..26b4eb4 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupRequestFrame.java @@ -2,15 +2,15 @@ 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") -public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame { +@Scope("prototype") +public class SentinelStartupRequestFrame extends BirmmStartupRequestFrame implements SentinelBaseFrame { @Override public JSONObject toJSON() { - String DEV_TYPE = "Tube"; - JSONObject json = super.toJSON(); json.put("devType", DEV_TYPE); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java deleted file mode 100644 index 21be5bd..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelStartupResponseFrame.java +++ /dev/null @@ -1,29 +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 org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component("SentinelStartupResponse") -public class SentinelStartupResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_STARTUP_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()); - } -} 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 fa6d34b..544e203 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 @@ -14,6 +14,8 @@ 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; import java.time.format.DateTimeFormatter; @@ -21,15 +23,20 @@ import java.util.List; @Slf4j -public class SentinelTrapRequestFrame extends BirmmBaseFrame { +@Component("SentinelTrapRequestFrame") +@Scope("prototype") +public class SentinelTrapRequestFrame extends BirmmBaseFrame implements SentinelBaseFrame { private List bizDataList; - - private final String DEV_TYPE = "Tube"; private final String MESSAGE_TYPE = "Data"; 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); @@ -84,6 +91,11 @@ } @Override + public boolean needPushToApplication() { + return true; + } + + @Override public List convertToBizDataList() { List resultList = new ArrayList<>(); if (bizDataList != null) { @@ -179,12 +191,12 @@ List tags = getTagList().get(SensorStateTag.class.getSimpleName()); for (BirmmBaseTag tag : tags) { SensorStateTag sensorStateTag = (SensorStateTag) tag; - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_1_TAG.getOid())) { // 甲烷传感器状态 log.info("甲烷传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } - if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getName())) { + if (sensorStateTag.getOid().equals(BirmmTagTypeEnums.SENSOR_STATE_2_TAG.getOid())) { // 甲烷传感器状态 log.info("静压传感器状态:{}", sensorStateTag.getValueStr().equals("00") ? "正常" : "异常"); } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java deleted file mode 100644 index b613582..0000000 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseFrame.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.frame.sentinel; - -import com.casic.missiles.enums.BirmmOperationTypeEnums; -import com.casic.missiles.frame.base.BirmmBaseFrame; - -public class SentinelTrapResponseFrame extends BirmmBaseFrame { - - @Override - public void replyPduType() { - StringBuilder pduType; - - int pduValue = Integer.parseInt(BirmmOperationTypeEnums.DOWN_TRAP_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()); - } -} 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 new file mode 100644 index 0000000..02e5678 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/sentinel/SentinelTrapResponseReply.java @@ -0,0 +1,11 @@ +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-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java index 4875dcb..2b7ab1e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagBuilderFactory.java @@ -89,4 +89,46 @@ } return null; } + + public static BirmmBaseTag createTagByAlias(String alias) { + BirmmTagTypeEnums tag = BirmmTagTypeEnums.toAlias(alias); + if (null != tag) { + switch (tag) { + case RETRY_TIMES_TAG: + return new RetryTimesTag(); + + case DESTINATION_IP_TAG: + return new DestIPTag(); + + case DESTINATION_PORT_TAG: + return new DestPortTag(); + + case DATETIME_TAG: + return new DateTimeTag(); + + case UPLOAD_INTERVAL_TAG: + return new UploadIntervalTag(); + + case START_TIME_TAG: + return new StartTimeTag(); + + case COLLECT_INTERVAL_TAG: + return new CollectIntervalTag(); + + case COLLECT_COUNT_TAG: + return new CollectCountTag(); + + case LOWER_LIMIT_TAG: + return new LowerLimitTag(); + + case UPPER_LIMIT_TAG: + return new UpperLimitTag(); + + default: + return null; + } + } + + return null; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java new file mode 100644 index 0000000..1ab8c70 --- /dev/null +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/BirmmTagConfig.java @@ -0,0 +1,25 @@ +package com.casic.missiles.frame.tag; + +import com.casic.missiles.frame.tag.config.CollectIntervalTag; +import com.casic.missiles.frame.tag.config.UploadIntervalTag; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class BirmmTagConfig { + + // 首选 + @Bean("interval") + @Scope("prototype") + public CollectIntervalTag interval() { + System.out.println("create a new interval tag"); + return new CollectIntervalTag(); + } + + @Bean("period") + @Scope("prototype") + public UploadIntervalTag period() { + return new UploadIntervalTag(); + } +} diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java index 6df22bd..4e7ca70 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectCountTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("times") +@Scope("prototype") public class CollectCountTag extends BirmmBaseTag { final String COLLECT_COUNT_TAG_OID = "10000106"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); count = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + count = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_COUNT_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_COUNT_TAG.getLength() * 2 + "x", count); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java index def754c..331b0f9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/CollectIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("interval") +@Scope("prototype") public class CollectIntervalTag extends BirmmBaseTag { final String COLLECT_INTERVAL_TAG_OID = "10000105"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.COLLECT_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java index bcb3988..f7fdeda 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/DateTimeTag.java @@ -25,7 +25,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.DATETIME_TAG.getName(); // OID + result += BirmmTagTypeEnums.DATETIME_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.DATETIME_TAG.getLength()); // 长度 int year = dateTime.getYear() - 2000; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java index 5db36de..a18915a 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/RetryTimesTag.java @@ -1,13 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("RetryTimesTag") +@Component("repeat") +@Scope("prototype") public class RetryTimesTag extends BirmmBaseTag { final String RETRY_TIMES_TAG_OID = "1000000A"; @@ -21,8 +25,23 @@ } @Override + public void setValueDecStr(String valueDecStr) { + times = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override public void setValueStr(String valueStr) { super.setValueStr(valueStr); times = Integer.parseInt(valueStr, 16); } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.RETRY_TIMES_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.RETRY_TIMES_TAG.getLength() * 2 + "x", times); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java index 0ba06cf..c25d8ba 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/StartTimeTag.java @@ -4,11 +4,13 @@ import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data -@Component("StartTimeTag") +@Component("acqStart") +@Scope("prototype") public class StartTimeTag extends BirmmBaseTag { final String START_TIME_TAG_OID = "10000104"; diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java index f2392ee..78596be 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UploadIntervalTag.java @@ -1,12 +1,18 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; +import com.casic.missiles.enums.BirmmTagTypeEnums; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("period") +@Scope("prototype") public class UploadIntervalTag extends BirmmBaseTag { final String UPLOAD_INTERVAL_TAG_OID = "10000062"; @@ -24,4 +30,19 @@ super.setValueStr(valueStr); interval = BytesUtil.hexStringToUInt(valueStr); } + + @Override + public void setValueDecStr(String valueDecStr) { + interval = NumberUtil.parseNumber(valueDecStr).intValue(); + } + + @Override + public String toProtocolString() { + String result = ""; + result += BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getOid(); // OID + result += String.format("%04d", BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength()); // 长度 + result += String.format("%0" + BirmmTagTypeEnums.UPLOAD_INTERVAL_TAG.getLength() * 2 + "x", interval); + + return result; + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java index a0bbe7d..5acbd78 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/config/UpperLimitTag.java @@ -1,12 +1,17 @@ package com.casic.missiles.frame.tag.config; +import cn.hutool.core.util.NumberUtil; import com.casic.missiles.frame.base.BirmmBaseTag; import com.casic.missiles.util.BytesUtil; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @EqualsAndHashCode(callSuper = true) @Data +@Component("upperLimit") +@Scope("prototype") public class UpperLimitTag extends BirmmBaseTag { final String UPPER_LIMIT_TAG_OID = "10000901"; @@ -24,4 +29,10 @@ super.setValueStr(valueStr); upperLimit = Float.intBitsToFloat(Integer.parseInt(BytesUtil.reverseHexString(valueStr), 16)); } + + @Override + public void setValueDecStr(String valueDecStr) { + + upperLimit = NumberUtil.parseNumber(valueDecStr).intValue(); + } } diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java index 9daab43..2d256ea 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/NeedOTATag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_NEED_OTA_TAG.getLength() * 2 + "x", need ? 1 : 0); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java index 0056fb8..da2c510 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageCRCTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_CRC_TAG.getLength() * 2 + "x", packCRC); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java index 76566e0..facb19e 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageDataTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_DATA_TAG.getOid(); // OID result += String.format("%04d", data.length); // 长度 result += HexUtils.toHexString(data); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java index 8331ebd..4903ac9 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/PackageSizeTag.java @@ -21,7 +21,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_PACKAGE_SIZE_TAG.getLength() * 2 + "x", packSize); diff --git a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java index 35cf112..bc6c09c 100644 --- a/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java +++ b/sensorhub-service-birmm/src/main/java/com/casic/missiles/frame/tag/ota/RequestOffsetTag.java @@ -22,7 +22,7 @@ @Override public String toProtocolString() { String result = ""; - result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getName(); // OID + result += BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getOid(); // OID result += String.format("%04d", BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength()); // 长度 result += String.format("%0" + BirmmTagTypeEnums.OTA_REQUEST_OFFSET_TAG.getLength() * 2 + "x", requestOffset); 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 92336b6..4c75cda 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 @@ -9,7 +9,7 @@ */ @Getter public enum BirmmDeviceTypeEnums { - METHANE("4", "BIRMM-RTU100N", "31"), // 燃气智能监测终端 + METHANE("4", "Methane", "31"), // 燃气智能监测终端 WELL("6", "BIRMM-WELL100N", "41"), // 井盖 LIQUID_GAS("25", "", "32"), // 燃液一体化设备 SENTINEL("28", "", "34"), // 管盯 diff --git a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java index 5e9956d..2cfb88b 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/enums/BirmmTagTypeEnums.java @@ -9,57 +9,64 @@ */ @Getter public enum BirmmTagTypeEnums { - RETRY_TIMES_TAG("1000000A", 1), - DESTINATION_IP_TAG("10000022", -1), - DESTINATION_PORT_TAG("10000023", -1), - DATE_TAG("10000050", 3), - DATETIME_TAG("10000051", 6), - UPLOAD_INTERVAL_TAG("10000062", 2), - SENSOR_STARTUP_TAG("10000063", 35), - START_TIME_TAG("10000104", 2), - COLLECT_INTERVAL_TAG("10000105", 2), - COLLECT_COUNT_TAG("10000106", 2), - LOWER_LIMIT_TAG("10000900", 4), - UPPER_LIMIT_TAG("10000901", 4), + RETRY_TIMES_TAG("1000000A", 1, "repeat"), + DESTINATION_IP_TAG("10000022", -1, "ip"), + DESTINATION_PORT_TAG("10000023", -1, "port"), + DATE_TAG("10000050", 3, "date"), + DATETIME_TAG("10000051", 6, "dateTime"), + UPLOAD_INTERVAL_TAG("10000062", 2, "period"), + SENSOR_STARTUP_TAG("10000063", 35, "startup"), + START_TIME_TAG("10000104", 2, "startTime"), + COLLECT_INTERVAL_TAG("10000105", 2, "interval"), + COLLECT_COUNT_TAG("10000106", 2, "times"), + LOWER_LIMIT_TAG("10000900", 4, "lower"), + UPPER_LIMIT_TAG("10000901", 4, "upper"), - OTA_REQUEST_SIZE_TAG("20000100", 4), - OTA_REQUEST_OFFSET_TAG("20000102", 4), + OTA_REQUEST_SIZE_TAG("20000100", 4, "reqSize"), + OTA_REQUEST_OFFSET_TAG("20000102", 4, "reqOffset"), - SENSOR_STATE_1_TAG("60000009", 1), - SENSOR_STATE_2_TAG("6000000A", 1), - SENSOR_STATE_3_TAG("6000000B", 1), - SENSOR_STATE_4_TAG("6000000C", 1), - SENSOR_STATE_5_TAG("6000000D", 1), - CELL_TAG("60000020", 1), - VOLTAGE_TAG("60000030", 1), - SOFTWARE_VERSION_TAG("60000500", -1), - PCI_TAG("60000511", 2), - RSRP_TAG("60000513", 2), - SNR_TAG("60000516", 2), + SENSOR_STATE_1_TAG("60000009", 1, "state1"), + SENSOR_STATE_2_TAG("6000000A", 1, "state2"), + SENSOR_STATE_3_TAG("6000000B", 1, "state3"), + SENSOR_STATE_4_TAG("6000000C", 1, "state4"), + SENSOR_STATE_5_TAG("6000000D", 1, "state5"), + CELL_TAG("60000020", 1, "cell"), + VOLTAGE_TAG("60000030", 1, "voltage"), + SOFTWARE_VERSION_TAG("60000500", -1, "software"), + PCI_TAG("60000511", 2, "pci"), + RSRP_TAG("60000513", 2, "rsrp"), + SNR_TAG("60000516", 2, "snr"), - OTA_NEED_OTA_TAG("60000600", 1), - OTA_PACKAGE_DATA_TAG("60000601", -1), - OTA_PACKAGE_SIZE_TAG("60000602", 4), - OTA_PACKAGE_CRC_TAG("60000603", 2) + OTA_NEED_OTA_TAG("60000600", 1, "needOta"), + OTA_PACKAGE_DATA_TAG("60000601", -1, "packageData"), + OTA_PACKAGE_SIZE_TAG("60000602", 4, "packageSize"), + OTA_PACKAGE_CRC_TAG("60000603", 2, "packageCrc") ; /** * 名称 */ - private final String name; + private final String oid; /** * 属性字节长度 */ private final int length; - BirmmTagTypeEnums(String name, int length) { - this.name = name; + private final String alias; + + BirmmTagTypeEnums(String oid, int length, String alias) { + this.oid = oid; this.length = length; + this.alias = alias; } - public static BirmmTagTypeEnums toType(String oid) { - return Stream.of(BirmmTagTypeEnums.values()).filter(p -> p.name.equalsIgnoreCase(oid)).findAny().orElse(null); + public static BirmmTagTypeEnums toType(String tagOid) { + return Stream.of(BirmmTagTypeEnums.values()).filter(p -> p.oid.equalsIgnoreCase(tagOid)).findAny().orElse(null); + } + + public static BirmmTagTypeEnums toAlias(String sName) { + return Stream.of(BirmmTagTypeEnums.values()).filter(p -> p.alias.equalsIgnoreCase(sName)).findAny().orElse(null); } } diff --git a/sensorhub-support/src/main/java/com/casic/missiles/util/BytesUtil.java b/sensorhub-support/src/main/java/com/casic/missiles/util/BytesUtil.java index 6d49305..2529f9e 100644 --- a/sensorhub-support/src/main/java/com/casic/missiles/util/BytesUtil.java +++ b/sensorhub-support/src/main/java/com/casic/missiles/util/BytesUtil.java @@ -36,7 +36,7 @@ } public static float hexStringToFloat(String str) { - return Float.intBitsToFloat(Integer.parseInt(str, 16)); + return Float.intBitsToFloat((int) Long.parseLong(str, 16)); } public static byte[] hexStringToBytes(String str) {