在这篇文章中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请求?
答案 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()
)