1. 程式人生 > >MQTT原始碼交叉編譯與移植

MQTT原始碼交叉編譯與移植

基於MQTT原始碼的嵌入式LINUX移植,網上可參看資料幾乎沒有,估計是用的不多,沒什麼人弄,又或者
太簡單,沒人寫參考。這裡記錄下編譯與移植過程。大致有三部分,交叉編譯openssl、交叉編譯MQTT、安裝MQTT伺服器。

1 交叉編譯OPENSSL

因為MQTT用到OPENSSL庫,所以編譯MQTT的時候要先編譯OPENSSL。解壓原始檔,建立openssl安裝目錄,配置openssl Makefile編譯,安裝。 CC = arm-fsl-linux-gnueabi-gccAR = arm-fsl-linux-gnueabi-arRANLIB = arm-fsl-linux-gnueabi-ranlibINSTALLTOP = /home/MQTT/opensslOPENSSLDIR = /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

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主機上安裝,不需要交叉編譯,直接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不通外網,所以沒成功。