前言
MQTT是一個基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議。MQTT協(xié)議是輕量、簡單、開放和易于實現(xiàn)的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環(huán)境中,如:機器與機器(M2M)通信和物聯(lián)網(wǎng)(IoT)。其在,通過衛(wèi)星鏈路通信傳感器、偶爾撥號的醫(yī)療設(shè)備、智能家居、及一些小型化設(shè)備中已廣泛使用。
一、mosquitto是什么?
Mosquitto實現(xiàn)了消息推送協(xié)議 MQTT v3.1 的開源消息代理軟件,提供輕量級的,支持可發(fā)布/可訂閱的的消息推送模式,使設(shè)備對設(shè)備之間的短消息通信變得簡單,比如現(xiàn)在應(yīng)用廣泛的低功耗傳感器,手機、嵌入式計算機、微型控制器等移動設(shè)備。
二、交叉編譯
交叉編譯之前,先創(chuàng)建一個目錄存放壓縮包和移植所需文件,如mkdir /home/lhq/Tools/embed
。再創(chuàng)建一個存放交叉編譯后生成的文件的目錄,如mkdir /home/lhq/mosquitto
。
1.交叉編譯openssl源碼
在 /home/lhq/mosquitto目錄下創(chuàng)建一個用于存放交叉編譯生成的文件的目錄ssl,mkdir /home/lhq/mosquitto/ssl
wget https://www.openssl.org/source/old/1.0.0/openssl-1.0.0.tar.gz
tar –xvf openssl-1.0.0.tar.gz
cd openssl-1.0.0/
./config no-asm shared --prefix=/home/lhq/mosquitto/ssl
export cross=arm-linux-gnueabihf-
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
–prefix即為剛才創(chuàng)建的安裝目錄。我這里使用的交叉編譯工具鏈為arm-linux-gnueabihf-gcc。
make之后可能會報錯:
原因是arm是32位的,打開vim Makefile
去掉-m64即可。
隨后,
make install
在這里又報了一個錯:
按照上面錯誤提示,刪除sudo rm /usr/bin/pod2man
然后再次make install
可以在安裝目錄看到編譯生成的幾個文件:
2.交叉編譯e2fsprogs源碼
wget https://sourceforge.net/projects/e2fsprogs/files/e2fsprogs/1.41.14/e2fsprogs-1.41.14.tar.gz
tar -xvf e2fsprogs-1.41.14.tar.gz
cd e2fsprogs-1.41.14/
./configure --host=arm-linux-gnueabihf --prefix=/home/lhq/mosquitto/e2fsprogs
make
make install
–prefix為安裝目錄。
可將e2fsprogs源碼包中l(wèi)ib目錄下的uuid文件夾拷入安裝目錄:
cp -rf /home/lhq/Tools/embed/e2fsprogs-1.46.5/lib/uuid /home/lhq/mosquitto/e2fsprogs
3.交叉編譯c-ares源碼
wget https://c-ares.haxx.se/download/c-ares-1.14.0.tar.gz
tar -xvf c-ares-1.14.0.tar.gz
cd c-ares-1.14.0/
./configure --host=arm-linux-gnueabihf --prefix=/home/lhq/mosquitto/ares
make
make install
–prefix為安裝目錄。
在安裝目錄可以看到編譯生成的文件:
4.交叉編譯uuid源碼
wget https://sourceforge.net/projects/libuuid/
tar -xvf libuuid-1.0.3.tar.gz
cd libuuid-1.0.3/
./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --prefix=/home/lhq/mosquitto/libuuid
make
make install
可以看到在安裝目錄下編譯生成的文件:
5.交叉編譯mosquitto源碼
wget https://mosquitto.org/files/source/mosquitto-1.4.8.tar.gz
tar -xvf mosquitto-1.4.8.tar.gz
cd mosquitto-1.4.8/
vim CMakeList.txt
在if(${WITH_TLS} $TREOUAL ON)后面加入:
set(OPENSSL_ROOT_DIR "/home/lhq/mosquitto/ssl")
set(OPENSSL_LIBRARIES "/home/lhq/mosquitto/ssl/lib64/")
路徑為openssl的安裝目錄。
在option(WITH_SRV “Include SRV lookup support?” ON)后面加入:
# Simple detect uuid
set(CMAKE_INCLUDE_PATH /home/lhq/mosquitto/e2fsprogs)
set(CMAKE_LIBRARY_PATH /home/lhq/mosquitto/e2fsprogs/uuid)
find_path(UUID_HEADER NAMES uuid/uuid.h)
if (UUID_HEADER)
include_directories(${UUID_HEADER})
message(STATUS "found uuid/uuid.h at:${UUID_HEADER}")
find_library(UUID_LIBRARY NAMES uuid)
if (UUID_LIBRARY)
message(STATUS "found libuuid at:${UUID_LIBRARY}")
set (LIBRARIES ${LIBRARIES} ${UUID_LIBRARY})
else(UUID_LIBRARY)
message(FATAL_ERROR "uuid library not found!" )
endif (UUID_LIBRARY)
else (UUID_HEADER)
message(WARNING "uuid library not found.")
endif (UUID_HEADER)
路徑為e2fsprogs和uuid的安裝目錄。
然后到mosquitto源碼lib目錄下,vim CMakeLists.txt
,將第55-63行改為如下:
# Simple detect c-ares
find_path(ARES_HEADER ares.h /home/lhq/mosquitto/ares/include)
if (ARES_HEADER)
add_definitions("-DWITH_SRV")
include_directories(${ARES_HEADER})
message(STATUS "found ares.h at:${ARES_HEADER}")
find_library(ARES_LIBRARY cares /home/lhq/mosquitto/ares/lib)
if (ARES_LIBRARY)
message(STATUS "found libcares at:${ARES_LIBRARY}")
set (LIBRARIES ${LIBRARIES} ${ARES_LIBRARY})
else(ARES_LIBRARY)
message(FATAL_ERROR "not found libcares" )
endif (ARES_LIBRARY)
else (ARES_HEADER)
message(WARNING "c-ares library not found.")
endif (ARES_HEADER)
endif (${WITH_SRV} STREQUAL ON)
返回mosquitto源碼根目錄,在終端執(zhí)行:
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt
識別到了Ubuntu x86系統(tǒng)的openssl路徑。
這里需修改為剛才交叉編譯出來的路徑:vim CMakeCache.txt
,改為如下內(nèi)容:
再次執(zhí)行
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt
已經(jīng)識別到剛才交叉編譯出來的openssl路徑。
接下來再:
make
make install
這里沒必要sudo make
和sudo make install
,加上sudo而修改環(huán)境變量就得不償失了。
進入mosquitto安裝目錄查看,
6.將編譯得到的文件拷貝到開發(fā)板執(zhí)行
在開發(fā)板/usr
目錄下分別創(chuàng)建ssl、uuid、mqtt、ares、e2fsprogs文件夾,將交叉編譯得到的文件分別拷入新建的目錄下,可通過nfs掛載。
拷貝成功后再配置開發(fā)板環(huán)境變量,vim /etc/profile
#mqtt start
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/ssl/lib64
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/uuid/lib
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/mqtt/lib
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/ares/lib
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/e2fsprogs/lib
export PATH=$PATH:/usr/ssl/bin
export PATH=$PATH:/usr/mqtt/bin
export PATH=$PATH:/usr/mqtt/sbin
export PATH=$PATH:/usr/e2fsprogs/bin
export PATH=$PATH:/usr/e2fsprogs/sbin
#mqtt end
之后,再source /etc/profile使環(huán)境變量生效。
再進入/usr/mqtt/bin
,給mosquitto_pub、mosquitto_sub、mosquitto_passwd;/usr/mqtt/sbin
,給mosquitto賦可執(zhí)行權(quán)限。
6.1測試
mosquitto_sub -t test
,再打開一個終端,mosquitto_pub -t test -m "hello world"
??梢钥吹?,訂閱和發(fā)布都能成功。
6.2錯誤解決
如果網(wǎng)絡(luò)已經(jīng)連通,出現(xiàn)如下錯誤,可這樣考慮解決:
執(zhí)行:
mosquitto -c /usr/mqtt/etc/mosquitto/mosquitto.conf
再執(zhí)行訂閱和發(fā)布即可。文章來源:http://www.zghlxwxcb.cn/news/detail-463898.html
如果執(zhí)行mosquitto -c /usr/mqtt/etc/mosquitto/mosquitto.conf
時出現(xiàn)如下錯誤:
1672122706:Error:Invalid user ‘mosquitto’
可將上面的mosquitto.conf文件的#user mosquitto下加上user root
。
或者adduser mosquitto
新增一個普通用戶,再執(zhí)行。文章來源地址http://www.zghlxwxcb.cn/news/detail-463898.html
到了這里,關(guān)于MQTT協(xié)議版本Mosquitto移植到嵌入式arm平臺的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!