最近在参加比赛,需要开发一整个嵌入式系统,正好分到我负责做嵌入式这一块的代码。设计书中需要用MQTT协议传输GPS模块,温湿度模块等传感器的数据到MQTT服务器,使得PC端和手机端能够获取这些信息并且显示。
在网站上搜索了许多关于MQTT的资料,发现大多数只有介绍却很少有源代码或者说实际上实现的比较完整的MQTT的协议通信,导致在编写代码时阻碍重重。于是在完成了自己的项目之后打算把自己这段时间的学习到的知识和资料记录下来,供以后需要在嵌入式端使用MQTT协议的人参考
打算分按三个部分来部分来讲,第一自然是MQTT协议的构成,第二是介绍Paho的基于C语言的MQTT开源库,第三是介绍如何将Paho库移植到STM32F103开发板上实现MQTT协议通信
MQTT是什么?
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布,目前最新版本为v3.1.1。MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。
当然,在物联网开发中,MQTT不是唯一的选择,与MQTT互相竞争的协议有XMPP和CoAP协议等,文章末尾会有一个比较和说明。
MQTT是哪一层的协议?
众所周知,TCP/IP参考模型可以分为四层:应用层、传输层、网络层、链路层。TCP和UDP位于传输层,应用层常见的协议有HTTP、FTP、SSH等。MQTT协议运行于TCP之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT。
MQTT通信流程的简单介绍
MQTT客户端通信主要的两个方式,一个是订阅(Subscribe),一个是发布(Publish),简单来说订阅(Subscribe)类似于关注一个公众号一样,任何这个公众号上面发布的内容都会被推送给关注这个公众号的人,订阅了一个主题的客户端就会接收到在此主题上发布的任何消息。发布(Publish)就像是给在公众号上编辑文章推送给关注公众号的的所有用户,发布(Publish)时需要编辑发布的内容,然后还需要选择向拿一个主题发布信息。
同时MQTT协议也需要一个服务端,每一个客户端都需要连接服务端,服务端会存储每一个客户端订阅的主题和发布的消息,以及将需要发布的消息发给订阅者。说起来可能有一点抽象。我们使用MQTT.fx,来熟悉这个过程。
首先打开两个MQTT.fx窗口,然后设置客户端连接到哪一个服务器,即填写Broker Address和端口Broker Port。MQTT官方拥有免费的测试服务器test.mosquitto.org,端口是1883,这里我使用的是自己用阿里云服务器搭建的MQTT服务器。如何搭建MQTT服务器已经有很多大佬写了详细的教程,大家可以去参考。设置好之后点击OK。点击Connect就能连接到服务端。
连接之后可以看到在服务器管理界面可以看到连接至本服务器的两个客户端,接下来我们就可以进行发布/订阅(Publish/Subscribe)
我们在右边这个客户端订阅一个名为/phone/Msg的主题,订阅成功之后如下图:
然后我们用左边这个客户端向/phone/Msg发布一条hello的消息,从下图可以看见右边订阅了该主题的客户端接收到了一条hello的消息:
而左边这个客户端由于没有订阅/phone/Msg这个主题,就没有收到hello这条消息:
当两个客户端都订阅了/phone/Msg这个主题时,双方都会接收到一条hello的消息:
所以发布者可以向任何主题发布消息,不论这个主题是否有订阅者,区别就是有订阅者服务器就会像订阅了该主题的客户端发送这条消息,如果没有订阅者服务器就不会向某一个客户端发送这一条消息。同理客户端也可以订阅任何主题,只要主题命名规范即可。