工具/软件:TI-RTOS
尊敬的社区:
我有以下问题、我想通过某种方式解决。 (RTOS 是最新的、器件是 EK-TM4C129EXL)
UC 有不同的线程、用于处理 ADC 和其他 IO 端口管理。 生成数据的 ADC 和 IO 正在接收来自外部世界的工作。 为了与器件 MQTT 协议进行交互、最新版本选择了 MQTT 协议、但在前一版本中、我使用了一个标准 TCP/IP 协议、该协议具有自定义数据包格式。 我要处理的问题是如何管理与线程间通信的网络通信、而不会在邮箱上等待大量时间或阻止套接字操作。
在上一个设计中、我共享了一个连接的插座、在两个任务中、一个用于读取、另一个用于发送数据。 模型如下所示:
socketReaderThread{ //阻止套接字读取操作 int count = recv (sharedSocket、...、...); //根据请求代码 Mailbox_post (myTaskMailbox、request、BIOS_wait_forever)将请求发送到正确的任务; } socketTaskThread{ //等待任何任务 Response Mailbox_pend...(myTaskMailbox、Response、Response、forever、BIOS_wait...);send = forever… ………
上述解决方案具有巨大优势、我可以在消息发生时立即发送和接收消息。
现在我想更新 MQTT 的通信 、我已经将 PAHO C 示例代码(MQTTPacket)移植到 TI RTOS、这是我的问题:
while (1){ //等待任务响应、并处理 BIOS_no_wait if (Mailbox_pend (myTaskMailbox、mbResponse、BIOS_no_wait)){ MQTT_PUB (套接字、mbResponse、...) } //此调用会阻止整个任务 MQTT_SUB (socket、sub_buffer、...); }
在上面的代码中、MQTT_SUB 根据 SO_RCVTIMEO 参数阻止整个任务。 根据我的理解、SO_RCVTIMEO 的值应该足够大、以便等待我的 pub 请求的 pub_ACK。 (处理网络不确定性)、但1秒对于阻止我的整个任务来说是非常长的时间。
如何在 MQTT_SUB 上实现这一点不会阻止这么长的时间?
我不认为更改 SO_RCVTIMEO 是我的问题的关键...
期待您的回复。
PS.:我实施了一个解决方案,其中 UC 使2 MQTT 客户端连接一个用于发布,另一个用于订阅。 这种方法非常有效、但此模型会导致两个 MQTT 客户端具有重复的身份验证、client_id、并在物联网平台中显示为两个器件。
更新了:我认为针对 TM4C 的 MQTT 的非阻塞实现是最好的。 但是、正如我看到的、没有任何一个。