# 嵌入式 **Repository Path**: serene-sky/embedded ## Basic Information - **Project Name**: 嵌入式 - **Description**: 周期性通过串口发送Modbus查询帧并接收应答。 解析Modbus应答帧,转换为结构化格式(如JSON)并显示。 将数据通过MQTT发布至 cdjc/sensor 主题。 (扩展)订阅 cdjc/control 主题,接收继电器控制指令。 (扩展)将MQTT控制指令转换为Modbus帧,控制指定继电器。 (扩展)实现Modbus帧的CRC校验码生成与验证。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-20 - **Last Updated**: 2025-08-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Linux Modbus/MQTT 网关 #### 介绍 一个运行于Linux环境的嵌入式网关程序,实现Modbus RTU设备数据的采集,并通过MQTT协议与云平台进行通信。 ####功能特性 1、周期性地通过串口向数据采集控制器发送Modbus问询帧,获取Modbus应答帧; 2、解析Modbus应答帧,显示传感器数据信息,并把传感器数据转换为结构化的字符串(逗号分隔字符串或者JSON格式); 3、把文本格式的传感器数据通过MQTT协议发布到cdjc/sensor主题,通过MQTT客户端(MQTT.fx或手机MQTT客户端软件)订阅cdjc/sensor主题,从而获取传感器数据 4、(扩展功能)网关订阅cdjc/control主题,获取MQTT客户端软件发布的控制信息: "1,1"表示控制第1个继电器接通,"1,0"表示控制第1个继电器断开;(继电器编号1~4) "3,1"表示控制第3个继电器接通,"4,0"表示控制第4个继电器断开; "0,1"表示控制所有继电器接通,"0,0"表示控制所有继电器断开; 5、(扩展功能)网关接收到cdjc/control消息后,转换为Modbus控制帧,控制数据采集控制器上的继电器模板: 假设数据采集控制器的设备地址为41,则控制第1个继电器接通的Modbus控制帧为: 29 06 00 0E 00 01 00 00 (解释:设备地址0x29,功能码0x06,第1个继电器寄存器地址:0x000E,控制码:0x0001(接通),CRC校验码(0x0000) 29 06 00 0E AA AA 00 00 (解释:从地址0x000E开始(继电器1),所有继电器接通:控制码:0xAAAA) 29 06 00 0E BB BB 00 00 (解释:从地址0x000E开始(继电器1),所有继电器断开:控制码:0xBBBB) 注:所有控制帧的应答帧与控制帧相同 6、(扩展功能)实现Modbus问询帧/控制帧CRC校验码的生成和Modbus应答帧CRC校验码的校验 ####使用说明 在终端输入socat -d -d pty,b115200 pty,b115200创建端口 新建窗口输入 ./serial-demo /dev/pts/2打开服务器端 新建窗口输入./gate3 /dev/pts/3打开客户端 新建窗口输入mosquitto_pub -t "cdjc/control" -m "3,1"可控制继电器3接通 collector为仿真实验板 ####技术栈 编程语言:C 通信协议:Modbus RTU,MQTT 编译工具:GCC,Make