上QQ阅读APP看书,第一时间看更新
2.7 宏定义
在SNMP中大量使用了宏,有必要作个了解。宏作为ASN.1中对数据类型的一种扩展机制,提供了一种新的定义对象的形式。与构造类型不同的是:宏可以定义新的标记形式,并且能构造更复杂的结构,描述更详细的语义。使用它定义的类型或值都具有相同的标记形式,因为它们都是宏定义的“模板”的实例。
与模块的定义类似,宏的定义也很简单:MACRO作为宏定义的关键字,由BEGIN开始,END结束。其定义形式如下:
<macro name> MACRO ::= BEGIN TYPE NOTATION ::= -- 类型定义 VALUE NOTATION ::= -- 值定义 END
ASN.1中标记方式的本质就是对类型的和类型值的定义。一个对象一旦完成对类型和值的赋值,该对象也就确定了。上述的TYPE NOTATION和VALUE NOTATION就是对类型和值的定义。下面看看RFC1212中定义的OBJECT-TYPE宏(省略了部分内容),有了前面的知识应该很容易看懂该宏的实现:
OBJECT-TYPE MACRO ::= BEGIN TYPE NOTATION ::= --双引号作为终结符,里面的内容在使用时直接照写 -- RFC1155中的 ObjectSyntax "SYNTAX" type(ObjectSyntax) "ACCESS" Access "STATUS" Status DescrPart -- value (VALUE X) 该格式将value值限制为X类型 VALUE NOTATION ::= value (VALUE ObjectName) Access ::= "read-only" | "read-write" | "write-only" | "not-accessible" Status ::= "mandatory" | "optional" | "obsolete" | "deprecated" DescrPart ::= "DESCRIPTION" value (description DisplayString) | empty END
以下是使用OBJECT-TYPE宏定义对象的例子:
alarmNumber OBJECT-TYPE SYNTAX INTERGER ( 0 .. 32767 ) MAX-ACCESS read-only STATUS current DESCRIPTION "how many real alarm now" ::= { zcqRealAlarm 1 }
注意
宏一般在模块中定义,并导出供其他模块使用。由宏定义的对象的传输编码与所使用的具体类型一致,也就是上述代码注释部分的X类型。