mosquitto庫(MQTT)移植到ARM


  MQTT(消息隊列遙測傳輸)是ISO 標准(ISO/IEC PRF 20922)下基於發布/訂閱范式的消息協議。它工作在 TCP/IP協議族上,是為硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發布/訂閱型消息協議,為此,它需要一個消息中間件 。

  MQTT是一個基於客戶端-服務器的消息發布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易於實現的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。

 

  MQTT協議是為大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議,它具有以下主要的幾項特性:
1、使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合;
2、對負載內容屏蔽的消息傳輸;
3、使用 TCP/IP 提供網絡連接;
4、有三種消息發布服務質量:
  “至多一次”,消息發布完全依賴底層 TCP/IP 網絡。會發生消息丟失或重復。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。
  “至少一次”,確保消息到達,但消息重復可能會發生。
  “只有一次”,確保消息到達一次。這一級別可用於如下情況,在計費系統中,消息重復或丟失會導致不正確的結果。
5、小型傳輸,開銷很小(固定長度的頭部是 2 字節),協議交換最小化,以降低網絡流量;
6、使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制
(以上摘自百度百科)
 
 
  移植mosquitto庫用於ARM開發板連接平台服務器,上傳數據。移植的mosquitto是1.6.9版本,該版本支持5.0、3.1.1、3.1版本MQTT協議。移植mosquitto庫前,先准備好ARM交叉工具鏈,下載mosquitto源碼、uuid源碼、openssl源碼,mosquitto編庫依賴uuid、openssl庫。
mosquitto源碼下載地址:https://mosquitto.org/files/source/
openssl源碼下載地址:https://www.openssl.org/source/
uuid源碼下載地址:https://sourceforge.net/projects/libuuid/
2020/9/25最新的庫如下圖:
   

 

 

移植mosquitto動態庫開始:

1.在將三個文件放入ubuntu16.04中並解壓后,先移植openssl庫

進入openssl庫解壓后的文件夾openssl-1.1.1g

執行命令配置(xxx為實際的交叉工具鏈路徑、輸出的移植文件)

CC=xxx/xxx/arm-linux-gcc ./config no-asm shared --prefix=xxx/xxx/openssl-1.1.1g-arm openssldir=xxx/xxx/openssl-1.1.1g-arm/ssl --host=arm-linux

或者

 

AR="arm-linux-gnueabi-ar" RANLIB=arm-linux-gnueabi-ranlib  CC=arm-linux-gnueabi-gcc /usr/bin/perl ./configure shared linux-armv4 --prefix=XXX/XXX/openssl-arm

 

 

 

--prefix :指定 make install 后生成目錄的路徑,不修改此項則默認為 OPENSSLDIR
目錄(/usr/local/ssl)。
shared :生成動態連接庫。
no-asm: 是在交叉編譯過程中不使用匯編代碼代碼加速編譯過程,原因是它的匯編代碼是對 arm 格式不支持的
如果 Makefile 中有 -m32 和-m64 就刪掉 -m32 和-m64

make -j8 (8核編譯)

make install 

 

2.移植uuid庫,同樣進入libuuid-1.0.3目錄,執行以下命令:

./configure --prefix=xxx/xxx/libuuid-1.0.3-arm CC=xxx/xxx/arm-linux-gcc --host=arm-linux

make -j8

make install

 

3.移植Mosquitto庫,進入目錄:

make WITH_SRVSRV=no CC=xxx/xxx/arm-linux-gcc CXX=xxx/xxx/arm-linux-gnueabihf-g++ CFLAGS="-I xxx/xxx/openssl-1.1.1g-arm/include -I xxx/xxx/libuuid-1.0.3-arm/include -Ixxx/xxx/openssl-1.1.1g-arm/lib -Ixxx/xxx/libuuid-1.0.3-arm/lib"  LDFLAGS="-L xxx/xxx/openssl-1.1.1g-arm/lib -Lxxx/xxx/libuuid-1.0.3-arm/lib -lssl -lcrypto -luuid"

make DESTDIR=xxx/xxx/mosquitto1.6.9-arm install

至此,所有庫移植完成。

 

 

 將libuuid-1.0.3-arm、openssl-1.1.1g-arm、mosquitto1.6.9-arm文件夾復制到工程中,就可以使用了。libuuid-1.0.3-arm、openssl-1.1.1g-arm中包含有靜態庫與動態庫,但mosquitto1.6.9-arm中只有動態庫。

 

移植mosquitto1.6.9靜態庫以后再研究,先用着。

 

當工具鏈不會自動找到包含路徑時,移植這些庫比較麻煩,需要自己加

LDFLAGS

CFLAGS

CXXFLAGS

例如:編譯mosquitto可以這樣

 make WITH_SRVSRV=no CC=arm-oe-linux-gnueabi-gcc CXX=arm-oe-linux-gnueabi-g++ CFLAGS="-I XXXX/openssourcelib/openssl_install/include -I XXXX/openssourcelib/uuid_install/include -IXXXX/openssourcelib/openssl_install/lib -IXXXX/openssourcelib/uuid_install/lib -Wall -Wundef -finline-functions -finline-limit=64 -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard --sysroot=XXXX/ -I. -IXXXX/include -IXXXX/usr/include -IXXXX/usr/include/ql_lib_utils -IXXXX/usr/include/ql-sdk -Wall -Wundef -finline-functions -finline-limit=64" LDFLAGS="-march=armv7-a -marm -mfpu=neon -mfloat-abi=hard --sysroot=XXXX/ -L. -LXXXX/usr -LXXXX/usr/lib -L XXXX/openssourcelib/openssl_install/lib -LXXXX/openssourcelib/uuid_install/lib -lssl -lcrypto -luuid -lql_sdk -lpthread" CXXFLAGS="-I XXXX/openssourcelib/openssl_install/include -I XXXX/openssourcelib/uuid_install/include -IXXXX/openssourcelib/openssl_install/lib -IXXXX/openssourcelib/uuid_install/lib -Wall -Wundef -finline-functions -finline-limit=64 -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard --sysroot=XXXX/ -I. -IXXXX/include -IXXXX/usr/include -IXXXX/usr/include/ql_lib_utils -IXXXX/usr/include/ql-sdk -Wall -Wundef -finline-functions -finline-limit=64" WITH_CJSON=no
 make DESTDIR=xxx/xxx/mosquitto1.6.9-arm WITH_SRVSRV=no CC=arm-oe-linux-gnueabi-gcc CXX=arm-oe-linux-gnueabi-g++ CFLAGS="-I XXXX/openssourcelib/openssl_install/include -I XXXX/openssourcelib/uuid_install/include -IXXXX/openssourcelib/openssl_install/lib -IXXXX/openssourcelib/uuid_install/lib -Wall -Wundef -finline-functions -finline-limit=64 -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard --sysroot=XXXX/ -I. -IXXXX/include -IXXXX/usr/include -IXXXX/usr/include/ql_lib_utils -IXXXX/usr/include/ql-sdk -Wall -Wundef -finline-functions -finline-limit=64" LDFLAGS="-march=armv7-a -marm -mfpu=neon -mfloat-abi=hard --sysroot=XXXX/ -L. -LXXXX/usr -LXXXX/usr/lib -L XXXX/openssourcelib/openssl_install/lib -LXXXX/openssourcelib/uuid_install/lib -lssl -lcrypto -luuid -lql_sdk -lpthread" CXXFLAGS="-I XXXX/openssourcelib/openssl_install/include -I XXXX/openssourcelib/uuid_install/include -IXXXX/openssourcelib/openssl_install/lib -IXXXX/openssourcelib/uuid_install/lib -Wall -Wundef -finline-functions -finline-limit=64 -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard --sysroot=XXXX/ -I. -IXXXX/include -IXXXX/usr/include -IXXXX/usr/include/ql_lib_utils -IXXXX/usr/include/ql-sdk -Wall -Wundef -finline-functions -finline-limit=64" WITH_CJSON=no install 

編譯libuuid可以這樣

./configure --prefix=XXXXX/openssourcelib/uuid_install CC=XXXXX/arm-oe-linux-gnueabi-gcc CFLAGS="-march=armv7-a -marm -mfpu=neon -mfloat-abi=hard --sysroot=XXXXX -I. -IXXXXX/include -IXXXXX/usr/include -IXXXXX/usr/include/ql_lib_utils -IXXXXX/usr/include/ -Werror -Wall -Wundef -finline-functions -finline-limit=64" LDFLAGS="-march=armv7-a -marm -mfpu=neon -mfloat-abi=hard --sysroot=XXXXX -L. -LXXXXX/usr -LXXXXX/usr/lib  -lpthread" --host=arm-oe-linux-gnueabi

 x86上移植類似。(libcurl移植也是類似,設置--prefix選項就可以)

 

編譯時出現fatal error: cjson/cJSON.h: No such file or directory

sudo apt install libcjson1 libcjson-dev

或者移植源碼

https://sourceforge.net/projects/cjson/files/latest/download

https://github.com/DaveGamble/cJSON


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM