访问收到的 TRAP 的 varBinds
Access to varBinds of received TRAP
我不知道如何从代码示例访问 varBind。我可以打印它,但是如果我想存储它或传递给方法或 class?
怎么办?
即使我将它存储在 class 中,我也无法进一步访问它。
class TrapReceiver
def __init__(self):
# Create SNMP engine with autogenernated engineID and pre-bound
# to socket transport dispatcher
self.snmpEngine = engine.SnmpEngine()
# Transport setup
# UDP over IPv4, first listening interface/port
config.addTransport(
self.snmpEngine,
udp.domainName + (1,),
udp.UdpTransport().openServerMode(('127.0.0.1', 162))
)
# SNMPv1/2c setup
# SecurityName <-> CommunityName mapping
config.addV1System(self.snmpEngine, 'my-area', 'public')
# Callback function for receiving notifications
# noinspection PyUnusedLocal,PyUnusedLocal,PyUnusedLocal
def cbFun(self,snmpEngine, stateReference, contextEngineId, contextName,
varBinds, cbCtx):
for varBind in varBinds:
oid, value = varBind
trap_source = str(oid)
trap_val = int(value)
#TODO: return trap_source, trap_val
def run(self):
# Register SNMP Application at the SNMP engine
ntfrcv.NotificationReceiver(self.snmpEngine, self.cbFun)
self.snmpEngine.transportDispatcher.jobStarted(1) # this job would never finish
# Run I/O dispatcher which would receive queries and send confirmations
try:
self.snmpEngine.transportDispatcher.runDispatcher()
except:
self.snmpEngine.transportDispatcher.closeDispatcher()
raise
您不能 "return" 回调函数中的任何内容。因为它的调用者(主循环)对其 return 值不感兴趣。
因此您应该使用 cbCtx
或其他一些全局对象(例如 dict
)将回调函数中收到的信息传递给应用程序的其他部分。 cbCtx
对象最初可以传递给 NotificationReceiver
,然后它出现在回调函数中。
因此,例如,您可以在一个线程中设置通知接收器,将接收到的数据推送到 cbCtx
数据结构(例如,它可以是 Queue
),然后另一个线程从该 Queue
并处理它们。
或者您可以直接在回调函数内处理接收到的数据。只要确保它是 non-blocking.
我不知道如何从代码示例访问 varBind。我可以打印它,但是如果我想存储它或传递给方法或 class?
怎么办?即使我将它存储在 class 中,我也无法进一步访问它。
class TrapReceiver
def __init__(self):
# Create SNMP engine with autogenernated engineID and pre-bound
# to socket transport dispatcher
self.snmpEngine = engine.SnmpEngine()
# Transport setup
# UDP over IPv4, first listening interface/port
config.addTransport(
self.snmpEngine,
udp.domainName + (1,),
udp.UdpTransport().openServerMode(('127.0.0.1', 162))
)
# SNMPv1/2c setup
# SecurityName <-> CommunityName mapping
config.addV1System(self.snmpEngine, 'my-area', 'public')
# Callback function for receiving notifications
# noinspection PyUnusedLocal,PyUnusedLocal,PyUnusedLocal
def cbFun(self,snmpEngine, stateReference, contextEngineId, contextName,
varBinds, cbCtx):
for varBind in varBinds:
oid, value = varBind
trap_source = str(oid)
trap_val = int(value)
#TODO: return trap_source, trap_val
def run(self):
# Register SNMP Application at the SNMP engine
ntfrcv.NotificationReceiver(self.snmpEngine, self.cbFun)
self.snmpEngine.transportDispatcher.jobStarted(1) # this job would never finish
# Run I/O dispatcher which would receive queries and send confirmations
try:
self.snmpEngine.transportDispatcher.runDispatcher()
except:
self.snmpEngine.transportDispatcher.closeDispatcher()
raise
您不能 "return" 回调函数中的任何内容。因为它的调用者(主循环)对其 return 值不感兴趣。
因此您应该使用 cbCtx
或其他一些全局对象(例如 dict
)将回调函数中收到的信息传递给应用程序的其他部分。 cbCtx
对象最初可以传递给 NotificationReceiver
,然后它出现在回调函数中。
因此,例如,您可以在一个线程中设置通知接收器,将接收到的数据推送到 cbCtx
数据结构(例如,它可以是 Queue
),然后另一个线程从该 Queue
并处理它们。
或者您可以直接在回调函数内处理接收到的数据。只要确保它是 non-blocking.