物联网之设备数据上报(二)

上回介绍了使用 Modbus 协议采集蒸汽锅炉数据,本次将采集到的数据通过 MQTT 协议上报到服务器。

配置 MQTT 网关

端口参数

按照设备通讯协议说明配置串口参数。

边缘网关配置

MQTT 网关配置

连接到 MQTT 服务器,配置上报 Topic。

Topic 格式device/{deviceType}/{deviceName}

设备类型 Topic 示例
蒸汽锅炉 device/steam_boiler/1号锅炉
热水锅炉 device/hot_water_boiler/1号锅炉

MQTT 消息格式

数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"params": {
"dir": "up",
"id": "02102825090400039862",
"MAC": "D4AD20D579E6",
"r_data": [
{ "name": "flue_temp", "value": "10", "err": "0" },
{ "name": "boiler_press", "value": "123.45", "err": "0" },
{ "name": "pump_run_coil", "value": "0", "err": "0" },
{ "name": "fire_coil_1", "value": "1", "err": "0" },
{ "name": "fire_coil_2", "value": "0", "err": "0" },
{ "name": "water_level", "value": "2", "err": "0" },
{ "name": "press_state", "value": "2", "err": "0" },
{ "name": "fault_reg", "value": "512", "err": "0" }
]
}
}

字段说明

字段 来源 说明
dir 固定值 方向标识,up=上行
id 设备配置 设备唯一标识(deviceId)
MAC 设备配置 设备 MAC 地址
r_data 采集数据 采集点数组
name 点表配置 采集点名称
value 采集值 实际采集的数值
err 采集状态 0=正常,非0=异常

故障值解析

位运算原理

故障寄存器是一个 16 位整数,每一位代表一种故障状态(1=有效,0=无效)。

故障位定义

十进制值 故障类型 是否故障
bit0 1 定时时间到关机 否(正常模式)
bit8 256 燃烧机故障
bit9 512 烟温传感器故障
bit10 1024 烟道超温故障
bit11 2048 炉水水位极低
bit12 4096 蒸汽压力极高
bit14 16384 炉水水位极高

多故障解析示例

故障值:2817

1
2
3
4
5
6
7
8
9
2817 的二进制:0000101100000001

解析过程:
2817 - 2048 (bit11) = 769
769 - 512 (bit9) = 257
257 - 256 (bit8) = 1
1 - 1 (bit0) = 0

结果:2817 = 2048 + 512 + 256 + 1

对应故障列表

故障
bit0 1 定时时间到关机(正常模式)
bit8 256 燃烧机故障
bit9 512 烟温传感器故障
bit11 2048 炉水水位极低

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
interface FaultBit {
bit: number;
value: number;
code: string;
name: string;
isFault: boolean;
}

const FAULT_BITS: FaultBit[] = [
{ bit: 0, value: 1, code: 'TIMER_SHUTDOWN', name: '定时时间到关机', isFault: false },
{ bit: 8, value: 256, code: 'BURNER_FAULT', name: '燃烧机故障', isFault: true },
{ bit: 9, value: 512, code: 'EXHAUST_TEMP_SENSOR_FAULT', name: '烟温传感器故障', isFault: true },
{ bit: 10, value: 1024, code: 'EXHAUST_OVER_TEMP', name: '烟道超温故障', isFault: true },
{ bit: 11, value: 2048, code: 'WATER_LEVEL_EXTREMELY_LOW', name: '炉水水位极低', isFault: true },
{ bit: 12, value: 4096, code: 'STEAM_PRESSURE_EXTREMELY_HIGH', name: '蒸汽压力极高', isFault: true },
{ bit: 14, value: 16384, code: 'WATER_LEVEL_EXTREMELY_HIGH', name: '炉水水位极高', isFault: true },
];

function extractFaults(faultReg: number): FaultBit[] {
const faults: FaultBit[] = [];

for (const fault of FAULT_BITS) {
if ((faultReg & fault.value) !== 0) {
faults.push(fault);
}
}

return faults;
}

// 使用示例
const faults = extractFaults(2817);
console.log(faults);
// 输出:[bit0, bit8, bit9, bit11]

MQTT 服务器验证

使用 MQTT 客户端工具订阅 Topic,验证数据上报是否正常。

Topic 设计规范

格式定义

1
device/{deviceType}/{deviceName}
部分 说明 示例
device 固定前缀 device
deviceType 设备类型标识 steam_boiler
deviceName 设备名称(用户定义) 1号锅炉

订阅规则

Topic 说明
device/+/+ 订阅所有设备
device/steam_boiler/+ 订阅所有蒸汽锅炉
device/hot_water_boiler/+ 订阅所有热水锅炉
device/steam_boiler/1号锅炉 订阅指定设备

小结

本文介绍了:

  1. MQTT 网关配置方法
  2. 数据上报的 JSON 格式
  3. 故障位的解析算法
  4. Topic 设计规范

下一篇文章将介绍如何存储这些数据并进行大屏展示。


物联网之设备数据上报(二)
https://cszy.top/20260402-物联网之设备数据上报(二)/
作者
csorz
发布于
2026年4月2日
许可协议