欢迎光临散文网 会员登陆 & 注册

利用消息队列遥测传输的PC与开发板的控制交互

2023-04-19 00:44 作者:17投47中  | 我要投稿

消息队列遥测传输即MQTT,这是广泛应用于物联网领域的一种基于发布-订阅范式的消息协议。关于该协议的理论有较多的资料阐述解释,可以广泛参考借鉴,我们重点聚焦如何应用。现在给出一个很简单的场景,要通过PC监测一个嵌入式设备上芯片的温度,当温度处于正常范围时PC控制设备上的指示灯不亮,温度过高时控制其长亮,温度过低时控制使其闪烁。由于测试环境下无法真实模拟这样的场景,则将其进一步简化,设备定时给PC报告芯片温度,PC自由控制设备上的LED灯的亮灭闪烁。如何做到?

首先要明白MQTT不是在两个对象之间直接传递消息,而是通过服务器的中转、分发,实现从设备A到设备B的消息传输,这里A和B都是MQTT客户端。其次MQTT的核心思想是“发布、订阅”和“主题”,发布的是属于某个主题的消息,订阅的也是某个主题的消息。简单类比一下,你在淘宝买了件商品,商品的物流信息就是一个“主题”,你作为一个“客户端”“订阅”了这个“主题”。而售卖这个商品的商家是另外一个“客户端”,它负责往这个“主题”上“发布”该商品的物流运输信息。淘宝平台就相当于服务端,它将中转物流运输信息并发送到你手机上,你这个客户端就能收到相关消息了。在此过程中你和商家并未直接联系,而是使用了类似MQTT的机制取得消息。所以针对最开始说的这个场景,应该先确定谁要发什么消息,谁要收什么消息,消息的主题有哪些。显然,我们发现消息一共就两种,一是“芯片温度报告”,这个是设备来发布、PC来订阅,二是“LED状态控制”,设备订阅、PC发布。我们这里用一块以IMX6ULL为核心芯片的开发板来作为设备,它上面自带了一颗可以自由控制的LED。

显然在这个场景中,PC和开发板是两个client,那什么是server?实际上有一些专门作为MQTT server的地址,例如tcp://mq.tongxinmao.com:18830,它还自带了可应用于windows的MQTT桌面客户端,所以PC侧的客户端问题也就解决了。那开发板client如何解决?这就需要我们借助MQTT开源库来开发自己的客户端了。MQTT官网就有适用于多种语言的开源库的源码可供下载使用,我们选择Paho C,下载完经过编译得到将来开发所需的库文件:

我们只实现能够使一个客户端正常工作的基本操作。Paho库提供了一系列可供应用程序调用的API,其中与client相关的必要接口声明在头文件MQTTClient.h中,每个数据结构和接口都配有相当详细的说明描述,基本都是一看便能明白其中的含义。想要使用客户端必须先创建一个MQTTClient对象,其对应的接口如下。其第一个参数就是一个用void*表示的client句柄,第二个参数是服务端的地址,MQTTClient.h规定了它的正确格式,第三个参数是client标识,每个想要连接到server的client必须提供一个独特的标识,如果标识有重复,则server按照同一个client处理。建立client成功后,如果本client要接收消息,则必须设置相关的回调函数,一般最多可以设置三中回调,包括连接丢失callback、接收消息callback及发送消息callback,它们分别用于处理client与server连接断开、收到server分发的消息及成功发送消息的后续动作。对于一个要接收消息的client,设置接收callback必不可少。然后client调用MQTTClient_connect向server发起连接,在调用它之前需要设置连接选项,这个数据结构规定了MQTT消息传输中的关键参数,例如心跳间隔、是否清除会话、是否可靠连接、用户名密码等等。一旦连接成功了,client就可以开始往某个主题发布消息,订阅了该主题的client就会收到,或者订阅某个主题,之后有其它client给相同主题发消息时,这边就可以收到。相关的接口均在头文件中有详细说明。

在本例中,如前所述可以规定PC与开发板交互的消息主题如下:

MQTT规定消息的主题都是字符串形式,PC发布亮灯控制消息到fuyumeng/led_control,正常情况下开发板将收到指令,执行点灯操作。开发板周期性发布当前的芯片温度到fuyumeng/temperature_notify,正常情况下PC的MQTT客户端就会周期性获知芯片温度。LED的控制直接通过操作/sys/class/led目录下设备的属性完成,可实现亮、灭和闪烁。芯片温度则可通过直接读取/sys/class/thermal/thermal_zone0/temp属性值获得。对开发板而言,使其成为一个可用的client的主要配置流程为:

对应于这个流程的开发板client主要代码如下:

主函数中开发板每隔10s读取一次芯片温度并发布,PC理应也以10s为周期收到这个消息。接收回调中根据收到的指令执行相应的LED操作。编译该程序并将可执行文件载入开发板并启动该进程,正常情况下开发板client就已经生效了。PC侧的客户端可以直接使用mq.tongxinmao.com提供的windows客户端exe如下:

点击启用连接到server,然后订阅主题就可以看到exe中持续收到的芯片温度信息了,看时间间隔基本上是10s:

这里收到的数据是原始读数并未进行转换处理。PC侧在接收的同时,可以发送不同的LED命令给开发板,这时可以看到开发板侧进程收到了消息,同时可以看到开发板上的LED按照要求动作:


利用消息队列遥测传输的PC与开发板的控制交互的评论 (共 条)

分享到微博请遵守国家法律