作者:张丁丁
功能综述
该项目基于睿擎平台,开发了一款高性能工业物联网数据网关,实现Modbus RTU协议与MQTT协议的双向高效转换。该方案为传统工业设备在不改变原有功能和硬件结构的前提下,快速接入物联网提供了可靠且经济的技术路径。
核心功能
1、Modbus RTU数据采集与上云:
睿擎派作为Modbus RTU主站,定时读取从站寄存器数据
采集的数据通过消息队列机制传递至MQTT模块,实时发送至云端MQTT Broker
2、云端命令接收与设备控制:
睿擎派作为MQTT客户端,接收云端发布的控制命令
解析命令后转发至Modbus RTU模块,执行远程寄存器读写操作
3、技术优势:
采用生产者-消费者模型,基于RT-Thread消息队列实现进程间通信(IPC)
任务在无数据处理时进入阻塞状态,有效节省CPU资源,提升系统实时性
typedefstruct
{
uint16_taddress;
uint16_tvalue;
}ModbusData;
软件框架设计
项目架构与模块划分
本项目采用分层模块化设计,确保代码的可维护性和功能分离,核心模块包括:
1、主入口模块:
a.程序执行入口
b.负责系统初始化流程,调用应用管理模块
c.具体实现参见 main.c
2、应用管理模块:
a.集中管理应用任务
b.初始化全局资源,如RT-Thread消息队列等IPC机制
c.具体实现参见 app_management.c
3、网络初始化模块:
a.配置设备网络连接
b.实现优先网络连接策略,为MQTT通信提供底层支撑
c.具体实现参见 app_netset.c
4、Modbus RTU协议处理模块:
a.实现Modbus RTU协议功能
b.负责外设初始化、主站数据读取及远程控制
c.具体实现参见 applicationModbusRtu.c
5、MQTT通信模块:
a.实现MQTT客户端功能
b.负责Broker连接、命令接收和数据发布
c.具体实现参见 applicationMqtt.c
测试环境与云端配置
本项目使用阿里云服务器部署EMQX MQTT Broker,作为可靠的云端测试环境,确保Modbus RTU网关与云平台之间的稳定双向通信。
软件模块详细说明
主入口模块
功能说明:主入口模块是程序的核心启动点,负责初始化系统资源并启动应用管理模块。它作为整个系统的启动器,确保所有功能模块按正确顺序初始化和运行,具体实现参见 main.c。
核心代码片段:
#include<rtthread.h>
#include"app_management.h"
intmain(void)
{
app_rt_thread_init();
rt_kprintf("Modbus-MQTT Gateway initialized successfully\n");
return0;
}
应用管理模块
功能说明:应用管理模块是系统的中枢神经,负责全局资源管理和任务调度。它实现了:
1.消息队列的创建与维护,用于模块间通信
2.网络连接的初始化
3.关键任务线程的创建与启动(Modbus RTU和MQTT线程)
具体实现参见 app_management.c。
核心代码片段:
// 创建消息队列,实现Modbus与MQTT模块间通信
staticvoidmessage_queue_init(void)
{
g_xQueueModbusRtuReadDate=rt_mq_create("modbus_rtu_mq",sizeof(ModbusData),10,RT_IPC_FLAG_FIFO);
g_xQueueModbusRtuWriteDate=rt_mq_create("modbus_rtu_mq_w",sizeof(ModbusData),10,RT_IPC_FLAG_FIFO);
}
// 系统初始化与任务启动
voidapp_rt_thread_init(void)
{
message_queue_init();
netset_init();// 网络初始化
// 启动Modbus RTU主站任务
tid=rt_thread_create("modbus_rtu_thread",app_modbusRTU_master_thread,RT_NULL,1024*4,10,10);
rt_thread_startup(tid);
// 启动MQTT通信任务
tid=rt_thread_create("mqtt_thread",app_mqtt_thread,RT_NULL,1024*4,10,10);
rt_thread_startup(tid);
}
Modbus RTU协议处理模块
功能说明:该模块实现Modbus RTU协议的主站功能,是网关与工业设备通信的核心。主要负责:
1.配置和初始化Modbus RTU通信参数
2.定时读取从站设备寄存器数据
3.接收并执行来自MQTT模块的远程控制命令
具体实现参见 applicationModbusRtu.c。
核心代码片段:
// 初始化Modbus RTU主站
staticintmodbus_rtu_master_init(void)
{
ctx=modbus_new_rtu("/dev/uart5",9600,'N',8,1);
modbus_set_slave(ctx,1);
modbus_set_response_timeout(ctx,1,0);
modbus_rtu_set_serial_mode(ctx,MODBUS_RTU_RS485);
modbus_rtu_set_rts(ctx,RS485_RTS_PIN,MODBUS_RTU_RTS_UP);
returnmodbus_connect(ctx);
}
// Modbus RTU主站线程
voidapp_modbusRTU_master_thread(void*arg)
{
uint16_treceived_regs[10];
modbus_rtu_master_init();
while(1)
{
// 读取寄存器数据并发送至MQTT模块
rc=modbus_read_registers(ctx,0,10,received_regs);
if(rc>0)
{
for(inti=0;i<rc;i++)
{
ModbusData data={.address=i,.value=received_regs[i]};
rt_mq_send(g_xQueueModbusRtuReadDate,&data,sizeof(ModbusData));
}
}
// 处理远程写入命令
ModbusData write_data;
rt_mq_recv(g_xQueueModbusRtuWriteDate,&write_data,sizeof(ModbusData),RT_WAITING_FOREVER);
modbus_write_register(ctx,write_data.address,write_data.value);
rt_thread_delay(1000);
}
}
网络初始化模块
功能说明:该模块负责设备网络连接的配置与初始化,为MQTT通信提供底层网络支持。主要功能包括MAC地址配置和DHCP客户端启用,确保设备能自动获取IP地址并建立网络连接,具体实现参见 app_netset.c。
核心代码片段:
// 配置MAC地址
staticintmac_config(void)
{
uint8_tmac[6]={0x00,0x11,0x22,0x33,0x44,0x55};
returnif_set_mac(DEV_NAME,mac);
}
// 启用DHCP客户端
staticintdhcp_enable(void)
{
returnif_dhcp(DEV_NAME,1);
}
// 网络初始化入口
voidnetset_init(void)
{
mac_config();
dhcp_enable();
}
MQTT通信模块
功能说明:
该模块实现MQTT客户端功能,是网关与云端通信的桥梁。主要功能包括:
1.MQTT Broker连接与认证
2.订阅云端控制命令
3.发布Modbus采集数据
4.JSON与Modbus数据格式转换
具体实现参见 applicationMqtt.c。
核心代码片段:
// MQTT订阅回调函数 - 处理云端控制命令
staticvoidmqtt_sub_callback(MQTTClient*c,MessageData*msg_data)
{
ModbusData write_data;
// 解析JSON命令
constchar*json_string=(constchar*)msg_data->message->payload;
if(json_to_ModbusData(json_string,&write_data)==0)
{
// 发送至Modbus写入队列
rt_mq_send(g_xQueueModbusRtuWriteDate,&write_data,sizeof(ModbusData));
}
}
// 数据格式转换 - JSON到ModbusData
intjson_to_ModbusData(constchar*json_string,ModbusData*out_data)
{
cJSON*root=cJSON_Parse(json_string);
if(root==NULL)return-1;
out_data->address=(uint16_t)cJSON_GetObjectItemCaseSensitive(root,"address")->valuedouble;
out_data->value=(uint16_t)cJSON_GetObjectItemCaseSensitive(root,"value")->valuedouble;
cJSON_Delete(root);
return0;
}
// MQTT线程 - 负责数据发布
voidapp_mqtt_thread(void*arg)
{
mq_start();// 启动MQTT客户端
while(1)
{
ModbusData data;
// 接收Modbus数据并发布到云端
rt_mq_recv(g_xQueueModbusRtuReadDate,&data,sizeof(ModbusData),RT_WAITING_FOREVER);
ModbusData_publish(&data);
rt_thread_mdelay(10);
}
}
演示效果
云端MQTT服务器连接状态

实际应用演示
视频演示:
https://www.bilibili.com/video/BV1uWSnBwEqp/?vd_source=9ed2178ae937fd4121a4f70f89f06b65
源码仓库
GitHub仓库:https://github.com/yxy314/ruiqingpai_RTU_MQTT
总结
本项目实现了一个功能完整、性能稳定的Modbus RTU与MQTT协议转换网关,具有以下特点:
1、高可靠性:采用成熟的开源库和RT-Thread实时操作系统,确保系统稳定性
2、低资源占用:优化的任务调度和内存管理,适合资源受限的嵌入式平台
3、易于扩展:模块化设计便于功能扩展和定制
4、安全通信:支持MQTT认证机制,确保数据传输安全
该网关为工业设备的物联网化改造提供了高效、经济的解决方案,可广泛应用于工业自动化、智能工厂、远程监控等领域。
这篇文章展示了睿擎平台将传统工业设备无缝接入物联网的完整能力。如果您正在寻找一个稳定、高效且开箱即用的硬件平台来部署此类解决方案,或用于您的其他工业控制项目,那么实现本文所有功能的睿擎派RC3506开发板将是您的理想选择。
为什么选择睿擎派进行开发?
软硬一体,省心省力:文章中的所有软件皆可在此开发板上流畅运行,无需担忧硬件适配问题。
全栈自主,开放灵活:基于RT-Thread的睿擎平台提供从底层驱动到应用框架的全栈支持,并允许您进行深度定制。
工业级可靠性:专为工业环境设计,确保您的关键应用稳定运行。
即刻入手,开始您的项目
如果您对文中解决方案感兴趣,或希望基于睿擎派实现自己的工业物联网创意,欢迎访问我们的官方淘宝店铺“睿赛德科技”,选购睿擎派RC3506开发板及配套配件。
睿擎派工业开发板购买链接:
https://item.taobao.com/item.htm?ft=t&id=946489007785
立即扫码购买
平台持续提供完善的技术文档、示例代码与社区支持,助力您的项目快速落地!