2016-07-09 102 views
0

我已经使用snmp4j实现了SNMP代理,并且遇到了一些问题,以及如何向SNMP管理器正确报告SNMPv3陷阱/通知。该实现设置为管理由instanceId索引的值表。当您查询代理时,您会根据与OID值关联的特定链接实例收到以“.1”,“.2”,“.3”等为后缀的各个字段的OID。所以查询结果如下:在SNMP陷阱中发送表索引

----------------------------------------- 
| Entity | OID   | Value  | 
----------------------------------------- 
| Link1 | linkAlias.1 | Link 1  | 
| Link2 | linkAlias.2 | Link 2  | 
| Link1 | linkState.1 | 1   | 
| Link2 | linkState.2 | 3   | 
| Link1 | linkText.1 | UP   | 
| Link2 | linkText.2 | INITIALIZING | 
----------------------------------------- 

这很好。但是,我需要能够以类似的方式发送陷阱,以便与陷阱一起发送表的索引。这样,当链接状态发生变化时,可以清除由SNMP查询触发的警报。我尝试在实例代码块中简单地添加instanceId作为varbind,但实体始终报告为通用“链接”。有没有人遇到过这可以帮我解决这个问题?任何东西都很赞赏。

public static void updateLinkStatus(int instanceId, LinkState status) 
{ 
    boolean varChanged = false; 

    Variable[] currentManagedObject = currentManagedObjects.get(instanceId); 
    if(currentManagedObject != null) 
    { 
     // If we are managing this object 
     if(((Integer32)currentManagedObject[1]).toInt() != status.value) 
      varChanged = true; 

     // Update the managed object Status Integer and Status Text 
     currentManagedObject[1] = new Integer32(status.value); 
     currentManagedObject[2] = new OctetString(status.getLinkStateText()); 
    } 
    else 
    { 
     varChanged = true; // No previous record to check against 
    } 

    // Send trap now if not equal to previous value 
    if(varChanged) 
    { 
     OID trapOid = null; 
     int linkState = LinkState.UNKNOWN.value; // Will be overridden 
     String linkStateText = null; 

     if(status == LinkState.DOWN) 
     { 
      trapOid = oidLinkDown; 
      linkState = LinkState.DOWN.value; 
      linkStateText = LnkState.DOWN.getLinkStateText(); 
     } 
     else if(status == LinkState.MISCONFIGURED) 
     { 
      trapOid = oidLinkMisconfigured; 
      linkState = LinkState.MISCONFIGURED.value; 
      linkStateText = LinkState.MISCONFIGURED.getLinkStateText(); 
     } 
     else if(status == LinkState.UP) 
     { 
      trapOid = oidLinkUp; 
      linkState = LinkState.UP.value; 
      linkStateText = LinkState.UP.getLinkStateText(); 
     } 
     else if(status == LinkState.INITIALIZING) 
     { 
      trapOid = oidLinkInitializing; 
      linkState = LinkState.INITIALIZING.value; 
      linkStateText = LinkState.INITIALIZING.getLinkStateText(); 
     } 
     else 
     { 
      // Theoretically, should never change to LinkState.UNKNOWN - no trap available for it 
      linkState = LinkState.UNKNOWN.value; 
      linkStateText = LinkState.UNKNOWN.getLinkStateText(); 
     } 

     // Create variable bindings for V3 trap 
     if(trapOid != null) 
     { 
      List<VariableBinding> variableBindings = new ArrayList<VariableBinding>(); 
      variableBindings.add(new VariableBinding(oidLinkState, new Integer32(linkState))); 
      variableBindings.add(new VariableBinding(oidLinkText, new OctetString(linkStateText))); 
      variableBindings.add(new VariableBinding(oidLinkInstanceID, new Integer32(instanceId))); 
      //I've tried the below varbind too and it also doesn't work 
      //variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId))); 
      agent.sendTrap_Version3(trapOid, variableBindings); 
     } 
    } 
} 

编辑:

注意:联系是动态配置的,所以我不能简单地定义一个单独的OID的各个环节;我在MIB中定义基础OID并需要动态添加索引。

回答

0

我发现了解决方案。我试图在变量绑定实例索引只需添加到OID和发送NULLOBJ作为值,像这样:

variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId))); 

但经理拒绝消息。因此,我增加了实例索引的OID 以及像这样的变量绑定值:

variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId), new Integer32(instanceId))); 

和经理报告为链接1链路2等与SNMP表一致的实体。