
SNMP协议采集以太网温湿度变送器:数据读取与OID调试实战
物联网 · 盛世宏博 · 以太网温湿度变送器、SNMP采集、OID调试、数据读取

近期在调试一套工业环境监控系统时,遇到了关于Modbus连接保持的问题。这次接手的是一批已上线两年的以太网温湿度变送器,客户要求从原有Modbus TCP采集切到SNMP,理由是运维团队习惯用Zabbix做全网设备监控,希望温湿度也进同一套体系。设备厂家给了一份MIB文件,但OID注释写得像天书,snmpwalk跑出来一堆十六进制,读不出可读的温度值。这篇从零讲清楚以太网温湿度变送器的SNMP数据读取、OID定位、类型解码和调试过程,适合第一次接触这类设备的人照着做。
项目 | 详情 |
|---|---|
设备 | 以太网温湿度变送器(网口,支持SNMP v1/v2c) |
数量 | 24台,同网段192.168.90.0/24 |
SNMP配置 | community:只读public,读写private(默认未改) |
MIB厂商OID段 | .1.3.6.1.4.1.39812 |
管理工具 | snmpwalk / snmpget / Wireshark / Zabbix |
目标 | 读出温度、湿度、露点、设备状态、在线时长 |
很多工程师习惯把以太网温湿度变送器当Modbus设备用,其实它内置了精简SNMP Agent:
先别急着读OID,先把链路打通。
# 1. 看设备是否响应SNMP
snmpget -v 2c -c public 192.168.90.11 sysName.0
# 2. 看设备描述
snmpget -v 2c -c public 192.168.90.11 sysDescr.0
# 3. 看运行时间
snmpget -v 2c -c public 192.168.90.11 sysUpTime.0预期返回示例:
SNMPv2-MIB::sysName.0 = STRING: TH-RJ45-011
SNMPv2-MIB::sysDescr.0 = STRING: SHHB Ethernet TH Sensor v2.5
SNMPv2-MIB::sysUpTime.0 = Timeticks: (12345678) 1 day, 10:17:36.78💡 如果这里超时,先查:设备SNMP是否开启、community是否对、防火墙是否放通UDP 161、网段是否同广播域。
两种路线都可用,新手建议先walk全树看结构:
snmpwalk -v 2c -c public 192.168.90.11 .1.3.6.1.4.1.39812返回片段:
...39812.1.1.1.1.0 = INTEGER: 2235
...39812.1.1.1.2.0 = INTEGER: 5120
...39812.1.1.1.3.0 = INTEGER: 5088
...39812.1.1.1.4.0 = INTEGER: 1
...39812.1.1.1.5.0 = Timeticks: (9876543) 1 day, 3:25:45.43厂家MIB里是这样写的(整理后):
OID | 名称 | 类型 | 换算方式 |
|---|---|---|---|
.1.3.6.1.4.1.39812.1.1.1.1.0 | thTemp | INTEGER | 值×0.01 = ℃ |
.1.3.6.1.4.1.39812.1.1.1.2.0 | thHumidity | INTEGER | 值×0.01 = %RH |
.1.3.6.1.4.1.39812.1.1.1.3.0 | thDewPoint | INTEGER | 值×0.01 = ℃ |
.1.3.6.1.4.1.39812.1.1.1.4.0 | thStatus | INTEGER | 1=正常,2=温度告警,3=湿度告警 |
.1.3.6.1.4.1.39812.1.1.1.5.0 | thUpTime | TimeTicks | 设备运行时间 |
snmpget -v 2c -c public 192.168.90.11 .1.3.6.1.4.1.39812.1.1.1.1.0
# 返回:INTEGER: 2235
# 实际温度 = 2235 × 0.01 = 22.35℃这是新手最容易懵的地方,SNMP返回的不是字符串温度,是ASN.1编码后的数值。
ASN.1类型 | SNMP显示 | 处理方式 |
|---|---|---|
INTEGER | INTEGER: 2235 | 按缩放系数换算 |
OCTET STRING | Hex-STRING: 00 1A 2B... | 可能是MAC或二进制结构 |
TimeTicks | Timeticks: (xxx) | 百分之一秒,÷100转秒 |
Gauge32 | Gauge32: 5120 | 无符号,同缩放 |
OBJECT IDENTIFIER | OID: ... | 引用其他对象 |
def decode_temp(raw_int):
# 厂商约定 ×0.01
return round(raw_int * 0.01, 2)
# 2235 -> 22.35
print(decode_temp(2235))部分老固件把序列号放在OCTET STRING里:
snmpget -v 2c -c public 192.168.90.11 .1.3.6.1.4.1.39812.1.1.2.1.0
# Hex-STRING: 53 48 48 42 2D 30 30 31 31
# 转ASCII = "SHHB-0011"现象:MIB文档写thTempTable,按表索引读.1.1.1.1.1返回空。
原因:单探头设备把表退化成标量,叶子挂在.0上,不是行索引1。
解法:直接读.0结尾的OID,不用带行号。用walk确认实际结构再写采集项。
现象:冷通道某点实际8℃,snmpget返回INTEGER: 65432。
原因:老固件用UINT16存温度,负数按补码转成了无符号,没做符号还原。
解法:
def decode_signed_temp(v, scale=0.01):
if v > 32767:
v -= 65536
return round(v * scale, 2)
# 65432 -> 65432-65536 = -4 -> -0.04℃(结合场景判定为8℃附近需核对固件手册)⚠️ 实际项目中遇到此问题后,联系厂家确认该批次固件其实是INT16,只是pysnmp默认按unsigned解析,强制指定类型即可。
现象:walk出来顺序不是MIB文档顺序,调试时以为漏了节点。
原因:SNMP按OID字典序返回,不是按MIB书写顺序;子树嵌套深时会穿插。
解法:用sort -V或程序按数值排序,或直接指定具体叶子OID读取,不依赖walk顺序。
现象:用private读温度,部分设备返回NoSuchObject,部分超时。
原因:设备对private配置了写权限限制+ACL,只允许特定源IP,普通采集机不在白名单。
解法:只读数据统一用public,写操作单独走白名单源IP+private。
现象:抓包显示GET请求发出,无Response。
原因:
解法:
snmp || udp.port==161 现象:对.1.3.6.1.4.1.39812做GETBULK设max-repetitions=20,返回几KB数据还包含固件版本字符串、网卡统计等无关项。
解法:GETBULK起始OID精确到.1.3.6.1.4.1.39812.1.1.1,只拉温湿度子树,max-repetitions=5足够。
配置项 | 值 |
|---|---|
模板 | SNMPv2c设备模板(自定义) |
Key示例 | sensor.temp[192.168.90.11] |
OID | .1.3.6.1.4.1.39812.1.1.1.1.0 |
预处理 | 乘0.01 |
更新间隔 | 30s |
社区 | public |
触发器 | temp>24 |
步骤1:提取INTEGER数值
步骤2:自定义乘数 0.01
步骤3:单位标注 ℃1. ping通设备,确认同网段
2. snmpget读 sysDescr.0 验证Agent存活
3. snmpwalk厂商OID前缀,定位叶子节点
4. 对照MIB文档确认类型与缩放系数
5. 单点snmpget读温度OID,手算验证(如2235→22.35℃)
6. Wireshark抓包核对请求/响应结构
7. 写Zabbix/平台采集项,加预处理换算
8. 跑24小时比对同点位Modbus读数,偏差≤0.2℃即通过点位 | Modbus TCP | SNMP v2c | 偏差 |
|---|---|---|---|
机柜前11 | 22.35℃ | 22.35℃ | 0 |
机柜后11 | 28.12℃ | 28.11℃ | 0.01℃ |
冷通道顶 | 19.84℃ | 19.83℃ | 0.01℃ |
场景 | 工具 | 用法 |
|---|---|---|
快速验证 | snmpget | 单OID读取 |
摸结构 | snmpwalk | 遍历子树 |
批量拉取 | snmpbulkget | 同子树多叶子 |
抓包分析 | Wireshark(过滤snmp) | 看PDU结构、社区名、错误状态 |
平台接入 | Zabbix/NMS | 生产级轮询 |
脚本解码 | Python + pysnmp/aiosnmp | 工程化采集 |
snmpwalk实际返回结构为准,尤其注意标量挂.0还是表索引。 snmp一眼看请求有没有回包。 以太网温湿度变送器、SNMP采集、OID调试、snmpwalk、snmpget、GETBULK、MIB解析、数据解码、Zabbix接入、Wireshark抓包、Modbus交叉验证、工业物联网
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。