1 远控需求:
1.1 控制端:
- 能实时感知注册的设备上/下线状态,提供查询接口
- 能广播命令,在线的设备端能收到并同步执行
- 能对指定的在线设备发布命令,设备端能收到并执行
- 能提供环境参数接口,供设备端查询
1.2 设备端:
- 能自检上/下线状态,系统服务状态
- 能向控制端主动汇报运行消息
- 能实时感知包括 版本更新 / 消息通知 / 通讯质量 在内的环境信息
- 能实时接受控制端命令,做出相应动作与结果报告
2 方案:
经过评估与分析,我们将以物联网IoT实现的方式来解决问题,以支持MQTT协议的消息服务器作为中间件解耦,所有的远控命令与交互信息将通过消息服务器分别传递到两端。
2.1 原理说明:
- 每个设备端都有自己的client id
- 当设备端正常连接上MQTT服务器后,服务器会建立对应该client id的临时消息队列,设备端以此订阅控制端提供的各项功能Topics, 解析消息内容,形成执行命令
- MQTT服务器有预设的队列,如: mqtt.devices.status, mqtt.devices.report 等,接收设备消息
2.2 实现说明:
- 消息服务器实现:
Rabbitmq + MQTT plugin,在线设备查询采用redis 集合,并用多进程任务服务器在消息队列中获取上下线信息实现状态同步
- 设备端自检方案:
创建自订阅的Topic,定时发送QoS0消息自检
参考:https://help.aliyun.com/document_detail/101125.html?spm=a2c4g.11186623.2.11.6a292f84ghL1zT
- 设备端上下线方案:
- 上线:连接后,设备端发布上线消息到设备状态Topic(devices.status),消息服务器转发到设备状态队列,由监控进程捕捉并刷新redis 数据集
- 正常下线:设备端发布下线消息到设备状态Topic(devices.status),消息服务器转发到设备状态队列,由监控进程捕捉并刷新redis 数据集
- 异常下线:设置连接参数 LWT(消息遗嘱),当异常中断时,服务器产生下线消息到设备状态队列,由监控进程捕捉并刷新redis 数据集
- 设备端命令执行方案:
- 设备端连接后订阅消息命令Topic, 等待命令消息
- 预定义命令集合类,根据收到的命令实例化并执行
- 设备查询接口方案:
- 提供公共的服务rest api供设备查询