亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial Internet of Things >> 嵌入式

为响应式嵌入式系统构建非阻塞MQTT客户端

MQTT-Reactive是构建于LiamBindle MQTT-C库之上的轻量级、非阻塞MQTT v3.1.1客户端。专为响应式嵌入式系统设计,提供可移植、事件驱动通信栈,可集成进任何C基础应用。

本文先定义何为响应式系统,再勾勒拥抱并发和基于状态行为的软件架构。最后通过具体案例——铁路公司物联网设备——演示如何通过状态机和事件驱动范式使用MQTT-Reactive。

响应式系统响应内部或外部事件、处理事件、返回空闲状态等待下一触发。此事件驱动范式产出可预测、可维护代码,尤其当多个活动对象(并发单元)处理不同事件流时。

案例研究设备执行以下任务:

  1. 检测记录数字输入变化
  2. 采集、滤波、存储多路模拟信号
  3. 定期向远程服务器传输存储数据
  4. 通过GSM用MQTT与代理交换数据

选择MQTT因其轻量发布/订阅模型,适合低带宽、高延迟链路如GSM。

因设备固件构建为响应式系统,原始MQTT-C库需改造以异步事件方式通信。结果库——MQTT-Reactive——暴露整洁API,可从状态机调用同时保持系统其余部分解耦。

状态机

MQTT-Reactive由MqttMgr活动对象驱动,其行为见图1状态机描述。机器始于WaitingForNetConnection;网络链路可用后迁移至WaitingForSync,可暂存CONNECT和PUBLISH包。在Sync到达的事件延迟至系统重入接受事件状态。

每SyncTime毫秒机器移至Sync复合状态,向网络管理器发布Receive和Send事件。虽示例仅覆盖CONNECT和PUBLISH,扩展支持SUBSCRIBE直截了当。

状态机动作用params关键字读取事件数据、用GEN()宏生成外发事件。例如:

Connect(clientId, keepAlive)/ me->clientId = params->clientId; me->keepAlive = params->keepAlive; me->operRes = mqtt_connect(&me->client, me->clientId, NULL, NULL, 0, NULL, NULL, 0, me->keepAlive);

此迁移中,Connect事件携带clientId和keepAlive参数应用到MqttMgr对象属性。同样,事件分发给其他参与者通过:

GEN(me->itsCollector, Receive());

默认动作设置回调,MQTT-Reactive在代理确认CONNECT时调用。回调必须生成ConnAccepted或ConnRefused事件:

static void connack_response_callback(enum MQTTConnackReturnCode return_code) { if (return_code == MQTT_CONNACK_ACCEPTED) { GEN(me->itsCollector, ConnAccepted()); } else { GEN(me->itsCollector, ConnRefused(return_code)); } }

为响应式嵌入式系统构建非阻塞MQTT客户端

图1. MQTT-Reactive客户端状态机(来源:VortexMakes)

模型实现

状态机可用以下任意工具用纯C或C++编码:RKH框架、QP框架、Yakindu Statechart Tool、Rational Rhapsody Developer。均支持Statecharts和C/C++代码生成。

MqttMgr活动对象封装所有MQTT-Reactive调用,屏蔽系统其余部分直接API使用。并发通过交换事件实现,消除信号量、互斥锁、延迟、事件标志等陷阱。

MqttMgr属性直接存储于其结构体,如:

struct MqttMgr { struct mqtt_client client; // MQTT客户端实例 LocalRecvAll localRecv; // 本地接收缓冲区 /* 附加数据项 */ };

这些成员通过me指针访问:

mqtt_recvMsgError(&me->client, &me->localRecv);

为响应式嵌入式系统构建非阻塞MQTT客户端

表1. MqttMgr属性

整体系统含三关键参与者:Collector(发布数据)、NetMgr(管理网络)、MqttMgr(管理MQTT)。

为响应式嵌入式系统构建非阻塞MQTT客户端

图2. 物联网系统结构草图(来源:VortexMakes)

图3序列图演示MqttMgr与MQTT代理发起会话流程。

为响应式嵌入式系统构建非阻塞MQTT客户端

图3. 连接MQTT代理(来源:VortexMakes)

网络建立成功后,Collector发送Connect(clientId, keepAlive)给MqttMgr。代理可能回复ConnAccepted或ConnRefused,后者按MQTT v3.1.1 §3.2.2.3携带拒绝码。

为响应式嵌入式系统构建非阻塞MQTT客户端

图4. 代理拒绝连接请求(来源:VortexMakes)

发布遵循类似模式。Collector发布Publish(data, size, topic, qos)事件。数据载荷典型为JSON,用轻量jWrite库组装。

为响应式嵌入式系统构建非阻塞MQTT客户端

图5. 向代理发布数据(来源:VortexMakes)

网络故障由NetMgr通过ReceiveFail或SendFail事件信号,使MqttMgr相应反应。

为响应式嵌入式系统构建非阻塞MQTT客户端

图6. 网络故障(来源:VortexMakes)

为响应式嵌入式系统构建非阻塞MQTT客户端

表2. 场景涉及事件

结论

将MQTT-Reactive封装于活动对象、通过事件编排通信,该方法消除阻塞构造,产出整洁、可测试设计。状态机模型扩展至多并发任务,极适合需可靠MQTT连接的现代响应式嵌入式应用。

嵌入式

  1. 利用 Azure IoT Edge 模块孪生实现电路状态管理
  2. 制造商必知的10大自动化工作流
  3. IC技术与微控制器:现代嵌入式系统的基石
  4. VE-VIDES倡议发布值得信赖的IoT安全设计与验证框架
  5. Würth Elektronik eiSos 在 Embedded World 展示面向智能系统的尖端元器件
  6. 为先进机器人系统打造精准电机控制
  7. Syslogic:面向工程机械的坚固型计算机与 HMI 系统
  8. SAFe-VX:Kontron 与 SYSGO 统一安全关键铁路计算平台
  9. 工业物联网系统实用分类法:基于量化指标的架构决策框架
  10. 面向工业4.0的自适应制造系统设计:利用IIoT与RTI Connext
  11. RTLS 顺利落地的六大实证策略
  12. 五年期限:加速企业智能系统采用