指令交互
# 指令设计
方便用户快捷操作下发指令,需要对提前对下发的指令做准备。
指令大概
协议头 + 版本号 + 指令关键头 + 指令参数 + 校验码
构成。
# 指令设计参考
为了应对不断增加指令的需求,设计了一种指令参数的关系表。如下所示:
CREATE TABLE `device_command` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`command_name` varchar(255) DEFAULT NULL COMMENT '指令名称',
`command_code` varchar(50) DEFAULT NULL COMMENT '指令编码',
`resp_code` varchar(255) DEFAULT NULL COMMENT '响应码',
`command_version` int(10) DEFAULT NULL COMMENT '指令版本',
`command_type` tinyint(1) DEFAULT NULL COMMENT '指令类型(1- 操作类;2-设置类;3-查询类)',
`remark` varchar(512) DEFAULT NULL COMMENT '备注'
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='设备指令表';
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
CREATE TABLE `device_command_param` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`command_id` int(10) DEFAULT NULL COMMENT '指令id',
`param_seq` int(10) DEFAULT NULL COMMENT '参数序号',
`param_name` varchar(50) DEFAULT NULL COMMENT '参数名称',
`param_type` tinyint(1) DEFAULT NULL COMMENT '参数类型(1- 数值类;2- 字符类;3- 枚举类)',
`default_value` varchar(512) DEFAULT NULL COMMENT '默认值',
`min_value` varchar(512) DEFAULT NULL COMMENT '最小值',
`max_value` varchar(512) DEFAULT NULL COMMENT '最大值',
`options_value` varchar(512) DEFAULT NULL COMMENT '枚举值(举例:1-开机,2-关机)',
`param_unit` varchar(512) DEFAULT NULL COMMENT '参数单位',
`remark` varchar(512) DEFAULT NULL COMMENT '备注'
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='设备指令参数表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 指令队列
- 平台支持多指令下发,以创建指令下发的先后顺序排列。
- 启用指令最大;状态指令包括:启用、入库等,这些指令里面,启用指令最大。
- 入库指令后不再增加其他指令;
- 同类指令以最后一次为准;
- 指令状态
- 未下发的指令可以取消;
- 指令下发时,等待指令响应后再清理;
- 下发等待超时时间3s;
- 新增用户侧页面
- 新增指令状态页面,用户可操作(查看指令状态、取消缓存指令);
- 设备状态 - 增加最新指令状态;
# 条件
- 激活最前、入库最后;
- 激活能够覆盖入库; 有激活就不能再下发入库。
- 当激活、其余指令存在时,执行顺序:激活、xxx、xxx
- 当入库、其余指令存在时,执行顺序:xxx、xxx、入库
- 如果存在OTA指令,则先于所有指令先执行。
- 通过接口:通过页面操作生成 => 同类指令能被相互覆盖,最新为主
- 平台生成的指令:先判断是否存在,如果不存在,则新增;存在,则不生效。用户生成的指令可覆盖平台生成的指令
# 实现
Redis
存放待下发的指令;MySQL
存放已经下发的指令(携带状态:成功、失败、超时)key
分类:cmd_mark
一个keyredis--hash
keyimei
value:标识+参数
=> [{xx:xx},{xx:xx},{xx:xx}];优先级、用户可见、指令编码、指令名称、参数;full_cmd
一个key =>redis--hash
keyimei
value:存放完整指令
[xxx;xxx;xxx;]
- 指令顺序
- 通过接口下发的接口,重新构建顺序
- 先后顺序调整后,全量
注意: 用户编辑指令队列时,先将原full_cmd删除。编辑完成后, 再增加。
# 指令部分
- 下发过程中,如果设备断开连接,则直接失败
- 通过
ScheduledThreadPoolExecutor
控制下发速率;每次上报时,更新full_cmd
;下发时,重新构建延时队列。 - 指令状态:每次指令下发时,都会调用 接口缓存指令记录。在此处进行状态监控。
- 默认每个指令超时3秒,若超时,则缓存该指定的超时记录状态。
- 设备响应指令时,取出判定超时线程,取消掉。然后缓存失败或是成功状态。
# 页面部分
待下发指令
指令记录
上次更新: 2023/03/02, 15:42:46