Mosquitto庫依賴libuuid和openssl庫,所以我們在交叉編譯Mosquitto之前需要先交叉編譯他所需要的依賴庫,這裏作者已經把需要的源碼都下載好了,大家可以在這個文檔的目錄下找到。不建議大家下載和我不一致的版本,可能會出問題。
mqtt源碼下載頁:
1. 交叉編譯uuid庫
我們把uuid的源碼拷貝到Ubuntu,作者是拷貝拷貝到了/home/topeet/mqtt下面,如下圖所示:
輸入以下命令,解壓源碼並進入解壓生成的文件夾:
tar -vxf libuuid-1.0.3.tar.gz
如下圖所示:
然後我們在/opt/下創建一個名爲mosquitto-arm的文件夾,命令如下:
mkdir -p /opt/mosquitto-arm
如下圖所示:
配置源碼,我們在解壓生成的uuid庫的文件夾輸入以下命令:
./configure --prefix=/opt/mosquitto-arm/libuuid-1.0.3 CC=arm-none-linux-gnueabi-gcc --host=arm-linux
如下圖所示:
最後,編譯並安裝,命令如下:
make
make install
編譯並安裝成功後會在我們設置/opt/mosquitto-arm下得到一個libuuid的文件夾
2. 交叉編譯openssl庫
解壓壓縮包進進入解壓後的目錄
tar -vxf openssl-1.0.2g.tar.gz
cd openssl-1.0.2g
如下圖所示。作者是放在了/home/topeet/mqtt目錄下
配置編譯參數
setarch i386 ./config no-asm shared --prefix=/opt/mosquitto-arm/openssl/
setarch i386:聲明生成的是32位CPU,如果是64位CPU則去除該部分
--prefix :指定make install後生成目錄的路徑,不修改此項則默認爲OPENSSLDIR目錄(/usr/local/ssl)。
shared :生成動態連接庫。
no-asm: 是在交叉編譯過程中不使用匯編代碼代碼加速編譯過程,原因是它的彙編代碼是對arm格式不支持的
如果Makefile中有 -m32和-m64 就刪掉 -m32和-m64,但是我的Makefile中沒有,就沒管這個。
如下圖所示:
修改openss文件夾下的Makefile裏面的編譯器參數如下
CC= arm-none-linux-gnueabi-gcc
AR= arm-none-linux-gnueabi-ar $(ARFLAGS) r
RANLIB= arm-none-linux-gnueabi-ranlib
NM= arm-none-linux-gnueabi-nm
如下圖所示:
編譯並安裝
make
make install
編譯並安裝成功後會在我們設置/opt/mosquitto-arm下得到一個openssl的文件夾
3.交叉編譯mosquitto
解壓壓縮包進進入解壓後的目錄
tar -vxf mosquitto-1.5.tar.gz
cd mosquitto-1.5
如下圖所示。作者是放在了/home/topeet/mqtt目錄下
編譯源碼
make WITH_SRV=no CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ CFLAGS="-I /opt/mosquitto-arm/openssl/include -I /opt/mosquitto-arm/libuuid-1.0.3/include -I /opt/mosquitto-arm/openssl/lib -I /opt/mosquit/to-arm/libuuid-1.0.3/lib" LDFLAGS="-L /opt/mosquitto-arm/openssl/lib -L /opt/mosquitto-arm/libuuid-1.0.3/lib -lssl -lcrypto -luuid"
注意,如果大家這裏安裝uuid和openssl的庫的時候路徑和我的不一致,要把-I和-L指定的庫和頭文件的路徑修改成自己對應安裝uuid和openssl庫的路徑,否則編譯不過去。
如下圖所示:
編譯成功如下圖所示:
安裝,命令如下
make DESTDIR=/opt/mosquitto-arm/mosquitto-1.5 install
編譯並安裝成功後會在我們設置/opt/mosquitto-arm下得到一個mosquitto-1.5的文件夾
至此,我們mosquitto就已經交叉編譯完成了
4.把mosquitto移植到開發板
在Ubuntu的/home/topeet/下創建一個mqtt-arm的文件夾,如下圖所示:
我們進入我們安裝的mosquitto-1.5目錄下,作者這裏是安裝在了/opt/mosquitto-arm下,如下圖所示:
我們把當前路徑下的/etc/mosquitto/下的mosquitto.conf.example文件拷貝到我們在/home/topeet/下創建一個mqtt-arm的文件夾,命令如下:
cp mosquitto.conf.example /home/topeet/mqtt-arm/
如下圖所示
然後我們返回到mosquitto的安裝目錄,我們進到安裝目錄下mosquitto-1.5/usr/local/bin下面,如下圖所示:
我們把這個目錄下所有文件拷貝到我們在/home/topeet/下創建一個mqtt-arm的文件夾,命令如下:
cp ./* /home/topeet/mqtt-arm/
如下圖所示:
然後我們返回到mosquitto的安裝目錄,我們進到安裝目錄下mosquitto-1.5/usr/local/sbin下面,如下圖所示:
我們把這個目錄下的mosquitto二進制文件拷貝到我們在/home/topeet/下創建一個mqtt-arm的文件夾,命令如下:
然後我們返回到mosquitto的安裝目錄,把libuuid-1.0.3 mosquitto-1.5 openssl這個三個文件夾全部拷貝到我們在/home/topeet/下創建一個mqtt-arm的文件夾,命令如下:
cp -rf libuuid-1.0.3/ mosquitto-1.5/ openssl/ /home/topeet/mqtt-arm
如下圖所示:
然後我們返回到/home/topeet/下面,使用tar命令打包我們創建的mqtt-arm文件,命令如下:
tar -czf mqtt-arm.tar.gz mqtt-arm/
如下圖所示:
我們把這個壓縮包拷貝到開發板的根目錄,這裏以4412開發板爲例,其他開發板操作一致
我們解壓這個壓縮包,並進入到解壓生成的目錄,如下圖所示:
我們把開發板當前目錄下libuuid-1.0.3/ mosquitto-1.5/ openssl/三個文件下的lib下的庫全部放到開發板的/lib下面,命令如下:
cp -rf libuuid-1.0.3/lib/* mosquitto-1.5/usr/local/lib/* openssl/lib/* /lib/
如下圖所示:
我們把當前目錄下mosquitto.conf.example複製一個和他一模一樣名爲mosquitto.conf的文件放在/etc下面,命令如下:
cp mosquitto.conf.example /etc/mosquitto.conf
如下圖所示:
然後我們把剩下的幾個文件全部放在開發板的/bin目錄下,命令如下:
mv mosquitto mosquitto_* /bin
如下圖所示:
然後我們返回到開發板的根目錄,刪掉我們 mqtt-arm.tar.gz的壓縮包和解壓生成的mqtt-arm文件夾就可以了。
5.測試是否移植成功
以開發板作爲服務器,Ubuntu開倆個終端作爲訂閱者和發佈者進行測試
1,我們打開/etc下面的mosquitto.conf文件, 修改裏面的第40行爲 user root 並取消註釋。如下圖所示:
2.使用以下命令啓動開發板的mosquitto服務
mosquitto -d -c /etc/mosquitto.conf
如下圖所示:
查詢是否啓動成功,命令如下:
ps -ef |grep mosquitto
如果成功入下圖所示:
3.使用ping命令ping一下自己的Ubuntu,這裏一定要ping通,否則下面的步驟不成功,命令如下,IP爲自己Ubuntu的ip
ping 192.168.3.34 -c 3
成功ping通如下圖所示:
4.在文檔的第一步,我們就已經在Ubuntu上安裝了mosquitto,所示我們直接打開一個終端,訂閱主題,命令如下:
mosquitto_sub -h 192.168.3.28 -t "mqtt" -v
其中參數-h是指定要連接的MQTT服務器,這裏的192.168.3.28爲開發板的IP,大家要根據自己的IP來設置,-t訂閱主題,此處爲mqtt,所以主題爲mqtt,-v打印更多的調試信息。
如下圖所示:
5.在Ubuntu上打開另一個終端(注意這裏又打開了一個終端),發佈主題,命令如下:
mosquitto_pub -h 192.168.3.28 -t "mqtt" -m "Hello MQTT"
其中參數-h是指定要連接的MQTT服務器,這裏的192.168.3.28爲開發板的IP,大家要根據自己的IP來設置,-t訂閱主題,此處爲mqtt,-m指定消息內容,這裏發送的是
Hello MQTT。
如下圖所示:
通信成功以後,我們會在另一個終端看到我們通過開發板作爲mqtt服務器轉發來的Hello MQTT
信息,如下圖所示: