Mqtt目前在物聯(lián)網(wǎng)行業(yè)的應用比較多,mqtt屬于應用層的一個中間件,這個中間件實現(xiàn)消息的訂閱發(fā)布機制。網(wǎng)上介紹Mqtt的實現(xiàn)原來的比較多,這里不細介紹。其實在我們之前的產(chǎn)品中,自己也開發(fā)的有類似的中間件,除了具有訂閱發(fā)布的功能,還有一對一通信,在Linux系統(tǒng)里實現(xiàn)不同進程間的通信,通信基于TCP、UDP、Unix域套接字。這里要移植Mqtt主要是為了與其他廠家物聯(lián)網(wǎng)產(chǎn)品(傳感器、物聯(lián)網(wǎng)網(wǎng)關、平臺等)對接融合,這里把服務端和客戶端都做移植。
準備工作
這里選用的mosquitto進行移植,mosquitto依賴openssl和uuid,下面是我選用的版本:
1.?mosquitto-2.0.10.tgz
2.?openssl-3.0.7.tgz
3.?libuuid-1.0.3.tar.gz
編譯
1.?編譯libuuid 解壓編譯tar?xvzf?libuuid-1.0.3.tar.gz
./configure?--prefix=/home/workplace/mqtt/uuid/build-hi3536c/install?CC=arm-hisiv500-linux-gcc
正常執(zhí)行完成后,會生成Makefile,然后執(zhí)行:make
make?install
2. 編譯lib 解壓編譯:tar?xvzf?openssl-3.0.7.tar.gz
CC=arm-hisiv500-linux-gcc?./config?no-asm?no-async?shared?--prefix=/home/workplace/hi3536c/openssl/install
正常執(zhí)行完成后,會生成Makefile,然后執(zhí)行:
make
make?install
1.?mosquitto編譯 解壓編譯: ```cpp tar xvzf mosquitto-2.0.10.tar.gz
#我是把以上編譯的uuid和openssl的庫文件拷貝到了交叉編譯器的lib里,所以下面編譯mosquito時,就沒有再加路徑 # make WITH_SRV=no CC=arm-none-linux-gcc CXX=arm-none-linux-g++ LDFLAGS="-lssl -lcrypto -luuid -lm -lpthread -ldl"
正常執(zhí)行完成后,會生成Makefile,然后執(zhí)行:
```bash
make
make?install
編譯問題
可能不同的編譯器會有不同的問題,我這里用的海思的編譯器,有一下錯誤:
1.?對‘pthread_setname_np’未定義的引用
代碼如下:
這個函數(shù)在當前編譯器的庫中不存在,這個可以直接注釋掉,再次編譯就沒問題了。
測試
Windows下安裝的mosquito,直接啟動,用mosquito_sub訂閱,mosquito_pub發(fā)布,看看能不能收到。
啟動訂閱:topic為hello
mosquitto_sub?-h?192.168.1.36?-p?1883?-t?"hello"
發(fā)布消息:
mosquitto_pub?-h?192.168.1.36?-p?1883?-t?"hello"?"test?pub?msg"
訂閱這邊接收到的消息:
mosquitto_sub?-h?127.0.0.1?-p?1883?-t?"hello"
test?pub?msg
test?pub?msg
test?pub?msg