移植MQTT到ubuntu和ARM開發板

1.ARM開發板的移植

安裝openssl

<1>下載openssl:

首先需要移植openssl,因爲編譯mqtt時會用到openssl的lib庫

官方下載網站:https://www.openssl.org/source/

 <2>解壓下載的安裝包,進入解壓後的文件夾:

tar -zxvf openssl-1.0.2l.tar.gz
cd openssl-1.0.2l/

 <3>執行配置:

./config no-asm shared --prefix=$(pwd)/__install

 no-asm:是在交叉編譯過程中不使用匯編代碼代碼加速編譯過程,因爲它的彙編代碼是對arm格式不支持的

 shared :生成動態連接庫

 --prefix :指定make install後生成目錄的路徑,$(pwd)爲當前文件夾

 <4>修改Makefile文件:

CC=/(你的交叉編譯工具鏈的路徑)/arm-2009q3/bin/arm-none-linux-gnueabi-gcc

AR=/(你的交叉編譯工具鏈的路徑)/arm-2009q3/bin/arm-none-linux-gnueabi-ar $(ARFLAGS) r

ARFLAGS=

RANLIB=/(你的交叉編譯工具鏈的路徑)/arm-2009q3/bin/arm-none-linux-gnueabi-ranlib
(即將編譯工具鏈更換成ARM開發板的交叉編譯工具鏈)

CNF_CFLAGS=-pthread

CNF_CXXFLAGS=-std=c++11 -pthread
(即把標誌位中的-m64去掉)

<5>編譯安裝:

make
make install

成功後,在<3>中prefix配置的的文件夾下會有_install的文件夾,其中include爲頭文件,lib爲程序運行中用到的庫
    

交叉編譯mqtt

<1>下載mqtt:

源碼下載:http://mosquitto.org/download/

<2>解壓,進入文件夾:

tar -zxvf mosquitto-1.6.3.tar.gz
cd mosquitto-1.6.3/

<3>修改config.mk文件:

WITH_SRV:=no

WITH_WEBSOCKETS:=no

WITH_DOCS:=no

WITH_UUID:=no

CFLAGS += -l/(前邊openssl安裝的路徑)/openssl-1.1.1c/__install/include/openssl

LDFLAGS += -L/(前邊openssl安裝的路徑)/openssl-1.1.1c/__install/lib -lssl -lcrypto

STRIP?=/(你的交叉編譯工具鏈的路徑)/arm-2009q3/bin/arm-none-linux-gnueabi-strip

(CFLAGS和LDFLAGS分別爲前邊安裝openssl中最後一步提到的,include中的頭文件路徑和lib庫的路徑)

<4>編譯,安裝

make CC=/(你的交叉編譯工具鏈的路徑)/arm-2009q3/bin/arm-none-linux-gnueabi-gcc CXX=/(你的交叉編譯工具鏈的路徑)/arm-2009q3/bin/arm-none-linux-gnueabi-g++

make install

執行成功後,就可以在/usr/local/lib中發現編譯好的文件:libmosquitto.so.1,或在client文件夾中有mqtt發佈訂閱的例程程序,src文件夾中有mqtt的代理broker的例程程序,lib中有庫文件libmosquitto.so.1

在make編譯時,有報錯:../config.h:45: fatal error: openssl/opensslconf.h: No such file or directory,但是到openssl安裝好的openssl-1.1.1c/__install/include/openssl中,發現是有這個文件的,原因是由於頭文件和此處執行的程序不在一個文件夾內,導致程序中找不到頭文件。所以將安裝openssl的include中的頭文件以及lib庫文件,複製到當前文件夾下,就可以正常編譯了。

 

2.ubuntu的安裝:

<1>按上述步驟靈活的將openssl和mqtt安裝好,同樣使用上述的安裝包:

在安裝openssl時,不需要對Makefile文件做任何修改;

安裝mqtt時,只需要對config.mk文件中的CFLAGSLDFLAGS做修改,其他都不需要修改;

最後再編譯的時候,直接make即可,不需要指定編譯工具鏈。

執行成功後,在client文件夾中有mqtt發佈訂閱的例程程序,src文件夾中有mqtt的代理broker的例程程序,lib中有庫文件libmosquitto.so.1

<2>在ubuntu上測試mqtt的例程:

在一個終端中啓動mosquitto服務器(在mosquitto-1.6.3/src文件夾中):

./mosquitto -v

在另一個終端中訂閱消息(如topic)(在client文件夾中,192.168.10.222爲服務器IP地址):

./mosquitto_sub -h 192.168.10.222 -v -t topic

在第三個終端中發佈消息,主題爲topic,內容爲good(在client文件夾中,192.168.10.222爲服務器IP地址):

./mosquitto_pub -h 192.168.10.222 -p 1883 -t topic -m good

或者

mosquitto_pub -d -h "192.168.10.222" -t "v1/devices/me/telemetry" -u "ACCESS_TOKEN" -f "data.json"

-t:發佈或者定義的主題

-m:要發佈的消息

-f:要發佈的文件

-h:服務器IP地址

-p:服務器端口號

就可以在訂閱消息的終端中,看到發佈的消息:主題爲topic,內容爲good或者文件data.json中的內容

<3>若上述過程出現錯誤,如下:

./mosquitto_sub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory

./mosquitto_sub: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

./mosquitto_sub: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

這是因爲程序找不到庫文件的位置,可以參考下一個步驟中的做法,或者修改環境變量,在~/.bashrc文件中添加下句,然後執行

source ~/.bashrc:

export LD_LIBRARY_PATH=~/MQTT_ubuntu/mosquitto-1.6.3/lib:~/MQTT_ubuntu/mosquitto-1.6.3/openssl/lib

冒號前爲libmosquitto.so.1庫所在的位置,冒號後爲libssl.so.1.1libcrypto.so.1.1庫所在的位置

3.在ARM開發板中測試mqtt的例程:

將第1步中,交叉編譯 之後的openssl安裝的文件夾_install下的include文件夾以及lib文件夾,mqtt交叉編譯 之後mosquitto安裝的文件夾中的clientlibsrc文件夾拷貝到ARM開發板中。

首先要保證ubuntu和arm開發板之間能夠ping通。

ubuntu中執行2.2中啓動mosquitto服務器,以及mosquitto_sub訂閱消息的程序命令,在ARM開發板中執行mosquitto_pub發佈消息的程序,就可以看到2.2中一樣的效果

可能也會出現上述2.3的錯誤,這種情況下需要將libmosquitto.so.1libssl.so.1.1libcrypto.so.1.1拷貝到開發板中/usr/lib文件夾下,因爲程序執行會先默認到環境變量的文件路徑中尋找,而/usr/lib即爲環境變量中的一個文件路徑。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章