最近......算了幹筆者這行的就是一塊磚,哪裏缺往哪墊。
簡單說就是要往一款產品上用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訂閱服務器消息,可以看到有消息接收到:
暫時可以用了