首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据机房动环采集实战:以太网温湿度变送器 TCP/IP 协议解析、抓包调试与落地方案

数据机房动环采集实战:以太网温湿度变送器 TCP/IP 协议解析、抓包调试与落地方案

原创
作者头像
HONSOR盛世宏博
发布于 2026-11-13 10:31:15
发布于 2026-11-13 10:31:15
170
举报

Modbus TCP温湿度传感器动环监控实战:寄存器映射与VLAN组网部署笔记

物联网 · 盛世宏博 · 动环监控 · 寄存器映射 · VLAN部署 · 网口温湿度变送器

关键词:Modbus TCP、温湿度传感器、寄存器映射、0-based偏移、字节序、VLAN、工业PoE交换机、动环监控、边缘网关、交付台账 标签:#物联网 #Modbus #TCP/IP #UDP #POE供电 #腾讯云 #Wireshark #Python #InfluxDB #以太网温湿度传感器 #网口温湿度变送器 #机房监控

一、这篇笔记的定位

前面《选型、组网与排错指南》把"买什么、怎么连"讲完了,本篇收敛到实施阶段两个最容易在深夜验收现场卡住人的点:寄存器映射怎么落纸面不返工,以及 VLAN 从规划到交换机命令行怎么一步到位。所有示例来自同一批次 12 台机房+配电室混合部署项目的现场台账脱敏版。

现场经验:80% 的"平台读不出数"不是通信问题,是寄存器表在交接环节丢了精度——厂家给的 Excel、实施工程师手记、网关配置、平台点表四份对不上。


二、寄存器映射:一份能直接进网关配置的模板

2.1 统一约定(写进项目技术协议附录)

约定项

本项目取值

踩坑背景

地址基准

0-based(协议报文填 0x0000 起)

厂家手册印 40001,pymodbus/simplemodbus 填 0,混用必错

功能码

读 0x03(保持寄存器),写 0x06(单寄存器)/0x10(多寄存器)

部分老型号不支持 0x10 连续写,阈值下发退 0x06

字节序

默认 ABCD(大端);FLOAT32 例外标 CDAB

同一厂家两批次固件字节序翻过一次

缩放因子

温度×0.1、湿度×0.1、露点×0.1、电压×0.01

驱动层只乘一次,HMI 不再二次缩放

质量位

寄存器 40003 独立承载,不复用数据寄存器高位

避免"值=65535 当离线"的野路子

2.2 本项目落地的寄存器表(脱敏)

寄存器(1-based)

0-based地址

长度

类型

含义

读写

备注

40001

0x0000

1

INT16

温度(×0.1℃)

RO

补码,-400~850 → -40.0~85.0℃

40002

0x0001

1

UINT16

湿度(×0.1%RH)

RO

0~1000

40003

0x0002

1

UINT16

状态字

RO

bit0=STALE, bit1=传感器故障, bit2=加热膜ON

40004

0x0003

2

FLOAT32(CDAB)

露点温度(×0.1℃)

RO

占连续两寄存器,必须一次读

40101

0x0064

1

INT16

温度高告警阈值

RW

默认 280=28.0℃

40102

0x0065

1

INT16

温度低告警阈值

RW

默认 180=18.0℃

40103

0x0066

1

INT16

湿度高告警阈值

RW

默认 600=60.0%RH

40104

0x0067

1

INT16

湿度低告警阈值

RW

默认 400=40.0%RH

40201

0x00C8

1

UINT16

采集周期(s)

RW

范围 2~60,默认 5

40202

0x00C9

1

UINT16

Modbus Unit ID

RW

重启生效,1~247

关键实施纪律:网关配置里每个点同时存 name / 1based / 0based / dtype / swap / scale / rw,平台导入用 CSV,四列一个不能少。

2.3 现场验证脚本(部署完每台必跑)

代码语言:javascript
复制
# regsmoke.py - 单节点冒烟,输出原始十六进制+解析值
from pymodbus.client import ModbusTcpClient
import struct

def smoke(ip, unit=1):
    c = ModbusTcpClient(ip, timeout=2); c.connect()
    # 一次读 40001~40004(0x0000 起,4寄存器,含FLOAT露点)
    rr = c.read_holding_registers(0x0000, 4, slave=unit)
    raw = rr.registers
    print(f"[{ip}] raw hex: {[hex(r) for r in raw]}")
    temp = int.from_bytes(struct.pack('>H', raw[0]), 'big', signed=True) * 0.1
    hum  = raw[1] * 0.1
    stat = raw[2]
    # CDAB 重组露点:raw[2]低字 raw[3]高字 → 实际项目按厂家确认
    dew_bytes = struct.pack('>HH', raw[3], raw[2])
    dew = struct.unpack('>f', dew_bytes)[0]
    print(f"  T={temp:.1f}  H={hum:.1f}  stat=0x{stat:04X}  Dew={dew:.1f}")
    # 回读阈值校验
    rb = c.read_holding_registers(0x0064, 1, slave=unit)
    print(f"  TH_hi={rb.registers[0]*0.1:.1f}℃")
    c.close()

# smoke("192.168.110.11")

跑完输出贴进验收记录,比"平台上看了一眼有数"硬气十倍。


三、VLAN 组网部署:从 IP 规划到交换机落地

3.1 本项目地址规划(直接抄可用)

VLAN

用途

子网

网关

说明

VLAN 10

业务服务器

192.168.10.0/24

.1

传感器绝不进​

VLAN 20

办公/运维

192.168.20.0/24

.1

仅运维PC临时跳板

VLAN 110​

动环采集域​

192.168.110.0/24​

.1​

传感器+PoE交换机+边缘网关

VLAN 120

门禁/视频辅控

192.168.120.0/24

.1

和110三层隔离

传感器 IP 分配规则:192.168.110.1X,末位 = 机柜列号×10+位置序号,例列头A-03 → .13。

3.2 工业PoE交换机关键配置节选(华为/华三风格通用)

代码语言:javascript
复制
# 创建VLAN
vlan 110
 description DYNAMIC_ENV_SENSORS

# 传感器接入端口(例G0/0/11~G0/0/22)
interface range GigabitEthernet0/0/11 to G0/0/22
 port link-type access
 port default vlan 110
 poe enable
 poe priority high
 storm-control broadcast min 5                    # 防UDP广播风暴
 mac-address binding ip 192.168.110.11 vlan 110 mac xxxx-xxxx-110b
 mac-address binding ip 192.168.110.12 vlan 110 mac xxxx-xxxx-110c
 ...                                              # 逐台绑定
 port-security enable
 port-security max-mac-num 1

# 边缘网关上联口(Trunk,只放110)
interface GigabitEthernet0/0/1
 port link-type trunk
 port trunk allow-pass vlan 110 only

# 未用端口全部 shutdown
interface range GigabitEthernet0/0/23 to G0/0/24
 shutdown

3.3 三层防火墙策略(动环域出口)

代码语言:javascript
复制
# 五元组白名单,顺序即优先级
permit tcp 192.168.110.254/32 192.168.110.0/24 eq 502   # 网关→传感器
permit tcp 192.168.20.50/32 192.168.110.254/32 eq 8883 # 运维跳板→网关MQTT
deny   ip  any 192.168.110.0/24                         # 其余全拦
deny   icmp any any                                     # 动环域不回ping

验收时从办公 VLAN 20 的笔记本 tcping 192.168.110.11 502 必须 timeout,从网关 .254 上发才通——通了才签字。


四、部署流水线与现场顺序

代码语言:javascript
复制
Day1 上午  交换机上架 → VLAN+PoE+端口绑定 → 未用口shutdown
Day1 下午  逐台传感器上电,笔记本直连网关口跑 regsmoke.py,原始值贴台账
Day2 上午  全量12台在线,Wireshark抓30min基线pcap存档
Day2 下午  拔线/断电/重启三项注入测试 + 补传记录截图
Day3       网关CSV点表导入平台,Grafana面板按quality位分色,验收会

顺序不能反:先单台冒烟再全网通电,否则第一台地址冲突会把后面全带歪。


五、现场真实踩坑七条

  1. 厂家两批次固件 FLOAT 字节序相反:第一批 ABCD、第二批 CDAB,没在台账里标版本号,平台半边机房值离谱。解决:寄存器表增加 fw_version 列,网关按 SN 前缀走两套解析。
  2. 401xx 阈值寄存器写 0x10 连续写返回 Illegal Function:老批次只认 0x06 单写,批量下发脚本要 catch 后降级。
  3. VLAN 配完传感器还是被办公网扫到:交换机 port trunk allow-pass 漏删了 VLAN 1,默认VLAN透传。解决:显式 undo port trunk allow-pass vlan 1。
  4. PoE 端口绑定后设备不启动:MAC 地址抄错一位(厂家标签印刷易混 B/8/D),display mac-address vlan 110 一眼能看出来。
  5. 一次读 4 寄存器把 40004 露点读成两个独立 INT16:没按 FLOAT32 重组,露点值跳到几百。解决:驱动层单独处理长度=2 的浮点点位。
  6. 采集周期寄存器写成 1 秒:传感器 TCP 栈扛不住,半小时集体半开。平台侧硬限写入范围 2~60。
  7. pcap 基线忘了存:验收完两周后安全复测要补,只能重跑。现在规定 Day2 下午当场 tshark -i eth0 -w baseline_v110.pcapng 进归档目录。

六、交付归档最小集(本项目实际提交物)

文件

格式

用途

REG_MAP_v110.xlsx

含 0-based/1-based/dtype/swap/scale 全列

网关+平台双方对齐

IP_MAC_VLAN_110.csv

SN / IP / MAC / 端口号 / 固件版本

端口绑定依据

switch_config_110.txt

交换机完整导出(脱敏)

复测可复现

fw_policy.txt

防火墙五元组导出

等保核查

regsmoke_12nodes.log

每台冒烟原始 hex 输出

上线证据

baseline_v110.pcapng

30min 零广播抓包

安全基线


七、小结

寄存器映射和 VLAN 组网是动环项目里"看不见但决定能不能过验收"的两根柱子。映射表要精确到每个寄存器的字节序和版本分支,VLAN 要精确到每个接入端口的 MAC 绑定和一条多余 VLAN 都不透传。这两份台账在现场多花半天,后面三年运维少接二十个半夜电话。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • Modbus TCP温湿度传感器动环监控实战:寄存器映射与VLAN组网部署笔记
    • 一、这篇笔记的定位
    • 二、寄存器映射:一份能直接进网关配置的模板
      • 2.1 统一约定(写进项目技术协议附录)
      • 2.2 本项目落地的寄存器表(脱敏)
      • 2.3 现场验证脚本(部署完每台必跑)
    • 三、VLAN 组网部署:从 IP 规划到交换机落地
      • 3.1 本项目地址规划(直接抄可用)
      • 3.2 工业PoE交换机关键配置节选(华为/华三风格通用)
      • 3.3 三层防火墙策略(动环域出口)
    • 四、部署流水线与现场顺序
    • 五、现场真实踩坑七条
    • 六、交付归档最小集(本项目实际提交物)
    • 七、小结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档