MQTT(消息隊列遙測傳輸)是ISO 標准(ISO/IEC PRF 20922)下基於發布/訂閱范式的消息協議。它工作在 TCP/IP協議族上,是為硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發布/訂閱型消息協議,為此,它需要一個消息中間件 。
MQTT是一個基於客戶端-服務器的消息發布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易於實現的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。



移植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
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