0
PDU pdu = new PDU();
pdu.setType(PDU.SET);

pdu.add(new VariableBinding(new OID("1.3.6.1.4.1.100.1.1"), new Counter64(System.currentTimeMillis())));
pdu.add(new VariableBinding(new OID("1.3.6.1.4.1.100.2.1"), new OctetString("some string")));

TransportMapping transport = null;
Snmp snmp = null;

try {
    transport = new DefaultUdpTransportMapping();
    transport.listen();

    snmp = new Snmp(transport);
    snmp.send(pdu, getCommunityTarget());
} catch (Exception e) {
    // error occurred
}

这就是我发送 snmp 陷阱以发出警报的方式。我在 snmp 代理中设置一个变量并在 MIB 浏览器中浏览它。我想知道如果我将 pdu 类型设置为 PDU.TRAP 会怎样。它在端口 162 而不是 161 上工作,我在 MIB 浏览器中看不到它,但在 Trap Receiver 中。有什么区别?使用 PDU.TRAP 的目的是什么?我的代理人怎么能抓住它?发出和清除警报的最佳做法是什么?

4

2 回答 2

2

不同之处在于角色:SET 由经理针对代理执行,而 TRAP 则相反。基本的 Snmp4j 仅支持 SNMP 管理器的实现。也可以实现代理的某些方面,但不是微不足道的。但是,很难说出您实际上正在尝试实现这两个中的哪一个。

于 2013-11-07T12:16:47.360 回答
1

在实现 SNMP 实体时,通常最好实现所谓的“陷阱定向轮询”概念,而不是简单的“陷阱发送者”。对于后者 SNMP4J 可以开箱即用,对于第一个 SNMP4J-Agent 可以使用。这也是在 Apache 2 Open Source 许可下获得许可的。

由于陷阱可能会在网络上丢失,因此陷阱定向轮询方法具有许多优点,尽管它需要更多(很少)努力来实现代理部分。

关于原来的问题:

  • 发送 SET pdu 时,您要求命令响应者(代理)更改其实体的一些信息。
  • 在发送 TRAP 或更好的 NOTIFICATION pdu 时,您希望通知命令生成器(管理器)有关事件。使用陷阱定向轮询概念,命令生成器还将定期(例如每 5 分钟)在 *LastChanged 对象上发送 GET 请求,以有效地检测命令响应者 MIB 的某些(关键)子树中的数据更改。如果检测到更改(通过通知 PDU 或轮询,则命令生成器从命令响应器请求更改的数据。
于 2014-02-02T10:15:00.093 回答