Pysnmp:如何在运行中更改PDU并同时向多个设备发送SNMP请求?

时间:2015-10-25 12:12:32

标签: pysnmp

在这篇文章中http://pysnmp.sourceforge.net/examples/current/v1arch/manager/cmdgen/getnext-v1.html我能够一次为一台设备动态更改pdu,但我很难同时向一台设备发送请求。
我尝试了以下操作:

transportDispatcher.registerTransport(
  udp.domainName, udp.UdpSocketTransport().openClientMode()
)
transportDispatcher.sendMessage(
  encoder.encode(reqMsg), udp.domainName, ('demo.snmplabs.com', 161)
)
transportDispatcher.jobStarted(1)
transportDispatcher.registerTransport(
  udp.domainName, udp.UdpSocketTransport().openClientMode()
)
transportDispatcher.sendMessage(
  encoder.encode(reqMsg), udp.domainName, ('192.168.0.49', 161)
)
transportDispatcher.jobStarted(1)

但是我收到以下错误:“pysnmp.carrier.error.CarrierError:Transport(1,3,6,1,6,1,1)已经注册”。 那么如何在运行中更改PDU并同时向多个设备发送SNMP请求?

1 个答案:

答案 0 :(得分:0)

严格来说,您不是在动态更改PDU,而是在构建不同的SNMP消息并通过相同的网络传输独立发送。

您的代码存在的问题是您尝试在相同的SNMP传输ID下注册多个UDP套接字。您不需要这样,因为您可以通过单个套接字将UDP数据报发送到多个目的地。

因此,运输注册只能在您的代码中执行一次:

# one-time initialization
transportDispatcher.registerTransport(
  udp.domainName, udp.UdpSocketTransport().openClientMode()
)

# messaging
while True:
    transportDispatcher.sendMessage(
        encoder.encode(reqMsg), udp.domainName, ('demo.snmplabs.com', 161)
    )
    transportDispatcher.jobStarted(1)
    ...

附注:DNS解析器不是异步的,请确保其运行速度足够快或使用IP地址来寻址代理。

如果由于某种原因需要多个UDP套接字,请为它们使用不同的SNMP传输ID进行注册和使用:

transportDispatcher.registerTransport(
    udp.domainName + (1,), udp.UdpSocketTransport().openClientMode()
)
transportDispatcher.registerTransport(
    udp.domainName + (2,), udp.UdpSocketTransport().openClientMode()
)