MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,该传输协议具有轻量、简单、开放和易于实现的特点,可以用极少的代码和有限的带宽,为远程连接的设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有着十分广泛的应用。


主流的MQTT协议,其底层是基于TCP/IP连接,通过客户端和服务器的方式,来进行数据传输的。在MQTT协议里面,主要涉及三种角色:消息发布者(Publish),消息订阅者(Subscribe),消息代理服务器(Broker)。


消息发布者和消息订阅者都是客户端角色,而消息代理是服务器角色,对于一台通过MQTT协议接入消息代理服务器的设备,它可以同时作为消息的发布者和消息的订阅者。


MQTT在传输消息的时候,一个消息通常包含主题(Topic)和负载(Payload),有点类似key-value的关系,主题Topic可以理解为消息的类型,当订阅者订阅了该主题后,一旦有发布者发布该主题的消息,订阅者就会收到该消息的负载内容(Payload)。


关于MQTT具体的实现原理和协议详解,此处不作分析,感兴趣的读者可以在网上搜索各种分析资料。本篇文章旨在imx6ull开发板上,实现一个MQTT客户端,让各种开发板实现互联互通。


基于Qt5实现的MQTT协议,除了使用Qt官方提供的MQTT封装以外,也可以使用第三方公司提供的针对MQTT的封装接口,可以通过以下链接下载第三方MQTT客户端的Qt源码。https://github.com/emqx/qmqtt


下载好源码后,把源码上传到ubuntu中并解压,解压后的源码,如下图所示。


本次实验使用的是imx6ull开发板,其他开发板也可作为参考,在开始之前,需要先根据开发板的使用手册,搭建好Qt的开发环境,安装好对应的编译器,并且编译出来的Qt5应用程序可以在开发板正常运行。


1.在解压出来的文件中,使用Qt-Creator打开qmqtt.pro文件,打开后的工程可以使用imx6ull的交叉编译器进行编译,对于examples和tests文件夹,我们暂时不需要用到,我们只需要用到src文件夹里面的代码。对src文件夹执行qmake和编译操作,如下图所示。


2.编译完成后,在构建目录里面可以生成include文件夹和lib文件夹,这两个文件夹主要是供我们自己编写MQTT客户端源码时使用的,include目录主要是头文件,lib文件夹是动态库,程序编译时需要用到,如下图所示。


3.为了项目管理方便,我们把include和lib目录单独提取出来,保存到lib_qmqtt文件夹里面,并把lib目录里面的动态库文件libQt5Qmqtt相关文件,复制到开发板的/usr/lib目录下,因为客户端程序在开发板运行时,需要这些动态库进行支持,如下图所示。


4.使用Qt-Designer软件,设计好MQTT的客户端应用程序界面,包括MQTT代理服务器的IP地址和端口,该客户端程序发布的主题和订阅的主题,消息内容的显示窗口,等等,如下图所示


5.把lib_qmqtt文件夹复制到100ask_imx6ull_app工程目录下,我们在page3_widget.cpp和page3_widget.h文件里面编写MQTT客户端代码,在Page3_Widget的构造函数里面,先连接各种按钮的信号槽,然后实例化一个mqtt客户端对象,实例化成功后,连接mqtt的信号槽函数,源码实现如下图所示。


6.当按下【连接MQTT服务器】按钮,程序会根据当前的连接状态进行判断,是否应该进行连接或断链操作,按钮的槽函数实现如下图所示。


7.当客户端程序跟MQTT代理服务器连接成功或连接断开后,底层会发出事件信号,相应的槽函数会被调用,具体的实现代码,如下图所示。


8.在订阅主题的输入框内,填写需要订阅的主题,然后点击【开始订阅】按钮,客户端应该程序就可以成功订阅该主题,主题订阅的实现代码,如下图所示。


9.当一个主题被客户端订阅成功后,就可以进行主题消息的接收。一旦代理服务器收到其他客户端关于该主题的发布消息,MQTT的消息接收函数就会被调用,客户端会在界面上打印出接收到的主题和消息,如下图所示。


10.当客户端需要发布主题和消息的时候,可以在界面输入要发布的主题和消息,然后点击【发布】按钮,就可以把该主题和消息内容发布到代理服务器,主题发布的实现,如下图所示。


11.为了测试MQTT客户端的运行情况,我们需要在ubuntu下安装mosquitto这个MQTT代理服务器,安装比较简单,可以在网上查找该代理服务器的安装方法。与此同时,我们在windows下使用MQTT.fx作为另一个MQTT客户端,与开发板的客户端进行通信,MQTT.fx的界面,如下图所示。


12.使用MQTT.fx和我们自己编写的应用程序作为客户端,mosquitto作为代理服务器,就可以让开发板跟windows上的MQTT.fx进行消息通信了。


项目的开源地址:

https://github.com/embediot/Embedded-IoT-Project

https://gitee.com/embediot/Embedded-IoT-Project


#嘉立创PCB##PCB有什么好玩的##嘉立创##DIY设计#

#嘉立创PCB#
#PCB有什么好玩的#
#嘉立创#
#DIY设计#

还没有评论,抢个沙发!