基于MQTT源码的嵌入式LINUX移植,网上可参看资料几乎没有,估计是用的不多,没什么人弄,又或者
太简单,没人写参考。这里记录下编译与移植过程。大致有三部分,交叉编译openssl、交叉编译MQTT、安装MQTT服务器。
1 交叉编译OPENSSL
因为MQTT用到OPENSSL库,所以编译MQTT的时候要先编译OPENSSL。解压源文件,创建openssl安装目录,配置openssl Makefile编译,安装。CC = arm-fsl-linux-gnueabi-gccAR = arm-fsl-linux-gnueabi-ar RANLIB = arm-fsl-linux-gnueabi-ranlibINSTALLTOP = /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.gzCC = arm-fsl-linux-gnueabi-gcc CFLAGS += -I/home/MQTT/openssl/includeLDFLAGS += -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 /opt3 搭建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 -vmosquitto -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不通外网,所以没成功。