Commit b6c7937aebe7d0d7b216e7735eea543e97e1c683

Authored by YunaiV
1 parent 8203e074

【代码评审】IoT:OTA 的实现

Showing 21 changed files with 39 additions and 31 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/IotDataBridgePageReqVO.java
1 package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge; 1 package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 4 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  5 +import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 7 import lombok.Data;
6 import org.springframework.format.annotation.DateTimeFormat; 8 import org.springframework.format.annotation.DateTimeFormat;
@@ -16,7 +18,8 @@ public class IotDataBridgePageReqVO extends PageParam { @@ -16,7 +18,8 @@ public class IotDataBridgePageReqVO extends PageParam {
16 @Schema(description = "桥梁名称", example = "赵六") 18 @Schema(description = "桥梁名称", example = "赵六")
17 private String name; 19 private String name;
18 20
19 - @Schema(description = "桥梁状态", example = "2") 21 + @Schema(description = "桥梁状态", example = "1")
  22 + @InEnum(CommonStatusEnum.class)
20 private Integer status; 23 private Integer status;
21 24
22 @Schema(description = "创建时间") 25 @Schema(description = "创建时间")
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/IotDataBridgeRespVO.java
1 package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge; 1 package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge;
2 2
3 import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeAbstractConfig; 3 import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeAbstractConfig;
4 -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;  
5 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
6 import lombok.Data; 5 import lombok.Data;
7 6
@@ -20,7 +19,7 @@ public class IotDataBridgeRespVO { @@ -20,7 +19,7 @@ public class IotDataBridgeRespVO {
20 @Schema(description = "桥梁描述", example = "随便") 19 @Schema(description = "桥梁描述", example = "随便")
21 private String description; 20 private String description;
22 21
23 - @Schema(description = "桥梁状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") 22 + @Schema(description = "桥梁状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
24 private Integer status; 23 private Integer status;
25 24
26 @Schema(description = "桥梁方向", requiredMode = Schema.RequiredMode.REQUIRED) 25 @Schema(description = "桥梁方向", requiredMode = Schema.RequiredMode.REQUIRED)
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeAbstractConfig.java
@@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
6 import lombok.Data; 6 import lombok.Data;
7 7
8 /** 8 /**
9 - * 抽象类 IotDataBridgeConfig 9 + * IoT IotDataBridgeConfig 抽象类
10 * 10 *
11 * 用于表示数据桥梁配置数据的通用类型,根据具体的 "type" 字段动态映射到对应的子类 11 * 用于表示数据桥梁配置数据的通用类型,根据具体的 "type" 字段动态映射到对应的子类
12 * 提供多态支持,适用于不同类型的数据结构序列化和反序列化场景。 12 * 提供多态支持,适用于不同类型的数据结构序列化和反序列化场景。
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeHttpConfig.java
@@ -5,7 +5,7 @@ import lombok.Data; @@ -5,7 +5,7 @@ import lombok.Data;
5 import java.util.Map; 5 import java.util.Map;
6 6
7 /** 7 /**
8 - * HTTP 配置 8 + * IoT HTTP 配置 {@link IotDataBridgeAbstractConfig} 实现类
9 * 9 *
10 * @author HUIHUI 10 * @author HUIHUI
11 */ 11 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeKafkaMQConfig.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config;
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * Kafka 配置 6 + * IoT Kafka 配置 {@link IotDataBridgeAbstractConfig} 实现类
7 * 7 *
8 * @author HUIHUI 8 * @author HUIHUI
9 */ 9 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeMqttConfig.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config;
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * MQTT 配置 6 + * IoT MQTT 配置 {@link IotDataBridgeAbstractConfig} 实现类
7 * 7 *
8 * @author HUIHUI 8 * @author HUIHUI
9 */ 9 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeRabbitMQConfig.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config;
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * RabbitMQ 配置 6 + * IoT RabbitMQ 配置 {@link IotDataBridgeAbstractConfig} 实现类
7 * 7 *
8 * @author HUIHUI 8 * @author HUIHUI
9 */ 9 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeRedisStreamMQConfig.java
@@ -2,8 +2,9 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; @@ -2,8 +2,9 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
  5 +// TODO @puhui999:MQ 可以去掉哈。stream 更精准
5 /** 6 /**
6 - * Redis Stream MQ 配置 7 + * IoT Redis Stream 配置 {@link IotDataBridgeAbstractConfig} 实现类
7 * 8 *
8 * @author HUIHUI 9 * @author HUIHUI
9 */ 10 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeRocketMQConfig.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config;
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * RocketMQ 配置 6 + * IoT RocketMQ 配置 {@link IotDataBridgeAbstractConfig} 实现类
7 * 7 *
8 * @author HUIHUI 8 * @author HUIHUI
9 */ 9 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/package-info.java
  1 +// TODO @芋艿:占位
1 package cn.iocoder.yudao.module.iot.controller.admin.rule.vo; 2 package cn.iocoder.yudao.module.iot.controller.admin.rule.vo;
2 \ No newline at end of file 3 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/statistics/IotStatisticsController.java
@@ -21,6 +21,8 @@ import org.springframework.web.bind.annotation.RestController; @@ -21,6 +21,8 @@ import org.springframework.web.bind.annotation.RestController;
21 import java.time.LocalDateTime; 21 import java.time.LocalDateTime;
22 import java.util.Map; 22 import java.util.Map;
23 23
  24 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.*;
  25 +
24 @Tag(name = "管理后台 - IoT 数据统计") 26 @Tag(name = "管理后台 - IoT 数据统计")
25 @RestController 27 @RestController
26 @RequestMapping("/iot/statistics") 28 @RequestMapping("/iot/statistics")
@@ -61,7 +63,7 @@ public class IotStatisticsController { @@ -61,7 +63,7 @@ public class IotStatisticsController {
61 respVO.setDeviceOnlineCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.ONLINE.getState(), 0L)); 63 respVO.setDeviceOnlineCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.ONLINE.getState(), 0L));
62 respVO.setDeviceOfflineCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.OFFLINE.getState(), 0L)); 64 respVO.setDeviceOfflineCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.OFFLINE.getState(), 0L));
63 respVO.setDeviceInactiveCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.INACTIVE.getState(), 0L)); 65 respVO.setDeviceInactiveCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.INACTIVE.getState(), 0L));
64 - return CommonResult.success(respVO); 66 + return success(respVO);
65 } 67 }
66 68
67 // TODO @super:要不干掉 IotStatisticsReqVO 参数,直接使用 @RequestParam 接收,简单一些。 69 // TODO @super:要不干掉 IotStatisticsReqVO 参数,直接使用 @RequestParam 接收,简单一些。
@@ -69,7 +71,7 @@ public class IotStatisticsController { @@ -69,7 +71,7 @@ public class IotStatisticsController {
69 @Operation(summary = "获取 IoT 设备上下行消息数据统计") 71 @Operation(summary = "获取 IoT 设备上下行消息数据统计")
70 public CommonResult<IotStatisticsDeviceMessageSummaryRespVO> getIotStatisticsDeviceMessageSummary( 72 public CommonResult<IotStatisticsDeviceMessageSummaryRespVO> getIotStatisticsDeviceMessageSummary(
71 @Valid IotStatisticsReqVO reqVO) { 73 @Valid IotStatisticsReqVO reqVO) {
72 - return CommonResult.success(new IotStatisticsDeviceMessageSummaryRespVO() 74 + return success(new IotStatisticsDeviceMessageSummaryRespVO()
73 .setDownstreamCounts(deviceLogService.getDeviceLogUpCountByHour(null, reqVO.getStartTime(), reqVO.getEndTime())) 75 .setDownstreamCounts(deviceLogService.getDeviceLogUpCountByHour(null, reqVO.getStartTime(), reqVO.getEndTime()))
74 .setDownstreamCounts((deviceLogService.getDeviceLogDownCountByHour(null, reqVO.getStartTime(), reqVO.getEndTime())))); 76 .setDownstreamCounts((deviceLogService.getDeviceLogDownCountByHour(null, reqVO.getStartTime(), reqVO.getEndTime()))));
75 } 77 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelEvent.java
@@ -10,7 +10,7 @@ import lombok.Data; @@ -10,7 +10,7 @@ import lombok.Data;
10 import java.util.List; 10 import java.util.List;
11 11
12 /** 12 /**
13 - * 物模型中的事件 13 + * IoT 物模型中的事件
14 * 14 *
15 * @author HUIHUI 15 * @author HUIHUI
16 */ 16 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelProperty.java
@@ -11,7 +11,7 @@ import lombok.Data; @@ -11,7 +11,7 @@ import lombok.Data;
11 import java.util.List; 11 import java.util.List;
12 12
13 /** 13 /**
14 - * 物模型中的属性 14 + * IoT 物模型中的属性
15 * 15 *
16 * dataSpecs 和 dataSpecsList 之中必须传入且只能传入一个 16 * dataSpecs 和 dataSpecsList 之中必须传入且只能传入一个
17 * 17 *
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelService.java
@@ -10,7 +10,7 @@ import lombok.Data; @@ -10,7 +10,7 @@ import lombok.Data;
10 import java.util.List; 10 import java.util.List;
11 11
12 /** 12 /**
13 - * 物模型中的服务 13 + * IoT 物模型中的服务
14 * 14 *
15 * @author HUIHUI 15 * @author HUIHUI
16 */ 16 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelArrayDataSpecs.java
@@ -7,25 +7,25 @@ import lombok.EqualsAndHashCode; @@ -7,25 +7,25 @@ import lombok.EqualsAndHashCode;
7 import java.util.List; 7 import java.util.List;
8 8
9 /** 9 /**
10 - * 物模型数据类型为数组的 DataSpec 定义 10 + * IoT 物模型数据类型为数组的 DataSpec 定义
11 * 11 *
12 * @author HUIHUI 12 * @author HUIHUI
13 */ 13 */
14 @Data 14 @Data
15 @EqualsAndHashCode(callSuper = true) 15 @EqualsAndHashCode(callSuper = true)
16 -@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复。 16 +@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
17 public class ThingModelArrayDataSpecs extends ThingModelDataSpecs { 17 public class ThingModelArrayDataSpecs extends ThingModelDataSpecs {
18 18
19 /** 19 /**
20 - * 数组中的元素个数。 20 + * 数组中的元素个数
21 */ 21 */
22 private Integer size; 22 private Integer size;
23 /** 23 /**
24 - * 数组中的元素的数据类型。可选值:struct、int、float、double 或 text。 24 + * 数组中的元素的数据类型。可选值:struct、int、float、double 或 text
25 */ 25 */
26 private String childDataType; 26 private String childDataType;
27 /** 27 /**
28 - * 数据类型(childDataType)为列表型 struct 的数据规范存储在 dataSpecsList 中。 28 + * 数据类型(childDataType)为列表型 struct 的数据规范存储在 dataSpecsList 中
29 * 此时 struct 取值范围为:int、float、double、text、date、enum、bool 29 * 此时 struct 取值范围为:int、float、double、text、date、enum、bool
30 */ 30 */
31 private List<ThingModelDataSpecs> dataSpecsList; 31 private List<ThingModelDataSpecs> dataSpecsList;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelBoolOrEnumDataSpecs.java
@@ -5,7 +5,7 @@ import lombok.Data; @@ -5,7 +5,7 @@ import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 6
7 /** 7 /**
8 - * 物模型数据类型为布尔型或枚举型的 DataSpec 定义 8 + * IoT 物模型数据类型为布尔型或枚举型的 DataSpec 定义
9 * 9 *
10 * 数据类型,取值为 bool 或 enum。 10 * 数据类型,取值为 bool 或 enum。
11 * 11 *
@@ -13,13 +13,14 @@ import lombok.EqualsAndHashCode; @@ -13,13 +13,14 @@ import lombok.EqualsAndHashCode;
13 */ 13 */
14 @Data 14 @Data
15 @EqualsAndHashCode(callSuper = true) 15 @EqualsAndHashCode(callSuper = true)
16 -@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复。 16 +@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
17 public class ThingModelBoolOrEnumDataSpecs extends ThingModelDataSpecs { 17 public class ThingModelBoolOrEnumDataSpecs extends ThingModelDataSpecs {
18 18
  19 + // TODO @puhui999:要不写下参数校验?这样,注释可以简洁一点
19 /** 20 /**
20 * 枚举项的名称。 21 * 枚举项的名称。
21 - * 可包含中文、大小写英文字母、数字、下划线(_)和短划线(-)。  
22 - * 必须以中文、英文字母或数字开头,长度不超过 20 个字符。 22 + * 可包含中文、大小写英文字母、数字、下划线(_)和短划线(-)
  23 + * 必须以中文、英文字母或数字开头,长度不超过 20 个字符
23 */ 24 */
24 private String name; 25 private String name;
25 /** 26 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelDataSpecs.java
@@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
5 import lombok.Data; 5 import lombok.Data;
6 6
7 /** 7 /**
8 - * 抽象类 ThingModelDataSpecs 8 + * IoT ThingModelDataSpecs 抽象类
9 * 9 *
10 * 用于表示物模型数据的通用类型,根据具体的 "dataType" 字段动态映射到对应的子类。 10 * 用于表示物模型数据的通用类型,根据具体的 "dataType" 字段动态映射到对应的子类。
11 * 提供多态支持,适用于不同类型的数据结构序列化和反序列化场景。 11 * 提供多态支持,适用于不同类型的数据结构序列化和反序列化场景。
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelDateOrTextDataSpecs.java
@@ -5,7 +5,7 @@ import lombok.Data; @@ -5,7 +5,7 @@ import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 6
7 /** 7 /**
8 - * 物模型数据类型为时间型或文本型的 DataSpec 定义 8 + * IoT 物模型数据类型为时间型或文本型的 DataSpec 定义
9 * 9 *
10 * 数据类型,取值为 date 或 text。 10 * 数据类型,取值为 date 或 text。
11 * 11 *
@@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode; @@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode;
13 */ 13 */
14 @Data 14 @Data
15 @EqualsAndHashCode(callSuper = true) 15 @EqualsAndHashCode(callSuper = true)
16 -@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复。 16 +@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
17 public class ThingModelDateOrTextDataSpecs extends ThingModelDataSpecs { 17 public class ThingModelDateOrTextDataSpecs extends ThingModelDataSpecs {
18 18
19 /** 19 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelNumericDataSpec.java
@@ -5,7 +5,7 @@ import lombok.Data; @@ -5,7 +5,7 @@ import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 6
7 /** 7 /**
8 - * 物模型数据类型为数值的 DataSpec 定义 8 + * IoT 物模型数据类型为数值的 DataSpec 定义
9 * 9 *
10 * 数据类型,取值为 int、float 或 double。 10 * 数据类型,取值为 int、float 或 double。
11 * 11 *
@@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode; @@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode;
13 */ 13 */
14 @Data 14 @Data
15 @EqualsAndHashCode(callSuper = true) 15 @EqualsAndHashCode(callSuper = true)
16 -@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复。 16 +@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
17 public class ThingModelNumericDataSpec extends ThingModelDataSpecs { 17 public class ThingModelNumericDataSpec extends ThingModelDataSpecs {
18 18
19 /** 19 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelStructDataSpecs.java
@@ -8,13 +8,13 @@ import lombok.EqualsAndHashCode; @@ -8,13 +8,13 @@ import lombok.EqualsAndHashCode;
8 import java.util.List; 8 import java.util.List;
9 9
10 /** 10 /**
11 - * 物模型数据类型为 struct 的 DataSpec 定义 11 + * IoT 物模型数据类型为 struct 的 DataSpec 定义
12 * 12 *
13 * @author HUIHUI 13 * @author HUIHUI
14 */ 14 */
15 @Data 15 @Data
16 @EqualsAndHashCode(callSuper = true) 16 @EqualsAndHashCode(callSuper = true)
17 -@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复。 17 +@JsonIgnoreProperties({"dataType"}) // 忽略子类中的 dataType 字段,从而避免重复
18 public class ThingModelStructDataSpecs extends ThingModelDataSpecs { 18 public class ThingModelStructDataSpecs extends ThingModelDataSpecs {
19 19
20 /** 20 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/data/IotDeviceLogService.java
@@ -47,6 +47,7 @@ public interface IotDeviceLogService { @@ -47,6 +47,7 @@ public interface IotDeviceLogService {
47 */ 47 */
48 Long getDeviceLogCount(@Nullable LocalDateTime createTime); 48 Long getDeviceLogCount(@Nullable LocalDateTime createTime);
49 49
  50 + // TODO @super:deviceKey 是不是用不上哈?
50 /** 51 /**
51 * 获得每个小时设备上行消息数量统计 52 * 获得每个小时设备上行消息数量统计
52 * 53 *