文章目录
摘要
本章讲述SNMP SMI的语法部分,如何编写MIB文件。参考RFC1902和RFC1903
一、SMI下的宏的类型
MODULE-IDENTITY
该宏用于提供每个MIB模块的信息,例如更新时间,开发组织信息联系等。
OBJECT-IDENTITY
该宏用于定义有关对象描述符分配的信息,即是OID(节点的唯一标识)
OBJECT-TYPE
该宏用于定义管理节点,实际管理的对象
NOTIFICATION-TYPE
该宏用于定义主动传输信息的节点,用于snmp trap(设备发生某些异常主动通知到管理站)或者InformRequest
上述宏的调用格式为:
<描述符号> <宏> <参数> ::= OID
例如
firstDescriptor OBJECT-IDENTITY
STATUS current
DESCRIPTION
“first OBJECT-IDENTITY”
::= {previousNode 1}
对号入座的话就是:
<描述符号> ------ firstDescriptor
<宏> ----------------OBJECT-IDENTITY
<参数>--------------STATUS DESCRIPTION
OID ------------------{previousNode 1}
TEXTUAL-CONVENTION
该宏用于自定义数据类型,在原有数据类型基础上,进行封装定义。
宏调用格式为:
<自定义类型> ::= <宏> <参数>
例如:
myFirstType ::= TEXTUAL-CONVENTION
STATUS current
DESCRIPTION
“my user-defined date type”
SYNTAX INTEGER(1-5)
这样就定义了一个数据类型myFirstType ,默认取值范围早1-5之间
具体的书写说明下面会介绍
二、SMI下的数据类型
Integer32
32位有符号整型数。
INTEGER
32位有符号整型数,与Integer32不同的是,该类型可以自定义范围和枚举类型。
对于枚举类型的标签不能含有下划线,以小写字符开头,最好不超过32个字符。
例如:
INTEGER(1-5)
INTEGER{
one(1),
two(2)
}
OCTET STRING
八进制字符串,用于表示任意文本数据或者二进制,不能超过256字节
Counter32
32位计数类型,非负整数。单调递增,对于该类型的节点的MAX-ACCESS访问权限只能是read-only或者accessible-for-notify,不能使用DEFVAL
Counter64
64位计数类型,非负整数。单调递增,对于该类型的节点的MAX-ACCESS访问权限只能是read-only或者accessible-for-notify,不能使用DEFVAL
Unsigned32
32位无符号整型数据。
OBJECT IDENIFIER
对象标识符,也就是OID
TimeTicks
时间戳类型,一般用于计算系统使用时间。
Gauge32
32位无符号整型,可增可减
IpAddress
IP地址类型,表示一个32位的4字节IP地址,网络字节序排序
Opaque
不透明类型,可以用于传递任意编码格式的字符串
The BITS construct
命名位枚举类型,非负整数。
Table
表格类型定义为SEQUENCE OF EntryType
列表类型定义为SEQUENCE**,列表类型属于表
下面会进行举例。
上面是RFC1902定义的数据类型,在RFC1903中通过自定义定义了其他数据类型,也很常用,后面后补充。
三、宏类型的参数
MODULE-IDENTITY
LAST-UPDATED:最后更新时间,日期格式为UTC格式
ORGANIZATION:对开发组织的描述
CONTACT-INFO:组织的联系信息
DESCRIPTION:对该模块的高级描述
REVERSION:修订版本(不一定出现)
DESCRIPTION:对REVERSION的描述
OBJECT-IDENTITY
STATUS:表示状态,包括current(当前的即可使用的),obsolete(过时的),deprecated(废弃的,保留了与旧实现的互操作性)
DESCRIPTION:描述,对定义的描述符号进行说明
OBJECT-TYPE
== SYNTAX==:描述符号的数据类型,包括上述所描述的,外部导入和自定义的
UINTS:非必要参数,包含对该对象关联的单位说明
MAX-ACCESS:访问权限,包括read-write(可读可修改),read-create(可读可修改可创建),read-only(只读),not-accessible(用于辅助对象,例如表格),accessible-for-notify(用于通知访问的对象)
STATUS:状态,包括current(当前的即可使用的),obsolete(过时的,不再使用),deprecated(废弃的,保留了与旧实现的互操作性)
DESCRIPTION:对定义的描述符号进行说明
REFERENCE:非必要参数,包含对其他mib模块中定义的对象的文本交叉引用
INDEX:用于列表类型中,和AUGMENT互斥,在列表定义中只能使用一个参数。INDEX指定列表中的“主键”,可包含一个或多个,可以是整型,字符串类型,IP地址类型以及对象标识符(OID)
AUGMENT:与INDEX类似,但是有区别,只有一个“主键”时,应该使用AUGMENT参数等
DEFVAL:默认值,指定可接受的默认值。
NOTIFICATION-TYPE
OBJECTS:非必要参数,定义了包含在通知的每个实例中MIB对象类型的有序序列
STATUS:状态,包括current(当前的即可使用的),obsolete(过时的,不再使用),deprecated(废弃的,保留了与旧实现的互操作性)
*DESCRIPTION*:描述信息
REFERENCE:非必要参数,包含对其他mib模块中定义的对象的文本交叉引用
TEXTUAL-CONVENTION
DISPLAY-HINT:显示设置,存在使用INTEGER或OCTET STRING类型中。分为两部分,第一部分为显示的数据进制类型,x–十六进制,d–十进制,o–八进制,b–二进制,后面跟着“-”,在后面是十进制数据表示显示时隐含的小数点。例如:
Hundredths ::= TEXTUAL-CONVENTION
DISPLAY-HINT "d-2"
...
SYNTAX INTEGER (0..10000)
表示如果是1234显示为12.34
STATUS:状态,包括current(当前的即可使用的),obsolete(过时的),deprecated(废弃的,保留了与旧实现的互操作性)
DESCRIPTION:描述信息
REFERENCE:非必要参数,包含对其他mib模块中定义的对象的文本交叉引用
SYNTAX:数据类型,只能值上述定义的类型
四、MIB文件的书写
说明:
1、MIB文件的开头 DEFINITIONS ::= BEGIN
MIB文件的结束END
2、IMPORTS,从别的MIB中导入其他类型
3、MIB文件的注释用–(两个“-”)
4、注意table的定义,一个table定义包括table节点,Entry节点以及其他的列表节点
5、各个参数的顺序要严格按照上面列举的顺序,非必要包括的可以不写,否则编译出错
6、并不是一个MIB文件要包括所有的宏,基本的要有MODULE-IDENTITY,OBJECT-IDENTITY,OBJECT-TYPE
6、测试和编译软件MG-SOFT Mib Browser
文件
TEST-MIB DEFINITIONS ::= BEGIN
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
enterprises, IpAddress, Integer32, Unsigned32, TimeTicks
FROM SNMPv2-SMI
TEXTUAL-CONVENTION,RowStatus FROM SNMPv2-TC;
-- start MODULE-IDENTITY
firstModuleIdentity MODULE-IDENTITY
LAST-UPDATED "20200910154855Z"
ORGANIZATION "Kuaisen"
CONTACT-INFO "12345678901"
DESCRIPTION
"The MIB Module for testing smi"
REVISION "20200910154855Z"
DESCRIPTION
"lasted updated revision"
::= {enterprises 2}
-- end MODULE-IDENTITY
-- start TEXTUAL-CONVENTION
MyFirstType ::= TEXTUAL-CONVENTION
STATUS current
DESCRIPTION
"my user-defined date type"
SYNTAX INTEGER(1..5)
-- end TEXTUAL-CONVENTION
-- start OBJECT-IDENTITY
firstObjectIdentity OBJECT-IDENTITY
STATUS current
DESCRIPTION
"The object identity used to test"
::= {firstModuleIdentity 1}
firstObjectTypeForInteger OBJECT-TYPE
SYNTAX INTEGER{
one(1),
two(2)
}
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The object type used to test"
DEFVAL {one}
::= {firstObjectIdentity 1}
secondObjectTypeForOctetString OBJECT-TYPE
SYNTAX OCTET STRING
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The object type used to test"
::= {firstObjectIdentity 2}
-- start table
firstObjectTypeForTable OBJECT-TYPE
SYNTAX SEQUENCE OF FirstObjectSettings
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"The object type used to test"
::= {firstObjectIdentity 3}
firstObjectTypeForEntry OBJECT-TYPE
SYNTAX FirstObjectSettings
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"The object type used to test"
INDEX {firstTableIndex}
::= {firstObjectTypeForTable 1}
FirstObjectSettings ::=
SEQUENCE{
firstTableIndex INTEGER,
otherTableType OCTET STRING,
tableRowStatus RowStatus
}
firstTableIndex OBJECT-TYPE
SYNTAX INTEGER
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The object type used to test"
::= {firstObjectTypeForEntry 1}
otherTableType OBJECT-TYPE
SYNTAX OCTET STRING
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The object type used to test"
::= {firstObjectTypeForEntry 2}
tableRowStatus OBJECT-TYPE
SYNTAX RowStatus
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The object type used to test"
::= {firstObjectTypeForEntry 3}
-- end Table
-- end OBJECT-TYPE
-- start trap
firstTrapType NOTIFICATION-TYPE
STATUS current
DESCRIPTION "first test snmp trap"
::= {firstObjectIdentity 4}
-- end trap
END
上图生成的MIB Tree中,各个节点OID如下:
firstModuleIdentity:1.3.6.1.4.1.2
firstObjectIdentity:1.3.6.1.4.1.2.1
firstObjectTypeForInteger:1.3.6.1.4.1.2.1.1
secondObjectTypeForOctetString:1.3.6.1.4.1.2.1.2
firstObjectTypeForTable:1.3.6.1.4.1.2.1.3
firstObjectTypeForEntry:1.3.6.1.4.1.2.1.3.1
firstTableIndex:1.3.6.1.4.1.2.1.3.1.1
otherTableType:1.3.6.1.4.1.2.1.3.1.2
tableRowStatus:1.3.6.1.4.1.2.1.3.1.3
firstTrapType:1.3.6.1.4.1.2.1.4