我正在尝试了解SNMP陷阱的格式。我正在将一段代码从Windows移植到发送SNMP陷阱的linux。 windows代码使用内置库(一些函数包括SnmpStartup,SnmpSetRetransmitMode。可能称为WinSNMP),因此在移植到Linux时无法保留该代码。
我找到了一个很好的名为SNMP ++的库,它能够轻松发送SNMP陷阱。
据我了解,SNMP陷阱的前两个变量绑定(vb)字段必须符合特定格式。第一个vb是sysuptime(基本上是陷阱的时间戳),它具有众所周知的OID 1.3.6.1.2.1.1.3.0
。
第二个vb是陷阱的ID。我无法在任何地方找到任何文档,但SNMP ++为陷阱的ID提供了1.3.6.1.6.3.1.1.4.1.0
的OID(它的值是我们发送的陷阱的OID)。它使用pdu.set_notify_id函数设置。
这是另一个众所周知的OID,在发送陷阱时必须存在吗? Windows库根本不使用此OID。它将ID字段的OID设置为我们发送的OID,因此OID及其值设置为相同的东西。看起来它是手动完成的,因此原始编码器可能无法很好地理解格式。
那么,哪一个是正确的?
windows:
1.3.6.1.4.1.XXXX.2.1.51 -> 1.3.6.1.4.1.XXXX.2.1.51
SNMP++:
1.3.6.1.6.3.1.1.4.1.0 -> 1.3.6.1.4.1.XXXX.2.1.51
为什么我找不到有关此1.3.6.1.6.3.1.1.4.1.0
值的任何文档?它似乎没有在我读过的任何RFC中。谷歌搜索OID给出结果,但他们没有解释它的用途。
答案 0 :(得分:1)
对于任何SNMP问题,请从IETF SNMP RFC文档开始。显然,TRAP v2必须具有两个对象,如RFC 3416第22页所述
http://tools.ietf.org/search/rfc3416#page-22
我只能说WinSNMP不遵循惯例,它不符合标准,应该由Microsoft修复。
答案 1 :(得分:-1)
/**
* TrapType defines the type of SNMPv2/SNMPv3 trap,
* this is defined in the SNMPv2-MIB as snmpTrapOID.0
* (.1.3.6.1.6.3.1.1.4.1.0) with an OID value of one
* of the following
*/
public static final String SNMP_TRAP_OID = "1.3.6.1.6.3.1.1.4.1.0";
/** coldStart OID */
public static final String COLDSTART_OID = "1.3.6.1.6.3.1.1.5.1";
/** warmStart OID */
public static final String WARMSTART_OID = "1.3.6.1.6.3.1.1.5.2";
/** linkDown OID */
public static final String LINKDOWN_OID = "1.3.6.1.6.3.1.1.5.3";
/** linkUp OID */
public static final String LINKUP_OID = "1.3.6.1.6.3.1.1.5.4"