• 正文
  • 相关推荐
申请入驻 产业图谱

基于嵌入式Linux平台,数传网关实现南北向数据链路互通

04/22 11:30
1675
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

我是老温,一名热爱学习的嵌入式工程师

上一篇文章,我们详细地描述了如何在嵌入式Linux开发平台上移植libmodbus库,实现了通过Modbus协议采集设备端数据,可以点击以下链接对文章进行回顾。嵌入式Linux工业网关设计,离不开这个关键核心通信模块。

除了Modbus通信协议之外,在网关产品上面还有一个非常重要的通信协议,那就是MQTT。

关于MQTT的概念,网上已经有比较多的文章,此处就不再重复论述,本篇文章的主要目的,是在嵌入式Linux平台上移植部署MQTT通信库,并且实现数据端的南北向通信。

(南北向通信,南向一般是指通过Modbus对接获取设备数据,北向一般是指通过MQTT上报数据到网络服务器。)

一、嵌入式Linux移植MQTT

虚拟机系统:Ubuntu22.04 LTS嵌入式开发平台:OK3506J-SLinux内核:Linux Kernel 6.1.99交叉编译工具链:arm-linux-gcc

1、有很多流行的MQTT通信库可以移植部署到嵌入式Linux平台,比如Paho MQTT,Mosquitto,MQTT-C 等等,本项目我们选用Mosquitto。


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


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、交叉编译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相关的头文件和库文件,稍后会用到。

6、交叉编译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

安装成功后,如下图所示。

7、经过以上步骤,mosquitto通信库已经交叉编译成功,把前面几个步骤编译出来的动态库文件和配置文件,复制到OK3506J开发板的文件系统里面,如下图所示。

8、至此,mosquitto通信库部署移植完成,可以直接在OK3506J开发板上直接运行mosquitto相关的应用程序,相关应用程序如下图所示。

二、南北数据互通

前面我们已经实现了Modbus的南向设备端通信,可以把OK3506J采集到的Modbus数据,通过MQTT协议发布出去,实现数据南北向互通。

编写一个测试应用程序,定时读取Modbus-Slave软件的数据,模拟一个工业耗电量数值,当发现耗电量数值发生变化时,通过MQTT进行数据上报。

我们使用通信猫共享MQTT服务器:mq.tongxinmao.com,端口是18832,采用无用户名和无密码的方式进行登录。

在电脑端使用MQTT.fx软件订阅modbus/topic这个主题,OK3506J开发板通过RS485和Modbus协议,读取Modbus-Slave的寄存器0地址数据,然后通过MQTT消息发布出去,MQTT.fx会在软件进行打印,如下图所示。

下一步,我们将会开发一个上位机软件,以便对网关设备进行参数配置和信息获取,感谢阅读和关注!

相关推荐