我是老温,一名热爱学习的嵌入式工程师
" v2 L. y% D1 g+ ~关注我,一起变得更加优秀!上一篇文章,我们详细地描述了如何在嵌入式Linux开发平台上移植libmodbus库,实现了通过Modbus协议采集设备端数据,可以点击以下链接对文章进行回顾。嵌入式Linux工业网关设计,离不开这个关键核心通信模块。6 @) K8 ~0 n$ a( ^. g! @% t: K& B
除了Modbus通信协议之外,在网关产品上面还有一个非常重要的通信协议,那就是MQTT。6 `- s: P4 a2 o; T+ z# f7 V
关于MQTT的概念,网上已经有比较多的文章,此处就不再重复论述,本篇文章的主要目的,是在嵌入式Linux平台上移植部署MQTT通信库,并且实现数据端的南北向通信。, [- A" D- u% b
(南北向通信,南向一般是指通过Modbus对接获取设备数据,北向一般是指通过MQTT上报数据到网络服务器。)6 T# @8 x! w5 d0 }. ?: e0 h" w
anqazz32qif64043607816.jpg
( a7 \: ]! z: n) x7 Q4 A
一、嵌入式Linux移植MQTT3 ?; u3 {% O' m+ x' a6 ]9 u
虚拟机系统:Ubuntu22.04 LTS嵌入式开发平台:OK3506J-SLinux内核:Linux Kernel 6.1.99交叉编译工具链:arm-linux-gcc
! E9 N, o5 F, H& Q1、有很多流行的MQTT通信库可以移植部署到嵌入式Linux平台,比如Paho MQTT,Mosquitto,MQTT-C 等等,本项目我们选用Mosquitto。% m F9 H* f% F/ y, p3 n
25owq3smfb064043607916.png
& _; y1 T0 P, P1 b" i1 M2 w4 V; q
2、下载相关源码,在虚拟机Ubuntu22.04上创建mosquitto-arm目录,并在该目录下执行以下命令,把mosquitto依赖的相关源码下载到该目录。wget https://mosquitto.org/files/source/mosquitto-1.6.12.tar.gzwget https://sourceforge.net/projects/libuuid/files/libuuid-1.0.3.tar.gzwget https://www.openssl.org/source/openssl-1.1.1h.tar.gz
$ t/ \- `, U; F% x$ x& A
nvuxmjj53br64043608016.png
Z6 E$ `! h4 M! {! u8 N" Z
3、交叉编译uuid,解压后,在libuuid-1.0.3源码目录里面,执行configure脚本进行配置,然后执行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-linuxmakemake install编译成功后,会在源码目录下生成include目录和lib目录,这两个目录的文件稍后会用到。4 S/ l# U& p- n" [: V# V
0uvlatqejep64043608116.png
- z$ h& ?' t; t5 W. [- o( c
4、交叉编译openssl,解压后在openssl-1.1.1h源码目录里面创建install目录,执行以下命令对源码进行配置。setarch i386 ./config no-asm shared --prefix=/opt/work/ok3506j/third_party_libs/mosquitto-arm/openssl-1.1.1h/install 5、执行以上配置命令后,会在源码目录下生成Makefile文件,执行make && make install 命令进行编译和安装,成功后会在源码的install目录下,生成openssl相关的头文件和库文件,稍后会用到。. `# d3 `: P7 \% K( ^- l! c
ilpl1gi4aal64043608216.png
) Q4 P# I- \2 C9 U3 O- C& v6、交叉编译mosquitto,解压后在mosquitto-1.6.12源码目录里面创建install目录,执行以下命令对源码进行编译配置。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"编译成功后,执行以下命令,把mosquitto安装到源码的install目录下。make install DESTDIR=/opt/work/ok3506j/third_party_libs/mosquitto-arm/mosquitto-1.6.12/install安装成功后,如下图所示。
" C: I) `. ^* n' S _" N
a22tobitnel64043608316.png
* A/ Z( l9 X7 Z+ e0 z3 a7 q7、经过以上步骤,mosquitto通信库已经交叉编译成功,把前面几个步骤编译出来的动态库文件和配置文件,复制到OK3506J开发板的文件系统里面,如下图所示。
# m9 R( l+ P/ V/ a+ F6 ?
4hbvkgr5utc64043608416.png
9 W2 @0 @3 {( r" b3 T8 ]6 O$ {8、至此,mosquitto通信库部署移植完成,可以直接在OK3506J开发板上直接运行mosquitto相关的应用程序,相关应用程序如下图所示。1 G- f5 G! x8 c* H" r' ^; [; T
djhpmtninwp64043608516.png
! z) h7 @- m7 n' b9 F) M5 q
二、南北数据互通9 U/ M+ J& e" z9 T0 y/ \! L, Z
前面我们已经实现了Modbus的南向设备端通信,可以把OK3506J采集到的Modbus数据,通过MQTT协议发布出去,实现数据南北向互通。7 v/ Q( F; Y x. ^
编写一个测试应用程序,定时读取Modbus-Slave软件的数据,模拟一个工业耗电量数值,当发现耗电量数值发生变化时,通过MQTT进行数据上报。, {8 L$ e N+ i
q3n40p1jo3k64043608616.png
6 C; e% k' @: e% N3 {8 `0 x
我们使用通信猫共享MQTT服务器:mq.tongxinmao.com,端口是18832,采用无用户名和无密码的方式进行登录。, r- \* p; a$ }) \2 ^8 K
p2moay0wqz164043608716.png
8 R$ s, d/ p3 I在电脑端使用MQTT.fx软件订阅modbus/topic这个主题,OK3506J开发板通过RS485和Modbus协议,读取Modbus-Slave的寄存器0地址数据,然后通过MQTT消息发布出去,MQTT.fx会在软件进行打印,如下图所示。
2 x6 v* _& \# g4 [" g$ ?" A
ljauv2jinq464043608816.png
% w+ r! Z, v; F# X4 N3 h下一步,我们将会开发一个上位机软件,以便对网关设备进行参数配置和信息获取,感谢阅读和关注!
, {6 h$ M- J8 W; K-END-
6 C2 p K/ Y! a& H& |+ z# ?, ~往期推荐:点击图片即可跳转阅读
7 z6 [. E1 Q; c' G4 p6 o: A
yjlwq2y4fff64043608916.jpg
; e" s' N/ y* T# g4 _. j嵌入式Linux工业网关设计,离不开这个关键核心通信模块。7 {0 H$ v" ]6 [, q! O
ostab2p24ov64043609016.jpg
1 A9 g8 c1 t& _9 U8 f! r4 g
嵌入式软硬件开发,工程师在预研阶段就要开始考虑如何降本增效!
+ Y+ y% w7 A3 Y$ m+ T; D2 M
fdkbp20kbh364043609116.jpg
( H4 @1 x6 v) d' p( \
朋友想自研一款嵌入式工业网关,分享一下我的设计思路!
& n* k4 F: `8 {: ]# e- I. q4 `我是老温,一名热爱学习的嵌入式工程师
( Q3 ]- Q8 s* g2 \6 L* Q0 {8 z关注我,一起变得更加优秀!
8 [) w: W$ v1 n$ L: k0 C% E, Y
3x00d3xoiib64043609216.jpg
|