[HI3516DV300開發筆記]嵌入式linux下MQTT移植

最近......算了幹筆者這行的就是一塊磚,哪裏缺往哪墊。

簡單說就是要往一款產品上用MQTT,而目前產品的開發板還沒拿到,所以先在現有的HI3516DV300上移植一個MQTT和服務器聯動起來

所以真的是標題黨,和人家HI3516沒啥關係


本章目標:

<1>在windows主機上搭建MQTT服務器方便調試等

<2>移植MQTT到HI3516開發板

<3>開發板與windows主機進行MQTT通訊


目標<1>:在windows主機上搭建MQTT服務器

筆者的虛擬機訪問起來不方便,爲了進行MQTT通訊的驗證,將MQTT的服務器搭建在windows上

相關的博客內容網上比較多,但還是記錄一下懶得下次再去找:

<1> 在 https://downloads.apache.org/ 下載 apache-artemis-2.11.0-bin.zip;找個合適的位置解壓即可,路徑不要帶中文

例如我解壓的路徑是:G:\mqtt server\apache-artemis-2.11.0

<2> 在dos下進入解壓的路徑,用紅框部分的命令創建自己的MQTT服務器實例,我放在了E:\mqtt_server_1下

創建過程中,需要輸入賬號&密碼&是否允許匿名訪問:

<3> 進入目錄E:\mqtt_server_1,執行artemis run啓動MQTT服務器:

 

啓動成功提示:

打開瀏覽器輸入地址:http://local:8161/console/login可以登錄到HTTP的界面

dos窗口在服務器運行期間不能關閉

<4>下載個MQTT客戶端工具,例如mqtt.fx,可以測試與MQTT服務器進行訂閱發佈等操作測試:


目標<2>:移植MQTT到HI3516開發板

這些內容網絡上也有,然而爲了防止以後找不到,還是記錄一下,勤快一次可以懶無數次

<0> 當前筆者的開發板的編譯工具路徑/opt/hisi-linux/x86-arm/arm-himix200-linux/

 

<1> 交叉編譯openSSL,過程:

①下載源碼到虛擬機編譯環境:https://www.openssl.org/source/

②解壓:tar -xvzf openssl-1.1.1f.tar.gz  ; cd openssl-1.1.1f

③配置:./config no-asm shared --prefix=/opt/com/openssl

注意:有博主把安裝目錄放在 $(pwd)/__install 也就是openssl的源碼目錄下,但是後面編譯mosquitto會不方便,

因此筆者放到了/opt/openssl,當然也可以放到編譯工具路徑下

④修改Makefile

筆者的編譯工具路徑是:/opt/hisi-linux/x86-arm/arm-himix200-linux/,因此:

CROSS_COMPILE=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-

並將 CNF_CFLAGS CNF_CXXFLAGS後的-m64去掉

保存Makefile & make & make install

⑤編譯完成後,筆者的路徑/opt/com/openssl下了openssl相關的頭文件,動態庫等;

 

<2>  交叉編譯mosquitto

①下載源碼到虛擬機編譯環境:http://mosquitto.org/download/

②解壓:tar -xvzf mosquitto-1.6.9.tar.gz; cd mosquitto-1.6.9/

③修改config.mk

WITH_SRV:=no;WITH_WEBSOCKETS:=no;WITH_DOCS:=no;

上一步生成的openssl文件在路徑/opt/com/openssl/,因此:

CFLAGS+=-I/opt/com/openssl/include/

LDFLAGS+=-L/opt/com/openssl/lib -lssl -lcrypto (注意:+=與“CFLAGS”“LDFLAGS”之間不要有空格)

根據筆者的交叉編譯路徑,修改STRIP

STRIP?=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gnueabi-strip

④ 編譯

根據交叉編譯路徑,執行

make CC=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gcc CXX=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-g++

編譯完成之後 make install

 

<3>  拷貝相關交叉編譯後的文件到開發板

將以下文件從編譯完成的openssl以及mosquitto文件夾下找到,拷貝到開發板

 

其中openssl的lib下的庫文件拷貝到HI3516開發板的/lib路徑下

mqtt的libmosquitto.so.1拷貝到HI3516開發板的/lib路徑下

剩餘的 mosquitto_pub mosquitto_rr mosquitto_sub mosquitto mosquitto_passwd等文件是可執行文件,將在下一步用於與windows上的MQTT服務器通訊

至此,移植完畢


目標<3>:開發板與windows主機進行MQTT通訊

到目前爲止,windows主機的MQTT服務器已經運行起來;而開發板上也有了mqtt的幾個demo執行文件,可以隨手做幾個測試:

<0> 筆者的開發板IP 10.168.1.200 windows主機IP 10.168.1.65

<1> 開發板作爲MQTT代理broker,由mqtt.fx向代理髮布與訂閱消息

在開發板運行:useradd mosquitto (需要新建一個用戶,否則無法運行)

./mosquitto -v & (開始運行mosquitto代理在後臺),開發板提示監聽1883端口,所以若是有其它進程佔用1883請kill掉:

在windows下修改地址與端口,連接開發板的MQTT,並subscribe一條信息“123456”:

開發板提示:

mqtt.fx轉到publish界面,隨便publish點啥:

開發板提示:

 

<2> windows下的MQTT服務器作爲代理,開發板發佈消息,mqtt.fx訂閱消息

直接使用mosquitto_pub失敗,提示:

跟了下代碼,在 mosquitto lib下的util__random_bytes函數執行失敗,看來是一個生成隨機數的接口,根據配置不同調用不同方式,強制改爲最屌絲的random方式,重新編譯生成libmosquitto.so.1,替換開發板上的相同文件;

再次從開發板向windows服務器發佈消息:主題“board_msg” 負載 “20200421/17:XX”:

服務器的message count增加:

mqtt.fx訂閱服務器消息,可以看到有消息接收到:

暫時可以用了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章