最近在完善物联网边缘设备的总线汇聚层的工作,我把其中常用的几类协议开发的技术做一个总结,会陆续的写几篇系列文章。:)
SNMP在IT运营、网络设备管理、通信网元管理、物联网上应用广泛。以下章节将分析Linux/pSos等嵌入式环境下SNMP Agent流程特点及使用嵌入式设计SNMP Agent的技术细节(其中涉及到信息模型设计、C/C++语言等内容请各位看官提前学习哈)。本章也可以作为嵌入式下SNMP Agent的软件开发开发指导书。
(一)SNMP协议体系及技术要点
(二)SNMP Agent的设计
(三)SNMP Agent的实现

前言
SNMP Agent的开发,为了便于大家从基本原理上理解SNMP开发要素,我们从SNMP体系、MIB的组织以及MIB生成等基本技术点来讲解。当然你也可以直接使用现成的商用控件库和工具链来简化你的设计和实现。
1 SNMP协议体系及技术要点
1.1 SNMP管理模型:
SNMP定义的管理模型是C/S结构,client (称为 network manager)与远端网络设备上执行的server(称为SNMP agent)建立虚连接,获取设备状态。设备状态数据库由SNMP agent控制,被称为SNMP Management Information Base (MIB),它是一些统计和控制变量的标准集。
Network manager向SNMP agent发起管理请求,请求包含SNMP变量(称为MIB对象ID或MIB变量)及操作动作(取MIB变量值或为MIB变量设置一个新值)。
1.1.1 SNMP协议栈中的位置和它的协议框架图:
1.1.2 SNMP的管理模型:
1.2 理解ASN.1和BER:
正式的SNMP规范中都使用ASN.1(Abstract Syntax Notion 1)的语法进行描述,使用BER(Basic Encode Rule)进行编码。ASN.1的详细描述在RFC1902。
1.2.1 ASN.1抽象记法描述语言
ASN.1用于描述抽象记法的语言,它可以用于任何协议层,在这种记法的基础上通过一定的编码规则,就可以确定数据的8比特组值。
ASN.1记法可以分为以下三主要标记方法:
· Branch Object Identifiers
描述MIB对象的包含关系,用OBJECT IDENTIFIER定义,搭建MIB的树型结构。
Example:
myBranch OBJECT IDENTIFIER ::= { parentBranch 100 }
根据ASN.1文件可回溯parentBranch,直到根internet。parentBranch下可定义多个分支对象,对应唯一的名称和标识数。
· Scalar Object Definitions
· Table Type Definitions
1.2.2 BER编码规则
ASN.1的描述可以通过各种方法转换为比特流,SNMP中使用BER进行编码。
BER的基本规则就是:用“类型”、“长度”、“值”来标记一个流化对象。
例如:一个简单整数,在BER中需要用3个字节进行描述:第一个描述类型,第二个描述长度,第三个描述值。
1.3 SNMP SMI(Struct of Management Imformation)
SMI是MIB中的对象定义和编码(以便通过协议来传输)的基础,常被比作数据库中的模式。它描述如何用ASN.1的子集定义MIB。例如MIB中的资源如何命名和表示,包括一个MIB对象的数据类型,索引方式,访问权限,缺省值,MIB涵义,宏定义,以及该MIB在MIB树中的位置(父子节点关系等)。SNMPv2-SMI由三部分组成(RFC1902):
- 模块定义
- 对象定义
- Trap定义
模块定义--标识宏语法:
MODULE-IDENTITY MACRO ::=BEGIN TYPE NOTATION ::= "LAST-UPDATED" value(Update UTCTime) "ORGANIZATION" Text "CONTACT-INFO" Text "DESCRIPTION" Text RevisionPart VALUE NOTATION ::= value(VALUE OBJECT IDENTIFIER) RevisionPart ::= Revisions | empty Revisions ::= Revision | Revisions Revision Revision ::= "REVISION" value(Update UTCTime) "DESCRIPTION" Text -- uses the NVT ASCII character set Text ::= """" string """"END
模块定义—example:
ASB-MIB DEFINITIONS ::= BEGINIMPORTS MODULE-IDENTITY, enterprises FROM SNMPv2-SMI;asbRoot MODULE-IDENTITY LAST-UPDATED "9406072245Z" --"20020322" ORGANIZATION "ASB, Inc." CONTACT-INFO "ASB in ChenDu. Created by Yangyutong email: [email protected] phone: 028-11111111"DESCRIPTION "This MIB is the root MIB for ASB, Inc. enterprise."::= { enterprises 5555 } asbTndTeam OBJECT IDENTIFIER ::= { asbRoot 1 }asbExtend OBJECT IDENTIFIER ::= { asbRoot 2 } END
对象定义--标识宏语法:
OBJECT-IDENTITY MACRO ::=BEGIN TYPE NOTATION ::= "STATUS" Status "DESCRIPTION" Text ReferPart VALUE NOTATION ::= value(VALUE OBJECT IDENTIFIER) Status ::= "current" | "deprecated" | "obsolete" ReferPart ::= "REFERENCE" Text | empty Text ::= """" string """"END
对象定义--OBJECT-IDENTITY example:
dwdmProduction OBJECT IDENTIFIER ::= { asbTndTeam 1 }-- ochPort OBJECT IDENTIFIER ::= { dwdmProduction 1 }-- omsPort OBJECT IDENTIFIER ::= { dwdmProduction 2 }--
对象定义--类型语法:
OBJECT-TYPE MACRO ::=BEGIN TYPE NOTATION ::= "SYNTAX" Syntax UnitsPart "MAX-ACCESS" Access "STATUS" Status "DESCRIPTION" Text ReferPart IndexPart DefValPart VALUE NOTATION ::= value(VALUE ObjectName) Syntax ::= type(ObjectSyntax) | "BITS" "{" Kibbles "}" Kibbles ::= Kibble | Kibbles