MQTT源码交叉编译与移植

来源:互联网 发布:网络音乐播放器hifi 编辑:程序博客网 时间:2024/06/05 19:46
基于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.gz

CC = 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 /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) starting1455613844: 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: ExampleClientPubMessage 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 ExampleClientSub1455613856: MQTT Examples (QoS 1)1455613856: ExampleClientSub 1 MQTT Examples1455613856: 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不通外网,所以没成功。
原创粉丝点击