2015-05-09 163 views
3

我在C#中編寫我的第一個SNMP代理,我想通過SNMP GET請求公開一些系統事件信息。C#SNMP代理 - 代表MIB中的複雜類型

在C#側,所有的系統事件是由一個簡單的類表示:

public class MySystemEvent 
{ 
    public int Id { get;set; } 
    public string Message { get; set; } 
    public DateTime Occurred { get; set; } 
} 

我想暴露每個這些特定事件(事件ID確定)爲在MIB一個單獨的節點,但我不完全確定如何創建與上述類相對應的自定義ASN.1複雜類型。我知道我可以使用SEQUENCE來表示這些,但不知道我是否正確使用它們。

什麼我迄今所做的:

enterprise OBJECT IDENTIFIER  ::= { private 1 } 
penNode OBJECT IDENTIFIER   ::= { enterprise <PEN> } 
customSystemNode OBJECT IDENTIFIER ::= { penNode 1 } 
events OBJECT IDENTIFIER   ::= { customSystemNode 1 } 

Event ::= SEQUENCE { 
    id Integer32, 
    message DisplayString, 
    occurred DateAndTime 
} 

firstSpecificEvent OBJECT-TYPE 
    SYNTAX Event 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "First specific event." 
    INDEX { eventId } 
    ::= { events 1 } 

eventId OBJECT-TYPE 
    SYNTAX Integer32 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "Event Id." 
    ::= { firstSpecificEvent 1 } 

eventMessage OBJECT-TYPE 
    SYNTAX DisplayString 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "Event message." 
    ::= { firstSpecificEvent 2 } 

eventOccurred OBJECT-TYPE 
    SYNTAX DateAndTime 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "Event occurred." 
    ::= { firstSpecificEvent 3 } 

以上MIB定義爲以下三種:

  • 私人
    • 企業
    • penNode
      • customSystemNode
      • 事件
        • firstSpecificEvent
          • EVENTID
          • 事件消息
          • eventOccurred

我想添加的是與「events」節點具有相同結構的多個其他事件,例如,在firstSpecificEvent之後我想有:

  • secondSpecificEvent
    • EVENTID
    • 事件消息
    • eventOccurred

我如何在不增加單獨的事件ID,事件消息和eventOccurred每種特定事件的OBECT-TYPE定義? 是否可以定義一個允許以下內容的CustomEventComplexType?

firstSpecificEvent OBJECT-TYPE 
    SYNTAX CustomEventComplexType 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "First specific event." 
    ::= { events 1 } 

secondSpecificEvent OBJECT-TYPE 
    SYNTAX CustomEventComplexType 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "Second specific event." 
    ::= { events 2 } 

thirdSpecificEvent OBJECT-TYPE 
    SYNTAX CustomEventComplexType 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "Third specific event." 
    ::= { events 3 } 

etc. 
+0

你應該建立一個表。 –

+0

@LexLi謝謝!這就是我最終做的事情,但知道這是正確的做法真是太好了。我會盡快爲更新的解決方案添加一個答案。 –

回答

1

我最終以@LexLi建議的方式解決了這個問題,方法是創建一個事件表。這樣,對於行條目的定義,OBJECT-TYPE定義只需要一次。

enterprise OBJECT IDENTIFIER  ::= { private 1 } 
penNode OBJECT IDENTIFIER   ::= { enterprise <PEN> } 
customSystemNode OBJECT IDENTIFIER ::= { penNode 1 } 

Event ::= SEQUENCE { 
    id Integer32, 
    message DisplayString, 
    occurred DateAndTime 
} 

eventTable OBJECT-TYPE 
    SYNTAX SEQUENCE OF Event 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "Table containing event information." 
    ::= { customSystemNode 1 } 

eventTableRowEntry OBJECT-TYPE 
    SYNTAX Event 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "A row entry in the event table." 
    INDEX { eventId } 
    ::= { eventTable 1 } 

eventId OBJECT-TYPE 
    SYNTAX Integer32 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "Event id." 
    ::= { eventTableRowEntry 1 } 

eventMessage OBJECT-TYPE 
    SYNTAX DisplayString 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "Event message." 
    ::= { eventTableRowEntry 2 } 

eventOccurred OBJECT-TYPE 
    SYNTAX DateAndTime 
    MAX-ACCESS read-only 
    STATUS current 
    DESCRIPTION 
     "Event occurred timestamp." 
    ::= { eventTableRowEntry 3 }