1. 现场调试前,先把"双协议接入"这件事想明白
以太网温湿度变送器这几年在机房、仓储、实验室、农业大棚里铺得越来越多,原因很直接:RJ45网口比RS485布线省事,一根网线既能供电又能传数据,还能直接挂到现有交换机上。但真正到了项目现场,麻烦往往不在变送器本身,而在于"数据怎么进监控系统"。我见过太多项目,变送器装好了、网线通了、网页能打开,结果Zabbix里就是没数据,或者SNMP能读、TCP连不上,折腾半天找不到症结。
这篇内容聊的就是这个环节:以太网温湿度变送器通过SNMP和TCP双协议接入网关的现场调试实践。核心关键词包括以太网温湿度变送器、SNMP、TCP、Modbus、Zabbix。适合正在做动环监控、机房环境监测、仓储温湿度采集的运维和集成人员参考,也适合刚接触SNMP和Modbus TCP、想搞清楚"双协议到底怎么选、怎么配、怎么排错"的同行。
先说清楚一个前提:所谓"双协议接入",通常有两种理解。一种是变送器本身同时支持SNMP和Modbus TCP两套协议栈,你选其中一种用;另一种是变送器只支持Modbus TCP,通过一个协议转换网关把它同时暴露成SNMP可读和TCP可读两种接口。现场更常见的是后者,因为大量国产温湿度变送器走的是Modbus TCP,而监控平台侧有的团队习惯SNMP、有的习惯TCP直连。我这次实践的场景就是:变送器是Modbus TCP输出,网关做协议适配,Zabbix通过SNMP采集,同时保留TCP通道给调试工具和备用系统。
为什么非要双协议?单协议不够吗?实际项目里,单协议往往会在某个环节卡住。比如你只有SNMP,调试阶段想快速看原始寄存器值就很别扭;你只有TCP,接入某些网管平台又要额外开发。双协议的价值在于:SNMP负责标准化接入监控平台,TCP负责灵活调试和二次开发。两者并存,现场排错效率会高很多。
提示:动手之前先确认变送器的协议能力。看铭牌和说明书,确认是"Modbus TCP"还是"SNMP"还是"双协议原生支持"。很多标称"以太网"的变送器其实只跑Modbus TCP,SNMP是网关补出来的。
2. 变送器、网关、平台三者的角色分工与选型逻辑
2.1 变送器侧:Modbus TCP的寄存器布局是调试的起点
以太网温湿度变送器内部通常是一颗带以太网MAC的MCU,跑一个精简的Modbus TCP服务端。它把温度、湿度值放在保持寄存器里,常见布局是:温度占1个寄存器(比如地址0x0000),湿度占1个寄存器(0x0001),有的还会把温度符号位、小数点位数单独放寄存器。这个布局必须从说明书里拿到,因为不同厂家差异很大。
我这次用的变送器,寄存器映射是这样的:0x0000是温度整数部分,0x0001是温度小数部分,0x0002是湿度整数部分,0x0003是湿度小数部分。注意,它不是常见的"一个寄存器放放大10倍的整数",而是整数和小数分开。这种设计在调试时特别容易踩坑——如果你按常规思路只读一个寄存器,读到的就是整数,小数永远丢了。
Modbus TCP的报文结构和Modbus RTU不同,它去掉了CRC校验,换成了MBAP头(7字节:事务标识2字节、协议标识2字节、长度2字节、单元标识1字节)。这意味着你用Modbus Poll这类工具时,要选"Modbus TCP"模式而不是"Modbus RTU over TCP"。我见过有人选错模式,报文发出去变送器根本不回,还以为是网络问题。
2.2 网关侧:协议转换的核心是"映射表"
网关的作用是把Modbus TCP的寄存器读上来,再按SNMP的OID结构暴露出去,同时保留一个TCP透传或Modbus TCP转发通道。选网关时我关注三个点:
第一,SNMP版本支持。至少要支持SNMP v2c,因为Zabbix默认用v2c做采集,v3配置复杂但更安全,看项目要求。我这次用v2c,community设成自定义字符串,不用默认的public,这是基本安全习惯。
第二,OID映射是否可配。好的网关允许你把"温度寄存器地址"映射到任意OID,比如1.3.6.1.4.1.xxxx.1.1.0。如果OID写死,后期扩展就难受。
第三,TCP通道的形态。是透传(TCP转Modbus TCP)还是独立服务端?透传模式下,你连上网关的某个端口,数据直接转发到变送器,调试工具能像直连变送器一样操作。这个功能在排错时非常有用。
2.3 平台侧:Zabbix为什么是常见选择
Zabbix对SNMP的支持非常成熟,自带SNMP采集器,配置监控项时直接填OID就行。相比自己写脚本轮询Modbus,Zabbix的优势是:告警、趋势、图形、模板一套齐全,而且SNMP是标准协议,换平台时迁移成本低。
但Zabbix采集SNMP有个细节要注意:它默认按监控项逐个OID请求,如果OID很多,轮询压力会上去。温湿度这种场景OID少(通常4到6个),问题不大。如果以后要扩到几十个点位,建议用SNMP walk或者把多个值合并到一个OID的表格里,减少请求次数。
| 角色 | 协议 | 关键配置 | 常见坑 |
|---|---|---|---|
| 变送器 | Modbus TCP | 寄存器映射、单元ID、端口502 | 寄存器布局与预期不符 |
| 网关 | Modbus TCP转SNMP | OID映射、community、TCP透传端口 | OID写死、community用默认值 |
| Zabbix | SNMP v2c | OID、更新间隔、超时 | 超时太短导致采集失败 |
3. 现场调试的完整链路:从网线插上到Zabbix出图
3.1 第一步:网络连通性,别急着上协议
网线插上后,先确认物理层和网络层通。变送器默认IP通常是192.168.1.x或者192.168.0.x,用厂家工具或网页改到项目网段。我习惯先用ping确认:
ping 192.168.10.55ping通只说明IP层没问题,不代表Modbus TCP端口开着。接着用telnet或nc测端口:
nc -zv 192.168.10.55 502502是Modbus TCP默认端口。如果这个不通,先查变送器是否启用了Modbus TCP服务,有的设备默认只开网页不开Modbus。
网关的SNMP端口是UDP 161,测试方式不同:
snmpwalk -v 2c -c mycommunity 192.168.10.60 1.3.6.1.4.1这条命令能返回数据,说明网关SNMP服务正常。如果返回"Timeout",先查网关的SNMP是否启用、community是否匹配、防火墙是否放行UDP 161。
3.2 第二步:用Modbus Poll验证寄存器
Modbus Poll是调试Modbus最顺手的工具。新建连接时选"Modbus TCP",填变送器IP和502端口,单元ID一般填1(有的设备填0或255,看说明书)。然后设置读取:功能码03(读保持寄存器),起始地址0,数量4。
如果读回来的值和实际温湿度对不上,先别怀疑设备坏,按这个顺序查:
- 地址是从0还是从1开始?Modbus协议里地址有"协议地址"和"文档地址"的偏移问题,有的工具默认加1。
- 数据类型是整数还是浮点?整数和小数分开的,要分别读。
- 字节序对不对?32位浮点有ABCD和CDAB两种,读出来是乱码就要换。
我这次读到的4个寄存器是:25、6、58、3,对应温度25.6度、湿度58.3度。验证方法很简单:用手捂一下温湿度探头,数值应该变化。
3.3 第三步:网关OID映射配置
网关的Web界面里,把Modbus寄存器映射到OID。我这次映射如下:
- 温度整数 0x0000 → 1.3.6.1.4.1.8888.1.1.0
- 温度小数 0x0001 → 1.3.6.1.4.1.8888.1.2.0
- 湿度整数 0x0002 → 1.3.6.1.4.1.8888.1.3.0
- 湿度小数 0x0003 → 1.3.6.1.4.1.8888.1.4.0
映射完用snmpwalk验证:
snmpwalk -v 2c -c mycommunity 192.168.10.60 1.3.6.1.4.1.8888应该能看到四个OID和对应值。如果某个OID返回"noSuchInstance",说明映射没生效或者OID写错了。
注意:有的网关对OID的末尾".0"有要求,标量OID必须以.0结尾。漏了.0,snmpwalk可能返回空。
3.4 第四步:Zabbix接入与监控项配置
Zabbix里新建主机,接口选SNMP,填网关IP和端口161,SNMP版本选v2c,community填对。然后建监控项:
- 名称:温度整数
- 类型:SNMP agent
- Key:temp.int
- SNMP OID:1.3.6.1.4.1.8888.1.1.0
- 更新间隔:30s
小数部分同理。但这里有个问题:Zabbix监控项返回的是字符串或数字,整数和小数分开存,图形上不好看。解决办法是用"计算型监控项"把两个值合成一个浮点数:
last(//temp.int) + last(//temp.dec)/10这样图形里就是25.6而不是25和6两个值。
Zabbix的SNMP采集超时默认是3秒,如果网关响应慢,会报"Timeout while connecting to SNMP agent"。我一般把超时调到5秒,重试次数2次。在Zabbix的SNMP接口配置里可以调。
4. 双协议并存时的典型故障与排查链路
4.1 SNMP能读但TCP连不上:先分清是哪个TCP
现场遇到"SNMP正常,TCP不通",第一反应是网关的TCP透传端口没开或者被占用。我这次网关的TCP透传端口设的是5020,连的时候要连网关IP的5020,不是变送器的502。很多人习惯性连502,结果连到网关自己的Modbus服务上,当然不通。
排查步骤:
- 确认网关TCP透传端口号,在网关配置里看。
- 用nc测端口:
nc -zv 192.168.10.60 5020。 - 通了之后用Modbus Poll连网关IP:5020,看是否能读到和直连变送器一样的数据。
- 如果读不到,查网关的透传目标IP是否指向变送器、变送器是否在线。
4.2 Zabbix报"SNMP agent item is not supported"
这个报错通常有三个原因:OID不存在、community不对、SNMP版本不匹配。排查顺序:
- 先在命令行用snmpwalk确认OID能读到值。命令行能读、Zabbix不能读,问题在Zabbix配置。
- 检查Zabbix主机的SNMP接口community是否和网关一致,注意大小写。
- 检查SNMP版本,网关是v2c,Zabbix也必须是v2c,选v1或v3都会失败。
- 检查Zabbix server到网关的UDP 161是否被防火墙拦。Zabbix server和网关不在同一网段时尤其要注意。
4.3 数值跳变或恒定不变
数值跳变通常是采集间隔太短、网关缓存没更新。把Zabbix更新间隔从10s调到30s或60s,观察是否稳定。恒定不变则可能是寄存器映射错了,读到了固定值寄存器,或者变送器本身死机。用Modbus Poll直连变送器确认原始值是否变化,能快速定位是变送器问题还是网关问题。
还有一种情况:温度小数位一直是0。这往往是因为小数寄存器没映射,或者Zabbix计算型监控项里小数除法写错了。检查计算表达式,确认除以10还是100,取决于小数位数。
| 现象 | 可能原因 | 验证方法 | 处理 |
|---|---|---|---|
| SNMP超时 | community错/防火墙/UDP161未开 | snmpwalk命令行测试 | 改community、放行端口 |
| TCP连不上 | 连错端口/透传未启用 | nc测端口 | 连网关透传端口 |
| 数值不变 | 寄存器映射错/设备死机 | Modbus Poll直连 | 修正映射、重启设备 |
| 数值跳变 | 采集间隔太短 | 调大间隔观察 | 改为30s以上 |
5. 几个容易被忽略的现场经验
5.1 单元ID和事务标识不是一回事
Modbus TCP里有个"单元标识"(Unit ID),在MBAP头的最后一个字节。当网关做透传时,它可能改写这个字段。如果变送器只认单元ID=1,而网关透传时填了0,就会不回包。调试时如果Modbus Poll能连但读不到,试试改单元ID。
事务标识是Modbus TCP用来匹配请求和响应的,一般工具自动处理,不用手动管。但如果你自己写代码发报文,事务标识要递增,否则响应匹配不上。
5.2 SNMP的OID命名要有规划
现场OID如果随便编,后期扩展会乱。建议按"企业号.设备类型.点位类型.序号"的规则来。比如1.3.6.1.4.1.8888.1.1.0是温度,1.3.6.1.4.1.8888.1.2.0是湿度,1.3.6.1.4.1.8888.2.x留给第二个变送器。这样Zabbix模板可以复用,换设备只改IP不改OID结构。
5.3 网关的SNMP trap和轮询要分清
有的网关支持SNMP trap,温湿度超限时主动上报。但Zabbix接收trap需要配trapper item和snmptrapd。如果项目只要趋势和告警,轮询就够了,trap是锦上添花。别为了trap把架构搞复杂,现场调试时间有限。
5.4 备用TCP通道的价值在排错期
双协议最大的好处在调试期。SNMP出问题时,TCP通道能让你快速确认变送器本身是否正常。我习惯在网关配置里保留一个TCP透传端口,平时不用,排错时连上Modbus Poll,五分钟就能定位问题在变送器还是网关还是Zabbix。
5.5 记录一份现场配置快照
调试完成后,把变送器IP、寄存器映射、网关OID映射、Zabbix主机配置、community全部记下来。下次换设备或者扩容,直接对照,不用重新摸一遍。我一般存成一个文本文件放在项目文档里,比翻说明书快得多。
6. 从单点调试到批量部署的扩展思路
单点调通之后,批量部署是下一个坎。十个变送器、十个网关,如果一个个配,效率太低。我的做法是:
第一,统一寄存器映射和OID规则。所有变送器用同一套寄存器布局,所有网关用同一套OID结构,只有IP和序号不同。这样Zabbix模板可以批量关联。
第二,用Zabbix自动发现。Zabbix支持SNMP OID的自动发现,可以扫描一个网段,发现网关后自动创建主机。但自动发现对OID规则要求高,前期规划要做好。
第三,网关配置批量导入。很多网关支持配置文件导入导出,配好一个之后导出,改IP和序号后批量导入,比网页点选快得多。
第四,监控项用模板。把温度、湿度的监控项、触发器、图形都做成模板,新主机关联模板即可,不用重复建监控项。
批量部署时最容易出问题的是IP冲突和community不一致。IP冲突会导致部分设备离线,community不一致会导致SNMP采集失败。部署前用IP扫描工具确认网段空闲地址,部署后用snmpwalk批量验证。
提示:批量部署前先在一个网段做小规模验证,确认模板、OID、community都正确,再铺开。现场返工的成本远高于前期验证。
7. 关于协议选型的一点个人体会
做了几个温湿度监控项目之后,我的体会是:协议选型没有绝对优劣,关键看监控平台和团队习惯。如果团队用Zabbix、PRTG这类网管平台,SNMP是首选,标准化程度高,接入快。如果团队有自己的采集程序,Modbus TCP直连更灵活,不用经过网关转换,少一层故障点。
双协议并存的价值,更多体现在过渡期和排错期。等系统稳定运行后,日常其实只用其中一种。但现场调试那几天,多一个通道就多一条退路。我这次实践里,SNMP通道最终接入了Zabbix做长期监控,TCP通道保留在网关配置里,偶尔用Modbus Poll抽查原始数据,确认变送器没有漂移。
最后分享一个小技巧:温湿度变送器的精度受供电和探头位置影响很大。调试时如果发现数值和标准表差得多,先别改寄存器,把探头放到通风、远离热源的位置,稳定十分钟再看。很多"数据不准"其实是安装位置问题,不是协议问题。