且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《精通SNMP》——2.6 ASN.1模块

更新时间:2022-09-13 17:17:10

本节书摘来自异步社区《精通SNMP》一书中的第2章,第2.6节,作者: 武孟军 更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.6 ASN.1模块

ASN.1模块(module)是针对某一特定应用,由一组相关的ASN.1类型定义语句和赋值语句组成的命名集合。使用ASN.1,必须在模块中定义类型并赋值。不同模块中定义的数据类型可以相互引用。

2.6.1 模块格式
定义模块时,必须为模块指定模块名。如果为模块分配了对象标识符,则模块名后面可跟对象标识符。模块定义格式如下所示:

< 模块名 > DEFINITIONS ::= 
BEGIN 
  EXPORTS 部分(可选) 
IMPORTS 部分(可选) 
< 模块体 > 
END

关键字 IMPORTS 和 EXPORTS 定义模块的接口,前者指明本模块从其他模块引用的类型(值)定义,后者指明本模块中定义的哪些类型(值)可以被其他模块引用。如果两者同时出现,则EXPORTS 部分必须先于IMPORTS定义。

被引用类型(值)必须逐个列举,后跟 “FROM < 模块名 >” 指明引用类型(值)的源模块。如从多个模块中引用,语法形式如下:

IMPORTS <类型(值)列表1> FROM <模块名1> 
     <类型(值)列表2> FROM <模块名2>…;

EXPORTS 后跟本模块中定义的类型(值)列表。注意,如果模块中没有EXPORTS部分,则表示所有类型(值)都可以被其他模块引用;EXPORTS 后跟的类型(值)列表为空,形如“EXPORTS ;”,则表示模块中所有定义的类型(值)都不能被其他模块引用。

用户定义的类型和赋值语句在模块体中,定义顺序是任意的。也就是说,类型可以“先使用后定义”。下面是一个模块定义的例子:

Module2 DEFINITIONS ::= 
BEGIN 
EXPORTS Type2; 
IMPORTS Type1, value FROM Module1; 
Type2 ::= INTEGER (0..value) 
  Type3 ::= Type1 
END

新定义的模块名是Module2,紧接着是关键字“DEFINITIONS”,然后是“::=”,包含在BEGIN和END关键字之间的都是模块体。本模块从Module1模块中引用了类型Type1和值 value,Type2和Type3是模块中定义的类型,并且Type2可以被其他模块引用。

2.6.2 模块的产生式
模块的符号形式也使用了一系列产生式定义,最终的符号形式也有多种。下面是模块的产生式,关键部分加入了注释。

ModuleDefinition ::=ModuleIdentifier DEFINITIONS TagDefault -- DEFINITIONS是关键字; 
“::=”  
BEGIN  
ModuleBody 
END 
TagDefault ::=EXPLICIT TAGS |IMPLICIT TAGS | empty 
-- 模块中结构类型的组件标签定义方式,详见2.5.1小节,该部分可以为空。
ModuleIdentifier ::=modulereference AssignedIdentifier 
--模块名,后跟模块标识。
AssignedIdentifier ::=ObjectIdentifierValue |empty 
--模块标识可以是一个对象标识符,也可以是空。
ModuleBody ::=Exports Imports AssignmentList |empty 
--模块体定义,模块体可以分为三部分:Exports,Imports,AssignmentList;或则为空。
Exports ::=EXPORTS SymbolsExported; |empty 
--Exports可以为空,EXPORTS为关键字。
SymbolsExported ::=SymbolList |empty 
--输出(类型或值)符号定义,可以为空。
Imports ::=IMPORTS SymbolsImported; |empty 
SymbolsImported ::=SymbolsFromModuleList |empty 
SymbolsFromModuleList ::=SymbolsFromModule SymbolsFromModuleList | SymbolsFromModule 
SymbolsFromModule ::=SymbolList FROM ModuleIdentifier 
--输入(类型或值)符号定义,须指明源模块。
SymbolList ::= Symbol, SymbolList | Symbol 
--(类型或值)符号列表。
Symbol ::=typereference | valuereference 
--typereference 、valuereferenc是类型引用和值引用基本符号。
AssignmentList ::=Assignment AssignmentList |Assignment 
Assignment ::=TypeAssignment | ValueAssignment 
--类型定义或赋值语句。

模块的巴柯斯范式精确地定义了模块的符号形式。在以后学习SNMP的过程中,会遇到许多ASN.1模块,它们的格式可能不尽相同,但无论什么样的格式,都必须符合模块的产生式定义。