SNMP MIB库语法 标量和表table结构

MIB文件基于ANS.1语法,用于定义网络管理信息结构。文件内容包括模块声明、导入其他模块、MODULE-IDENTITY用于描述模块信息,OBJECT-TYPE定义叶子节点。文章还介绍了如何创建OID、定义对象和表结构,以及使用snmptranslate工具进行验证。
摘要由CSDN通过智能技术生成

1,MIB 文件基础语法结构

        MIB文件是规范的ANS.1语法,文件中的编写不要使用下划线 ‘_’

mib文件的编写:

  • 使用下面结构为一个mib文件进行定义,“<-主要内容->”部分为该mib文件的Data部分。

声明一个mib文件:
    MY-MIB DEFINITIONS ::= BEGIN

    <- 主要内容 ->

    END

  • 引用其他模块中定义的类型、宏、以及模块,结构如下:
IMPORTS 
	OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP    
            FROM SNMPv2-CONF    
	enterprises, Integer32, Unsigned32, OBJECT-TYPE, 
                        MODULE-IDENTITY, NOTIFICATION-TYPE 
	    FROM SNMPv2-SMI    
	DisplayString    
	    FROM SNMPv2-TC;	

-- :表示注释
该结构为:
IMPORTS  xxx ,xxxx , xxxx FROM SNMPv2-TC;	

使用多个FROM 引用多个其他MIB文件中的内容

IMPORT/EXPORT 紧跟在模块声明后 主要声明导入其他[模块.类型.宏],尤其是标准模块中定义的内容
    模块使用时,用FROM关键字说明,并以';'结束
    例如:
        PhysAddress, TEXTUAL-CONVENTION, RowStatus          FROM SNMPv2-TC
        IpAddress, Integer32, OBJECT-TYPE, MODULE-IDENTITY  FROM SNMPv2-SMI
        MacAddress, DisplayString                  FROM SNMPv2-TC
        Myroot ,Mydevice                         FROM ROUTER-MIB;

  •  自定义该mib文件中表示的模块,及其添加一些描述信息
使用MODULE-IDENTITY以描述该模块的详细信息,模块更新时使用REVISION
    IP-MIB MODULE-IDENTITY
	LAST-UPDATED "20020225142536X"  --上一次更新时间
	ORGANIZATION  "IETF IPv6 MIB Revision"   ---组织时间
	CONTACT-INFO    --联系地址
	    "editor
		EMail: <www.baidu.com>"
	REVISION  "20000301123650X"   --更新时间
	DESCRIPTION
	    "This add aboot of module information"
	:: { Myroot 3}  --表示IP-MIB模块挂载在那个节点下 
	
(Myroot 为当前的自定义的节点,也可以使用系统提供的节点,如:enterprise 1)
					MIB中的对象{1.3.6.1.4.1},即enterprise(企业)

--该自定义的Myroot节点,要么是引用了其他自定义的模块中的节点,
    要么就需要挂载在标准模块下
  •  为模块分配OID空间,通过上面的操作已经知道模块挂载在那个分支下了,现在为该挂载点分配叶子节点:

        OBJECT IDENTIFIER 为管理对象 建立 OID节点 ==》用于规划和建立整个MIB中的分支。

ipphone OBJECT INDENTIFIER ::={ngn 12}
解释:ipphone 是一个子树枝,其定义在ngn标准节点下,12是其在ngn父树下的唯一标识

MySystem  OBJECT IDENTIFIER ::{Myroot 1}
MyStatus	OBJECT IDENTIFIER ::= { Myroot 2 }  
MyTest		OBJECT IDENTIFIER ::= { Myroot 4 } 
	
--MySystem,MyStatus,MyTest ==>都是Myroot下的子树枝枝干
  •  为叶子节点添加叶子(对象)
//叶子对象的定义
    OBJECT-TYPE (该部分定义是MIB文件中的主要内容,既叶子节点)

定义如下:
    objectName OBJECT-TYPE 
	SYNTAX (syntax)
	MAX-ACCESS (access)
	STATUS (status)
	DEFINITIONS (description)
	::={ (parent) (number)}
例子:
    nmsName OBJECT-TYPE
        SYNTAX     OCTET STRING (SIZE (0..32))  --字符类型0-32位
	MAX-ACCESS read-write    --可读写
	STATUS     current   --普通节点
	DESCRIPTION
		"这个写叶子节点的描述信息"
	::= { MySystem  1 } 	//挂载在那个分支节点下,1 表示第一个叶节点

--解释:该节点为挂载在MySystem 下的第一个叶子

SYNTAX 代表管理站如何解析获得的数据的类型,其类型如下:
	INTEGER:整型 有些整型变量[没有范围限制] [定义为特定的数值] [整型变量定义一个特定的范围] ==>int 型
	OCTER STRING : 0或多个8bit [每个字节在0~255之间]  ==> char arr[] 字符串类型
	DisplayString: 0或多个8bit [每个字节必须是ASCII码,< 255个字符]
	OBJECT IDENTIFIER 
	NULL : 变量没有值,有待从代理处获取
	IpAddress: 4字节长度的OCTER STRING,以网络序表示的IP地址。每个字节代表IP地址的一个字段。
	PhysAddress: OCTER STRING,代表物理地址
	Counter:4字节长度的OCTER STRING,以网络序表示的IP地址。每个字节代表IP地址的一个字段。
	Gauge:非负的整数,可以从0递增
	TimeTicks:时间计数器,必须指定递增的幅度
	SEQUENCE:这一数据类型与C程序设计语言中的“structure”类似。
			一个SEQUENCE包括0个或多个元素,每一个元素又是另一个ASN.1数据类型。
  •  比较复杂的叶子节点定义是table表类型:

        使用 SEQUENCE类型 定义序列结构  每一项是标量对象(列对象)
        SEQUENCE OF 定义的序列结果,定义为概念行    表格对象和行对象都为not-accessible 索引权限定义为:not-accessible


例子:一个完整的标量节点,该文件可以命名为xxx.txt 或 xxx.mib,用于发布

MyModules  DEFINITIONS ::= BEGIN

	--add standard mib define
	IMPORTS 
		OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP    
            FROM SNMPv2-CONF    
		enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY, NOTIFICATION-TYPE 
			FROM SNMPv2-SMI    
		DisplayString    
			FROM SNMPv2-TC;	
	--define one 子树枝
	Mybranch   MODULE-IDENTITY  
		LAST-UPDATED "200210091450Z"
		ORGANIZATION 
			"" 
		CONTACT-INFO 
                ""  
		DESCRIPTION 
			"This is a test Mib"
		::= { enterprises 15926}  --1.3.6.1.4.1.15926
		
	--define leaf node 
	-- This part will include all details about the Test.
	
	Myleafs OBJECT IDENTIFIER ::= { Mybranch 1 } 
	
	-- 1.3.6.1.4.1.15926.1
	MyName OBJECT-TYPE
		SYNTAX  DisplayString (SIZE (0..100))
		MAX-ACCESS read-write
		STATUS current
		DESCRIPTION
                "string"
		::={ Myleafs 1}
END

 使用net-snmp提供的检查工具测试如下:

//通过该命令可以识别出mib模块的是否正确
[root@localhost new_My_mib]# snmptranslate -Tp -IR MyModules::Mybranch
Expected CONTACT-INFO (DESCRIPTION): At line 16 in /usr/local/share/snmp/mibs/myName.mib
+--Mybranch(15926)
   |
   +--Myleafs(1)
      |
      +-- -RW- String    MyName(1)
               Textual Convention: DisplayString
               Size: 0..100

--提示了一个问题,。。。。

3,Table 表类型的MIB 文件编写

-------------/表格类型 IF-MIB.mib 系统mib提供了table数据的定义供参考

如下:
理解:
    在interfaces 2 下有一个iftable的树枝,该树枝下挂载的第一个节点是ifEntry,该ifEntry是一个表结构,其内部成员有(ifIndex、ifDescr.... ifSpecific等)

ifTable OBJECT-TYPE
	SYNTAX      SEQUENCE OF IfEntry
	MAX-ACCESS  not-accessible
	STATUS      current
	DESCRIPTION
	    "A list of interface entries.  The number of entries is
				given by the value of ifNumber."
	::= { interfaces 2 }
	
ifEntry OBJECT-TYPE
	SYNTAX      IfEntry
	MAX-ACCESS  not-accessible
	STATUS      current
	DESCRIPTION
	    "An entry containing management information applicable to a
			particular interface."
	INDEX   { ifIndex }
	::= { ifTable 1 }
	
IfEntry ::=
	SEQUENCE {
		ifIndex                 InterfaceIndex,
		ifDescr                 DisplayString,
		ifType                  IANAifType,
		ifMtu                   Integer32,
		ifSpeed                 Gauge32,
		ifPhysAddress           PhysAddress,
		ifAdminStatus           INTEGER,
		ifOperStatus            INTEGER,
		ifLastChange            TimeTicks,
		ifInOctets              Counter32,
		ifInUcastPkts           Counter32,
		ifInNUcastPkts          Counter32,  -- deprecated
		ifInDiscards            Counter32,
		ifInErrors              Counter32,
		ifInUnknownProtos       Counter32,
		ifOutOctets             Counter32,
		ifOutUcastPkts          Counter32,
		ifOutNUcastPkts         Counter32,  -- deprecated
		ifOutDiscards           Counter32,
		ifOutErrors             Counter32,
		ifOutQLen               Gauge32,    -- deprecated
		ifSpecific              OBJECT IDENTIFIER -- deprecated
	}

--上面是声明内部成员,下面是为内部成员定义OID节点
ifIndex OBJECT-TYPE
	SYNTAX      InterfaceIndex
	MAX-ACCESS  read-only
	STATUS      current
	DESCRIPTION
	    "A unique value, greater than zero, for each interface.  It
	    is recommended that values are assigned contiguously
	    starting from 1.  The value for each interface sub-layer
	    must remain constant at least from one re-initialization of
	    the entity's network management system to the next re-
	    initialization."
	::= { ifEntry 1 }

ifDescr OBJECT-TYPE
	SYNTAX      DisplayString (SIZE (0..255))
	MAX-ACCESS  read-only
	STATUS      current
	DESCRIPTION
		"A textual string containing information about the
		interface.  This string should include the name of the
		manufacturer, the product name and the version of the
		interface hardware/software."
	::= { ifEntry 2 }

例子一个可用的table表例子:

MyTables-Test  DEFINITIONS ::= BEGIN

	--add standard mib define
	IMPORTS 
		OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP    
            FROM SNMPv2-CONF    
		enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY, NOTIFICATION-TYPE 
			FROM SNMPv2-SMI    
		DisplayString    
			FROM SNMPv2-TC;	
	--define one 子树枝
	--内部的ORGANIZATION.etc最好都不要少
	MyTablesBranch   MODULE-IDENTITY  
		LAST-UPDATED "200210091450Z"
		ORGANIZATION 
			"AAAA"  
		CONTACT-INFO 
                ""  
		DESCRIPTION 
			"This is a test Mib"
		::= { enterprises 15927}  --1.3.6.1.4.1.15927
		
	--define leaf node 
	-- This part will include all details about the Test.
	
	MyTableleafs OBJECT IDENTIFIER ::= { MyTablesBranch 1 } 
	
	TestTable  OBJECT-TYPE
		SYNTAX        SEQUENCE OF TestTableEntry
		MAX-ACCESS    not-accessible
		STATUS        current
		DESCRIPTION
		"myTables tables "
		::= {MyTableleafs  1}
		
	TestTableEntry OBJECT-TYPE
		SYNTAX        TestTableEntry
		MAX-ACCESS    not-accessible
		STATUS        current
		DESCRIPTION
		""
		INDEX {ifIndex}
		::= {TestTable  1}
	--目前只添加了三个节点,可继续增加
	TestTableEntry ::=
		SEQUENCE {
			ifIndex      INTEGER(0..24),
			myName       OCTET STRING(SIZE(0..32)),
			myAge  		 INTEGER	
		}
		
	ifIndex   OBJECT-TYPE
		SYNTAX      INTEGER(0..24)
		MAX-ACCESS  read-write
		STATUS      current
		DESCRIPTION
		"标识访问的是表中的第几行数据"
		::= {TestTableEntry 1} 
	
	myName   OBJECT-TYPE
		SYNTAX      OCTET STRING(SIZE(0..32))
		MAX-ACCESS  read-write
		STATUS      current
		DESCRIPTION
		"Name"
		::= {TestTableEntry 2} 
		
	myAge   OBJECT-TYPE
		SYNTAX      INTEGER
		MAX-ACCESS  read-write
		STATUS      current
		DESCRIPTION
		"Age"
		::= {TestTableEntry 3} 
END

工具测试如下:

//--------------------mib table
使用snmptranslate 注意该命令搜索mib库的默认路径 MIB search path: /root/.snmp/mibs:/usr/local/share/snmp/mibs
[root@localhost new_My_mib]# snmptranslate -Tp -IR MyTables-Test::MyTableleafs
+--MyTableleafs(1)
   |
   +--TestTable(1)
      |
      +--TestTableEntry(1)
         |  Index: ifIndex
         |
         +-- -RW- INTEGER   ifIndex(1)
         |        Range: 0..24
         +-- -RW- String    myName(2)
         |        Size: 0..32
         +-- -RW- INTEGER   myAge(3)

使用管理站测试发布:使用的管理者软件为MG-SOFT MIB Browser

总结:

     MG-SOFT MIB Browser 管理站提供了很多的mib库,可以参考进行编写和测试,也可以使用net-snmp开源软件,其提供了snmpd进程,用于代理端。   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值