2016-07-09 37 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表一致的實體。