简单数据类型主要包括表2-5中的数值型、字符串型、布尔型、标识符型等。下面列举了MIB中常用的数据类型,建议按照以下方式定义和使用(实际上SNMP中对一些简单的数据类型进行了重定义,其体现在SMI中)。
BOOLEAN:使用BOOLEAN定义类型别名时,将该类型别名取为表示“true”状态的名称。如:
Married ::= BOOLEAN
而不建议使用:
MaritalStatus ::= BOOLEAN
INTEGER:定义包含最大和最小边界时,注意以下的方法——限制只取两个值f?irst和last。
DayOfWeeks ::= INTEGER {f?irst(1), last(7)} (f?irst | last)
限制取值范围为f?irst和last区间内的值:
DayOfWeeks ::= INTEGER {f?irst(1), last(7)} (f?irst .. last)
dayOfWeeks DayOfWeeks ::= 2
ENUMERATED:在定义不少于两个状态时,或现在是两种状态而将来可能有多于两种状态的情况时,建议使用枚举型。
--以枚举型定义星期数据类型
DayOfWeeks2 ::= ENUMERATED {sunday(0), monday(1), tuesday(2),wednesday(3),
thursday(4), friday(5), saturday(6)}
需要使用值标识符表示具体的值内容,不使用数值相等的数字,其枚举之外的数值理所当然地不能使用,如:
-- 使用值标识符 sunday 表示具体的值
f?irstDay DayOfTheWeek ::= sunday
而不应该使用:
f?irstDay DayOfTheWeek ::= 0
whichDay DayOfTheWeek ::= 8
便于后续扩展的写法是加入扩展符“…”:
-- 第一版
MaritalStatus ::= ENUMERATED {single, married}
-- 后续(升级)版本
MaritalStatus ::= ENUMERATED {single, married, …, widowed}
MaritalStatus ::= ENUMERATED {single, married, …, widowed, divorced}
Bitstring:位类型,其字串格式和长度不作规定,可以使用不同进制表示。
hexvalue BIT STRING ::= '0123456789ABCDEF'H
bitvalue BIT STRING ::= '1001'B
当然对该类型也可以做长度限制,使用限制后的类型定义时其位数必须为限定的长度:
MyBitField ::= BIT STRING (SIZE (10))
m1 BitField ::= '1010001000'B
m2 BitField ::= '288'H --same as m1
由于bit类型的特点,可以使用BIT STRING定义类似枚举型的数据。
DayOfWeeks3 ::= BitString {monday (0), tuesday (2), wednesday (3), thursday (4),
friday (5), saturday (6), sunday (7)}
Octet string:与Bitstring类型的区别是,使用Octet string定义的数据长度要求为8的整数倍,这也是octet单词含义的体现——八位比特组。一般所使用的ASCII字符,都是能满足要求的。在SNMP文献RFC1213、MIB-II中定义的DisplayString就是该类型。
DisplayString ::= OCTET STRING
-- 使用
whoyouare DisplayString ::= "Chanson"
CharacterString:字符串类型,如UniversalString、PrintableString、NumericString、IA5String、BMPString、UTF8String等。它们的主要区别是使用的字符集标准不一样。
Null:代表空类型,用于表示在定义的序列中可以为空的部分。如SNMP中Get请求报文中的值部分为空值,表示数据未知。
Object identif?ier:对象标识符OBJECE IDENTIFIER,这两个单词都是ASN.1中的保留字。对象标识符在SNMP中是最重要的数据类型之一,为此下面给出了其类型定义和值定义的BNF形式。
类型定义:
ObjectIdentif?ierType ::=OBJECT IDENTIFIER
值定义:
ObjectIdentif?ierValue ::=
"{" ObjIdComponentsList "}"
| "{" Def?inedValue ObjIdComponentsList "}"
ObjIdComponentsList ::=
ObjIdComponents
| ObjIdComponents ObjIdComponentsList
ObjIdComponents ::=
NameForm
| NumberForm
| NameAndNumberForm
| Def?inedValue
NameForm ::= identif?ier
NumberForm ::= number | Def?inedValue
NameAndNumberForm ::=
identif?ier "(" NumberForm ")"
让我们再来回顾下,上述的值定义解开后的内容是怎样的。首先,发现了无法确定含义的单词“Def?inedValue”,也有表2-4中的基本词汇“identif?ier”“number”,它们都是作为产生式的终结符。只有明确了这些终结符,才能产生最终的内容。其次,还发现“Def?inedValue”出现在多个产生式中,很明显其含义是不一样的。实际上它被定义在文献《ITU-T Rec. X.680》中。在这里的每个产生式中分别为对应类型的值引用。“identif?ier”则是具体的对象标识符和值的名称,为具体的字符串;“number”为非负的整数;引号中作为终结符的大括号直接照写。将这些终结符不断地向上层替换,就能得到ObjectIdentif?ierValue的最终结果:由具体的字符串、具体的数字或它们的混合方式组成,最终由大括号包含。它们可以是以下的形式:
{ iso standard 8571 application-context (1) }
{ 1 0 8571 1 }
-- 实际应用中也可以表示如下
iso.standard.8571.application-context(1)
1.0.8571.1
其中iso为值标识符,其对应的值为1,其他符号与值的含义类似。当然这些标识符和值,是由某些组织或企业申请和定义的,具有唯一性和明确含义的。
日期和时间类型:最常见的是以UTC(Coordinated Universal Time,协调世界时,UTC三个字母缩写为英文和法文折中的记法)记法表示的时间。该记法的方式是在时间字串后紧跟一个大写的字母Z,或者在小时和分钟后紧跟“+”或“-”号,表示与UTC时间的差。比如下面的ASN.1允许的时间记法:
-- 当前UTC时间:2014-03-06 01:20:00
140306012000Z
-- 对应的北京时间为加八个时区(即8个小时),记法为:
140306092000+0800