2015-05-09 164 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 }