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文件中的CFLAGS和LDFLAGS做修改,其他都不需要修改;
最後再編譯的時候,直接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.1和libcrypto.so.1.1庫所在的位置
3.在ARM開發板中測試mqtt的例程:
將第1步中,交叉編譯 之後的openssl安裝的文件夾_install下的include文件夾以及lib文件夾,mqtt交叉編譯 之後mosquitto安裝的文件夾中的client、lib、src文件夾拷貝到ARM開發板中。
首先要保證ubuntu和arm開發板之間能夠ping通。
在ubuntu中執行2.2中啓動mosquitto服務器,以及mosquitto_sub訂閱消息的程序命令,在ARM開發板中執行mosquitto_pub發佈消息的程序,就可以看到2.2中一樣的效果
可能也會出現上述2.3的錯誤,這種情況下需要將libmosquitto.so.1、libssl.so.1.1、libcrypto.so.1.1拷貝到開發板中/usr/lib文件夾下,因爲程序執行會先默認到環境變量的文件路徑中尋找,而/usr/lib即爲環境變量中的一個文件路徑。