物联网 · 盛世宏博 · 工业以太网温湿度传感器 · Modbus TCP · Wireshark排障 · 动环运维
关键词:Modbus TCP、MBAP、事务标识符、读保持寄存器、异常码0x83、TCP连接池、STALE/OFFLINE、字节序、端口镜像、边缘网关 标签:#物联网 #Modbus #TCP/IP #POE供电 #腾讯云 #Python #Wireshark #以太网温湿度传感器 #网口温湿度变送器 #机房监控

工业以太网温湿度传感器通常扮演 Modbus TCP Server:
四种数据对象要分清:
数据对象 | 功能码 | 温湿度场景 |
|---|---|---|
Coils 线圈 | 01/05/0F | 启停加热膜、复位告警 |
Discrete Inputs | 02 | 门磁/水浸输入(少数设备) |
Input Registers | 04 | 只读测量值(温度/湿度/露点) |
Holding Registers | 03/06/10 | 设定值、阈值、采样周期、设备参数 |
很多传感器温度放 Input Registers(04),设定值放 Holding Registers(03);用 03 去读“当前温度”也可能能读出来,但是否支持要看设备点表。
读“温度+湿度”两个寄存器:
00 01 00 00 00 06 01 03 00 00 00 02
│││ │││ │││ │ │ │││ │││
TID Prot Len Unit FC Start Count0000,非零=网关/固件异常 1(Unit) + PDU长度,大端 正常响应:
00 01 00 00 00 05 01 03 02 00FA 012C
││ ││
字节数 temp hum
250→25.0℃ 300→30.0%RH交换机把传感器口/网关口镜像到抓包口:
# 华为
observe-port 1 interface GigabitEthernet0/0/24
interface GigabitEthernet0/0/11
mirror to observe-port 1 bothWireshark 过滤:
tcp.port == 502
ip.addr == 192.168.110.11 && tcp.port == 502
modbus看三件事:
SYN_SENT 没 SYN_ACK → 端口没开 / 防火墙拦 / IP 冲突 0x00FA 是 250 还是 25.0,必须对照手册 异常规则:原功能码 OR 0x80。
0x03 → 0x83,后面跟 1 字节异常码:
异常码 | 含义 | 温湿度传感器现场含义 |
|---|---|---|
0x01 | Illegal Function | 设备不支持该功能码 |
0x02 | Illegal Data Address | 40001 没减 1、地址越界、Input/Holding 区搞反 |
0x03 | Illegal Data Value | 读数量=0、>125、写值超范围、浮点没对齐 |
0x04 | Slave Device Failure | MCU 看门狗、探头自检失败、固件卡死 |
0x06 | Slave Busy | 固件升级/自校准中 |
0x0A/0x0B | Gateway 类 | 串口网关找不到后端 RS485 从站 |
经验:有 0x83 说明 TCP 通了、设备活着,别再去查网线;去查地址基(0-based/1-based)、寄存器区、数量、Unit ID。
40001 → 协议帧里发 0x0000 0 1 → 读出来是湿度/状态字,温度“显示 1562℃” nc -zv 192.168.110.11 502 / tcping 廉价网口变送器并发连接 1~4 个:
现象:
ZeroWindow / TCP Retransmission 增多 正解:
现象 | 根因 | 处理 |
|---|---|---|
1562℃ | 原始值没除 10 | ×0.1 |
65466(实际 -70) | UINT16 当 INT16 | 有符号解析 |
湿度恒 100.0 | 探头凝露/靠近加湿口 | 移位+防凝露加热 |
温度跳 ±3℃ | 空调出风口直吹 | 改回风口/机柜中部 |
两个寄存器拼浮点错 | ABCD/CDAB 反了 | 用 25.5 已知值校验 |
数据长时间不变 | 已离线,平台画旧缓存 | 标 STALE/OFFLINE,不画野值 |
Python 校验片段:
def to_temp(reg):
if reg > 32767:
reg -= 65536
return reg * 0.1
def u16_to_float(high, low, word_order="abcd"):
if word_order == "abcd":
regs = [high, low]
else:
regs = [low, high]
b = b"".join(r.to_bytes(2, "big") for r in regs)
import struct
return struct.unpack(">f", b)[0]collect_ts 不是 send_ts Ping 不通
└─ 线/POE/VLAN/端口隔离
Ping 通 502 拒
└─ 防火墙/端口/Unit ID/固件复位
握手成功无 Modbus 响应
└─ Unit ID 错 / 功能码不支持 / MCU 卡死
返回 0x83 02
└─ 地址基错(40001↔0x0000)、Input/Holding 区错
返回 0x83 04
└─ 探头故障/自检失败/看门狗
数值数量级错
└─ 缩放/符号/字序/浮点对齐
偶发重传
└─ 工业现场正常;连握手都重传才查交换机/强电并行
批量 RST
└─ TCP 连接池满 → 上边缘网关代理工业以太网温湿度传感器运维,不是“Ping 通就完事”:
把“Modbus TCP 原理 + 抓包证据链 + 连接池边界 + 质量位”四件事做扎实,温湿度平台才配叫可运维的工业系统,不是会画曲线的玩具。
看到 0x83 先高兴——设备还活着; 看到 Ping 通没数据先查 502 和 Unit ID; 看到批量掉线先查连接池,不是先骂传感器。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。