MQTT源码交叉编译与移植

祁英哲
2023-12-01

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件

通过MQTT协议,目前已经扩展出了数十个MQTT服务器端程序,可以通过PHP,JAVA,Python,C,C#等系统语言来向MQTT发送相关消息。

此外,国内很多企业都广泛使用MQTT作为Android手机客户端与服务器端推送消息的协议。其中Sohu,Cmstop手机客户端中均有使用到MQTT作为消息推送消息。据Cmstop主要负责消息推送的高级研发工程师李文凯称,随着移动互联网的发展,MQTT由于开放源代码,耗电量小等特点,将会在移动消息推送领域会有更多的贡献,在物联网领域,传感器与服务器的通信,信息的收集,MQTT都可以作为考虑的方案之一。在未来MQTT会进入到我们生活的各各方面。

MQTT特点

编辑

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;

2、对负载内容屏蔽的消息传输;

3、使用 TCP/IP 提供网络连接;

4、有三种消息发布服务质量:

    • “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

    • “至少一次”,确保消息到达,但消息重复可能会发生。

    • “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。 [1] 

如果需要下载MQTT服务器端,可以直接去MQTT官方网站点击software进行下载MQTT协议衍生出来的各个不同版本。

这里记录下编译与移植过程。大致有三部分,交叉编译openssl、交叉编译MQTT、安装MQTT服务器。

1 交叉编译OPENSSL

因为MQTT用到OPENSSL库,所以编译MQTT的时候要先编译OPENSSL。解压源文件,创建openssl安装目录,配置openssl Makefile编译,安装。

CC = arm-fsl-linux-gnueabi-gcc AR = arm-fsl-linux-gnueabi-ar RANLIB = arm-fsl-linux-gnueabi-ranlib INSTALLTOP = /home/MQTT/openssl OPENSSLDIR = /home/MQTT/openssl

$ tar zxvf openssl-0.9.8e.tar.gz
$ cd openssl-0.9.8e
$ mkdir /home/QMTT/openssl
$ gedit Makefile
$ make
$ make install

编译无误会在openssl目录下生成头文件,库文件等,编译MQTT的时候,指定这个头文件库文件路径即可

 

2 交叉编译MQTT

下载源码,解压,修改Makefile,交叉编译http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.c.git/snapshot/org.eclipse.paho.mqtt.c-1.0.3.tar.gz

CC = arm-fsl-linux-gnueabi-gcc CFLAGS += -I/home/MQTT/openssl/include LDFLAGS += -L/home/MQTT/openssl/lib

$ tar -jxvf eclipse-paho-mqtt-unix-1.0.3.tar.bz
$ cd org.eclipse.paho.mqtt.c-1.0.3
$ gedit Makefile 
$ make

CFLAGS LDFLAGS是指定openssl库路径,不指定的话编译器会提示找不到ssl库,make完成后会在build目录下生成MQTT动态库文件及一些应用的例子可执行文件,可以用于测试。把目录下libxx.so.xx复制到目标板/usr/lib目录下,把/build/output/sample 可执行文件复制到目标板/opt目录用于测试。

# mount -t nfs -o nolock 192.168.1.110:/home/zhu /mnt
# cd /mnt/zhu/build
# cp /output lib* /usr/lib
# cp -rf /output/sample /opt

 

3 搭建MQTT服务器,测试

Linux下搭建mosquitto服务器,参考教程http://blog.csdn.net/xukai871105/article/details/39252653

下载源码http://eclipse.stu.edu.tw/mosquitto/source/mosquitto-1.4.8.tar.gz

在linux主机上安装,不需要交叉编译,直接make,make install即可,提示找不到.h文件的时候,安装相应库文件即可。安装完成后还要修改下配置文件,增加mosquitto用户。

$cp /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf
$useradd mosquitto
$mosquitto -v

mosquitto -v打开mosquitto服务,真确打开,终端会显示

1455613844: mosquitto version 1.4.8 (build date 2016-02-16 12:47:49+0800) starting
1455613844: Using default config.
1455613844: Opening ipv4 listen socket on port 1883.
1455613844: Opening ipv6 listen socket on port 1883.
1455613856: New connection from 192.168.1.136 on port 1883.

 

目标板上运行可执行文件测试

#./opt/sample/subasync

正确的话开发板终端会显示:

Waiting for publication of Hello World!
on topic MQTT Examples for client with ClientID: ExampleClientPub
Message with token value 1 delivery confirmed

linux主机终端显示:

1455613856: New client connected from 192.168.1.136 as ExampleClientSub (c1, k20).
1455613856: Sending CONNACK to ExampleClientSub (0, 0)
1455613856: Received SUBSCRIBE from ExampleClientSub
1455613856: 	MQTT Examples (QoS 1)
1455613856: ExampleClientSub 1 MQTT Examples
1455613856: Sending SUBACK to ExampleClientSub

出现无法连接错误,可能是由于mosquitto服务没有开启,或者是应用程序的IP地址不是mosquitto服务端的IP地址。修改相应文件的代码即可,以subasync.c为例,修改

#define ADDRESS     "tcp://localhost:1883"为 #define ADDRESS     "tcp://192.168.1.110:1883"

192.168.1.110为mosquitto服务端IP地址。

 

注:也可以直接运行MQTTAsync_publish文件而不搭建mosquitto服务器,MQTTAsync_publish文件直接从m2m.eclipse.org服务器获取数据,这里开发板ping不通外网,所以没成功。

 类似资料: