
以太网温湿度记录仪(网口温湿度变送器/记录仪)在机房监控里常见的两种数据获取方式:
本文聚焦后者在实测工程中的时延表现,并用 Wireshark + Python 抓包验证,数据落 InfluxDB,架构跑在腾讯云侧做汇聚。
先确认记录仪固件能力,别想当然:
PoE 供电下注意:设备启动后 SNMP Agent 起来时间晚于网口 up,管理站别在 boot 阶段误判离线。
[记录仪A PoE]──switch──┬──[边缘网关/管理站B] 本地测试
└──Internet──[腾讯云CVM/CLB] 远端NMS+trap接收
InfluxDB + Telegraf + Python trap daemon 在云侧或边缘侧均可轮询场景另算:
from pysnmp.entity import engine, config
from pysnmp.carrier.asyncore.dgram import udp
from pysnmp.entity.rfc3413 import ntfrcv
import datetime, requests
app = engine.SnmpEngine()
config.addTransport(app, udp.domainName, udp.UdpTransport().openServerMode(('0.0.0.0', 162)))
config.addV1System(app, 'my-area', 'public') # v2c community,生产用v3
ntfrcv.NotificationReceiver(app, cbFun)
def cbFun(snmpEngine, stateReference, contextEngineId, contextName,
varBinds, cbCtx):
execCtx = snmpEngine.observer.getExecutionContext('rfc3412.receiveMessage:request')
ts = datetime.datetime.utcnow().isoformat()+'Z'
fields = {}
tags = {'host': execCtx['transportAddress'][0]}
for oid, val in varBinds:
fields[str(oid)] = str(val)
# 推InfluxDB v2 API 或经Telegraf
line = f"trap,src={tags['host']} vars=\"{fields}\",ts=\"{ts}\""
requests.post('http://localhost:8186/write', data=line.encode()) # 示例,实际拼Line Protocol
print(ts, fields)
app.transportDispatcher.jobStarted(1)
try:
app.transportDispatcher.runDispatcher()
except KeyboardInterrupt:
app.transportDispatcher.closeDispatcher()注意:pysnmp CoRoutine 调度下阻塞调用会拖慢处理;生产建议异步或交 snmptrapd 落文件后 Telegraf tail。
import time, requests
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient(host='192.168.1.10', port=502, timeout=1)
T_POLL = 5.0
last = 0.0
while True:
t0 = time.time()
if client.connect():
rr = client.read_holding_registers(0, 2, unit=1)
if not rr.is_error():
temp = rr.registers[0]/10.0
humi = rr.registers[1]/10.0
line = f"env,host=roomA temp={temp},humi={humi} {int(t0 * 1e9)}"
requests.post('http://localhost:8186/write', data=line.encode())
dt = time.time()-t0
sleep_for = max(0, T_POLL - dt)
time.sleep(sleep_for)Modbus TCP 轮询受连接复用影响,别每次建连;长连接时注意对端空闲断开,加 keepalive 或定期重连。
抓包过滤:
udp.port==162 || tcp.port==502snmp/udp,看 Agent IP → NMS IP,payload 含绑定变量 frame.time_epoch 补充:云侧 CLB/DNS/安全组需放通 UDP 162 入站;腾讯云 CVM 默认安全组拒入站,别漏。
实验室同网段 + 跨城混合测试,T_s=10s,T_poll=5s,滞回去抖 1 次确认。
场景 | 检测→入库端到端 p50 | p95 | 说明 |
|---|---|---|---|
Trap 本地网段 | 120–250ms | 400ms | 事件触发即发,无等待 |
Trap 跨城到腾讯云CVM | 300ms–1.2s | 2s | NAT遍历后UDP出公网,CLB转发 |
轮询本地网段 T_poll=5s | 2.5s(均值) | 5s+采集 | 最坏等待≈T_poll |
轮询跨城 Modbus TCP | 5–8s | 15s | 管理站主动连502,防火墙策略/长连接超时 |
轮询经边缘网关代理后上云 | 5–6s | 同左 | 网关轮询,MQTT上报,批处理 |
关键观察:
Trap 把"事件传播时延"从轮询周期等待中解耦出来,工程上更适合作越限告警通道;代价是 UDP 不可靠、管理平面暴露、设备端事件模型需验证。生产系统通常是混合架构:边缘轮询保时序数据,Trap/inform 保事件实时性,云侧统一收敛、去重、幂等入库 InfluxDB,大屏与告警分离。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。