MQTT源码交叉编译与移植

2019-07-12 16:39发布

基于MQTT源码的嵌入式LINUX移植,网上可参看资料几乎没有,估计是用的不多,没什么人弄,又或者
太简单,没人写参考。这里记录下编译与移植过程。大致有三部分,交叉编译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不通外网,所以没成功。