mqttServiceForDevice.ts
文件职责
管理设备 MQTT 消息订阅服务,负责监听发生器、探测器的状态变化和曝光参数更新,将设备消息转换为应用内部事件。
实现方式
通过 mqtt 客户端库连接到 MQTT Broker,订阅多个设备主题,解析消息并通过事件发射器分发到应用各模块。
实现思路
- 连接管理:使用 mqtt.connect 建立与 MQTT Broker 的连接,配置清理会话和超时参数
- 主题订阅:订阅 8 个设备相关主题(发生器状态、探测器状态、KV/MAS/MA/MS 参数、错误列表)
- 消息解析:根据不同主题解析 JSON 消息为 MqttMessage 或 ErrorListMessage 类型
- 状态映射:将设备状态码(0-5)映射为应用内部事件(RAD_OFF、RAD_PREPARE、RAD_READY 等)
- 事件分发:通过 emitter 触发对应事件,通知应用其他模块设备状态变化
- 错误处理:特殊处理设备错误列表消息,遍历错误信息并发出 DEVICE_ERROR 事件
边界
输入边界
- ✅ 接收来自 MQTT Broker 的设备消息
- ✅ 处理发生器和探测器的状态通知
- ✅ 处理曝光参数值更新(KV、MAS、MA、MS)
- ❌ 不接受非 MQTT 来源的设备消息
输出边界
- ✅ 发出设备状态变化事件(GENERATOR_RAD_OFF、ACQUISITION_STARTED 等)
- ✅ 发出曝光参数更新事件(NEW_KV、NEW_MAS、NEW_MA、NEW_MS)
- ✅ 发出设备错误事件(DEVICE_ERROR)
- ❌ 不直接更新 Redux 状态
- ❌ 不触发 API 调用
职责边界
- ✅ 负责 MQTT 连接的建立和断开
- ✅ 负责设备主题的订阅
- ✅ 负责设备消息的解析和事件转换
- ❌ 不负责设备消息的持久化
- ❌ 不负责设备控制指令的发送
- ❌ 不负责事件的具体处理逻辑
涉及概念
MQTT(Message Queuing Telemetry Transport):轻量级的发布/订阅消息传输协议,适用于设备间通信
发生器状态:X 射线发生器的工作状态,包括关闭(0)、准备(1-2)、曝光中(3)、待机(4)等
探测器状态:影像探测器的工作状态,包括准备就绪(4)、采集中(5)等
曝光参数:控制 X 射线剂量的关键参数,包括 KV(千伏)、MAS(毫安秒)、MA(毫安)、MS(毫秒)
事件发射器(EventEmitter):用于应用内部事件通信的发布订阅模式实现
状态码映射:将设备返回的数字状态码转换为语义化的事件名称
错误列表消息:包含多个设备错误信息的消息结构,每个错误包含代码、类型、级别等属性