版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/weixin_41025517/article/details/84569529
在Net-SNMP开发中,编写MIB文件是一项重要的环节。一般来说,一个标准的MIB文件主要由以下几个部分组成。
一、模块声明部分
所有的MIB文件都需要以DEFINITIANS关键字开始,以END结束。在这两者之间是需要定义的节点主体。模块声明部分的使用如下:
XXX-MIB DEFINITIONS ::= BEGIN
......
END
需要注意的是,在写MIB文件时,XXX-MIB是MIB的名字,该MIB文件一般命名为XXX-MIB.txt。在将该MIB进行编译安装时,命令行里需要用的正确格式是XXX-MIB::xxx。
二、模块引用部分
该部分主要声明导入其他模块,尤其是标准模块中定义的数据类型、宏等。除了基本的数据类型外,其他情况下,只有导入相关的数据类型,才可以在本模块中使用。具体而言,该部分利用IMPORTS标识,所有的模块引用及群组引用均使用关键字FROM说明其出处,最后以分号结束。
示例
IMPORTS
PhysAddress, TruthValue, RowStatus,
TimeStamp, AutonomousType, TestAndIncr FROM SNMPv2-TC
MODULE-COMPLIANCE, OBJECT-GROUP,
NOTIFICATION-GROUP FROM SNMPv2-CONF
snmpTraps FROM SNMPv2-MIB
IANAifType FROM IANAifType-MIB;
三、模块标识部分
该部分必须紧跟在模块引用部分之后,使用关键字MODULE-IDENTITY描述该模块的详细信息。模块有更新时可以用关键字REVISION描述,以方便后续开发。
示例
exampleMIB MODULE-IDENTITY
LAST-UPDATED "201811201132Z" --必须以Z为结尾,格式为“年月日时分+Z”
ORGANIZATION "www.XXXX.com"
CONTACT-INFO
"postal: Chenshi
email:xxx@xxx" --该部分有“”
DESCRIPTION
"For example." --该部分有“”
REVISION "201811271533Z"
DESCRIPTION
"For example." --该部分有“”
......
::= { exampleModuleIDs 6 }
四、对象标识部分(分配OID空间)
该部分用关键字OBJECT IDENTIFIER声明,它的主要功能是用来将具有同一类功能的对象结合起来,建立并规划整个MIB中的OID分支。
示例
XXXX OBJECT IDENTIFIER ::= { exampleMIB 156 }
XXXX是一个子树支,它定义在exampleMIB分支下,“156”是XXXX在exampleMIB分支下的唯一对象标识符。
五、标量对象定义部分
MIB中提供了两种类型的管理对象,一种是标量对象,一种是表格对象。标量对象指的是该对象在运行期间只有一个实例值的对象,而表格对象指的是在运行过程中有多个实例值的对象。注意,对象和对象实例是两个概念。
假设标量对象对应的标识符是OID_A,那么该对象的实例标识符表示为OID_A.0,获取该对象实例的PDU中传递的就是OID_A.0。
标量对象利用关键字OBJECT-TYPE定义。
示例
objectName OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"This is a simple object.
This example object is implemented in the xxx."
::= { netSnmpExampleScalars 1 }
各关键字的说明如下:
关键字 | 说明 |
---|---|
objectName | 被管对象的名字,必须以小写字母开头 |
OBJECT-TYPE | 该部分的关键字 |
SYNTAX | 被管理对象类型的关键字,如Interger(整数)、Gauge(标准)、NetworkAddress(网络地址)、IpAddress(Ipv4地址)、Counter(计数)、DisplayString(显示字符串)、TimeTicks(时间戳)等 |
MAX-ACCESS | 该对象支持的访问方式,有read-only、read-only(只读)、read-write(读写)、read-create(读和创建)、no-accessible(不可访问)四种 |
STATUS | 该对象的状态,有current (当前的)、deprecated (反对的)、obsolete(废弃的)三种 |
DESCRIPTION | 对被管理对象的功能、特征等进行描述的关键字 |
六、表格对象定义部分
该部分关键字有两个:SEQUENCE和SEQUENCE OF。
(1)表格对象可以看成是一些标量对象的集合,使用SEQUENCE将这些标量对象按序列的方式组合起来。每个标量对象在表内又可称为列对象。
(2)SEQUENCE OF定义表格中的行对象。
(3)将概念行作为概念表的语法类型,定义概念表,即表格对象。一般情况下,表格对象的名字后面应加上“Table”后缀,行对象的名字后面应加上“Entry”后缀,以示区分,方便后期修改开发。
示例
--定义概念表
exampleTable OBJECT-TYPE
SYNTAX SEQUENCE OF ExampleEntry
MAX-ACCESS not accessible
STATUS current
DESCRIPTION
::={ root 1 }
--定义概念表中的概念行
exampleEntry OBJECT-TYPE
SYNTAX ExampleEntry
MAX-ACCESS not accessible
STATUS current
DESCRIPTION
::={ exampleTable 1 }
--定义序列结构
ExampleEntry ::=
SEQUENCE {
exampleIndex Integer32,
exampleString DisplayString,
......
columnN columnNtype
}
--定义exampleIndex、exampleString......
--定义方式和第五部分相同
exampleIndex OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
::= { exampleEntry 1 } --父节点是行对象
关键字 | 说明 |
---|---|
exampleTable | 表格名,xxxxTable,Table首字母大写 |
exampleEntry | 行对象实例,和ExampleTable相同,但是后者首字母大写 |
ExampleEntry | 行对象名,XxxxEntry,首字母大写,Entry首字母大写 |
MAX-ACCESS | 此处必须是not-accessible |
DESCRIPTION | 描述信息字段 |
七、Trap对象定义部分(可选)
该部分为可选部分,使用关键字NOTIFICATION-TYPE或者TRAP-TYPE定义模块中的Trap对象。
TRAP-TYPE示例
exampleA MODULE-IDENTIFY
......
::={ enterprises 1000 }
exampleAMgmt OBJECT IDENTIFIER
......
::={ exampleA 12 }
exampleAMgmtMIB OBJECT IDENTIFIER
......
::={ exampleAMgmt 123 }
exampleAFailNotif TRAP-TYPE
ENTERPRISE exampleAMgmtMIB
VARIABLES { exampleAPort }
DESCRIPTION
::={ root 1 }
NOTIFICATION-TYPE示例
......
example NOTIFICATION-TYPE
OBJECTS {exampleObject}
STATUS current
DESCRIPTION "."
::= { xxxxx 1 }
......
一个MIB文件主要包括以上几个部分。完成MIB的编写是Net-SNMP开发的基础,要定义哪些被管对象、节点,需要提前罗列出来,从整体上去包括OID的分配。