上一篇文章,我們詳細(xì)地描述了如何在嵌入式Linux開發(fā)平臺上移植libmodbus庫,實現(xiàn)了通過Modbus協(xié)議采集設(shè)備端數(shù)據(jù),可以點擊以下鏈接對文章進(jìn)行回顧。嵌入式Linux工業(yè)網(wǎng)關(guān)設(shè)計,離不開這個關(guān)鍵核心通信模塊。
除了Modbus通信協(xié)議之外,在網(wǎng)關(guān)產(chǎn)品上面還有一個非常重要的通信協(xié)議,那就是MQTT。
關(guān)于MQTT的概念,網(wǎng)上已經(jīng)有比較多的文章,此處就不再重復(fù)論述,本篇文章的主要目的,是在嵌入式Linux平臺上移植部署MQTT通信庫,并且實現(xiàn)數(shù)據(jù)端的南北向通信。
(南北向通信,南向一般是指通過Modbus對接獲取設(shè)備數(shù)據(jù),北向一般是指通過MQTT上報數(shù)據(jù)到網(wǎng)絡(luò)服務(wù)器。)
一、嵌入式Linux移植MQTT
虛擬機系統(tǒng):Ubuntu22.04 LTS嵌入式開發(fā)平臺:OK3506J-SLinux內(nèi)核:Linux Kernel 6.1.99交叉編譯工具鏈:arm-linux-gcc
1、有很多流行的MQTT通信庫可以移植部署到嵌入式Linux平臺,比如Paho MQTT,Mosquitto,MQTT-C 等等,本項目我們選用Mosquitto。
2、下載相關(guān)源碼,在虛擬機Ubuntu22.04上創(chuàng)建mosquitto-arm目錄,并在該目錄下執(zhí)行以下命令,把mosquitto依賴的相關(guān)源碼下載到該目錄。
wget?https://mosquitto.org/files/source/mosquitto-1.6.12.tar.gz
wget?https://sourceforge.net/projects/libuuid/files/libuuid-1.0.3.tar.gz
wget?https://www.openssl.org/source/openssl-1.1.1h.tar.gz
3、交叉編譯uuid,解壓后,在libuuid-1.0.3源碼目錄里面,執(zhí)行configure腳本進(jìn)行配置,然后執(zhí)行make && make install?命令,編譯和安裝uuid庫,如下所示。
./configure?--prefix=/opt/work/ok3506j/third_party_libs/mosquitto-arm/libuuid-1.0.3/?CC=/opt/work/ok3506j/toolchains/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-linux-gcc?--host=arm-linux
make
make install
編譯成功后,會在源碼目錄下生成include目錄和lib目錄,這兩個目錄的文件稍后會用到。
4、交叉編譯openssl,解壓后在openssl-1.1.1h源碼目錄里面創(chuàng)建install目錄,執(zhí)行以下命令對源碼進(jìn)行配置。
setarch i386 ./config no-asm shared --prefix=/opt/work/ok3506j/third_party_libs/mosquitto-arm/openssl-1.1.1h/install?
5、執(zhí)行以上配置命令后,會在源碼目錄下生成Makefile文件,執(zhí)行make && make install?命令進(jìn)行編譯和安裝,成功后會在源碼的install目錄下,生成openssl相關(guān)的頭文件和庫文件,稍后會用到。
6、交叉編譯mosquitto,解壓后在mosquitto-1.6.12源碼目錄里面創(chuàng)建install目錄,執(zhí)行以下命令對源碼進(jìn)行編譯配置。
make?WITH_SRV=no?CC=gcc CXX=g++ CFLAGS="-I /opt/work/ok3506j/third_party_libs/mosquitto-arm/openssl-1.1.1h/install/include -I /opt/work/ok3506j/third_party_libs/mosquitto-arm/libuuid-1.0.3/include -I /opt/work/ok3506j/third_party_libs/mosquitto-arm/openssl-1.1.1h/install/lib -I /opt/work/ok3506j/third_party_libs/mosquitto-arm/libuuid-1.0.3/lib"?LDFLAGS="-L /opt/work/ok3506j/third_party_libs/mosquitto-arm/openssl-1.1.1h/install/lib -L /opt/work/ok3506j/third_party_libs/mosquitto-arm/libuuid-1.0.3/lib -lssl -lcrypto -luuid"
編譯成功后,執(zhí)行以下命令,把mosquitto安裝到源碼的install目錄下。
make?install DESTDIR=/opt/work/ok3506j/third_party_libs/mosquitto-arm/mosquitto-1.6.12/install
安裝成功后,如下圖所示。
7、經(jīng)過以上步驟,mosquitto通信庫已經(jīng)交叉編譯成功,把前面幾個步驟編譯出來的動態(tài)庫文件和配置文件,復(fù)制到OK3506J開發(fā)板的文件系統(tǒng)里面,如下圖所示。
8、至此,mosquitto通信庫部署移植完成,可以直接在OK3506J開發(fā)板上直接運行mosquitto相關(guān)的應(yīng)用程序,相關(guān)應(yīng)用程序如下圖所示。
二、南北數(shù)據(jù)互通
前面我們已經(jīng)實現(xiàn)了Modbus的南向設(shè)備端通信,可以把OK3506J采集到的Modbus數(shù)據(jù),通過MQTT協(xié)議發(fā)布出去,實現(xiàn)數(shù)據(jù)南北向互通。
編寫一個測試應(yīng)用程序,定時讀取Modbus-Slave軟件的數(shù)據(jù),模擬一個工業(yè)耗電量數(shù)值,當(dāng)發(fā)現(xiàn)耗電量數(shù)值發(fā)生變化時,通過MQTT進(jìn)行數(shù)據(jù)上報。
我們使用通信貓共享MQTT服務(wù)器:mq.tongxinmao.com,端口是18832,采用無用戶名和無密碼的方式進(jìn)行登錄。
在電腦端使用MQTT.fx軟件訂閱modbus/topic這個主題,OK3506J開發(fā)板通過RS485和Modbus協(xié)議,讀取Modbus-Slave的寄存器0地址數(shù)據(jù),然后通過MQTT消息發(fā)布出去,MQTT.fx會在軟件進(jìn)行打印,如下圖所示。
下一步,我們將會開發(fā)一個上位機軟件,以便對網(wǎng)關(guān)設(shè)備進(jìn)行參數(shù)配置和信息獲取,感謝閱讀和關(guān)注!