如何用pysnmp构造自定义VarBinds字典并发送自定义MIB陷阱?
我来帮你把用pysnmp发送带自定义MIB陷阱的关键环节理清楚,尤其是你问到的trapObjects参数构造和自定义VarBinds字典创建这两点:
使用pysnmp发送带自定义MIB的陷阱:VarBinds构造与陷阱参数处理
一、创建自定义VarBinds字典
VarBinds本质是OID与对应值的映射集合,pysnmp支持两种构造方式,你可以根据需求选择:
方式1:用MIB符号名构造(推荐,可读性高)
如果已经加载了自定义MIB,直接用MIB中定义的符号名来关联值,需要先确保MIB被正确加载:
from pysnmp.smi import builder # 添加自定义MIB路径并加载(替换为你的MIB文件路径) self.snmpEngine.getMibBuilder().addMibSources(builder.DirMibSource('/path/to/your/custom/mibs')) self.snmpEngine.getMibBuilder().loadModules('MY-MIB') # 替换为你的MIB名称
然后构造VarBinds字典:
from pysnmp.proto.rfc1902 import ObjectName, Integer, OctetString, Gauge32 # 假设自定义MIB中有deviceTemp(INTEGER)、deviceStatus(OCTET STRING)、deviceLoad(Gauge32)三个节点 trapObjects = { ObjectName('MY-MIB::deviceTemp'): Integer(28), ObjectName('MY-MIB::deviceStatus'): OctetString('warning'), ObjectName('MY-MIB::deviceLoad'): Gauge32(75) }
方式2:直接用原始OID构造
如果不想依赖MIB符号名,也可以直接用OID的元组或字符串来构造,值的类型要和MIB定义一致:
# 对应上面MIB节点的OID示例 trapObjects = { (1, 3, 6, 1, 4, 1, 12345, 1, 1): Integer(28), (1, 3, 6, 1, 4, 1, 12345, 1, 2): OctetString('warning'), (1, 3, 6, 1, 4, 1, 12345, 1, 3): Gauge32(75) }
二、完整的sendTrap方法实现
下面把你的代码补全,重点处理NotificationType的解析和sendVarBinds的调用:
from pysnmp.hlapi import * from pysnmp.smi import view def sendTrap(self, trapName, trapObjects): mibViewController = view.MibViewController(self.snmpEngine.getMibBuilder()) ntfOrg = ntforg.NotificationOriginator() ntfOrg.snmpContext = self.snmpContext # 构造并解析NotificationType:关联陷阱OID和自定义VarBinds notification_type = rfc1902.NotificationType( ObjectName(trapName), # 陷阱的MIB符号名或原始OID,比如'MY-MIB::deviceAlertTrap' objects=trapObjects ).resolveWithMib(mibViewController) # 必须调用该方法解析MIB映射 # 发送陷阱 ntfOrg.sendVarBinds( self.snmpEngine, 'my-notification', # 预先配置的通知目标名称 None, '', # contextEngineId(留空自动生成)、contextName notification_type ) # 等待陷阱发送完成 self.snmpEngine.transportDispatcher.runDispatcher()
关键注意事项
- 自定义MIB加载:必须确保MIB被正确加载,否则符号名无法解析为OID,会导致发送失败。
- 类型匹配:VarBinds的值类型必须严格匹配MIB中定义的类型(比如MIB定义为Gauge32,就用
rfc1902.Gauge32构造值),否则接收端可能无法正确解析。 - 通知目标配置:
'my-notification'是需要预先配置的接收端目标,示例配置如下:# 配置SNMPv2c或SNMPv3的目标参数 config.addTargetAddr( self.snmpEngine, 'my-notification', transport.UdpTransportTarget(('192.168.1.100', 162)), # 接收端IP和端口 config.addTargetParams(self.snmpEngine, 'my-params', 'public', 'noAuthNoPriv') # SNMPv2c示例 )
内容的提问来源于stack exchange,提问作者Chandra Sekhar
相关产品推荐
相关产品推荐

