首页 > 网络 > 正文
3.4.6 文本约定
2015-09-06 16:40:36     我来说两句      
收藏    我要投稿
让我们回顾3.3.2小节的内容,在这一节中SNMP中定义了几个新的数据类型。不过看看它们的定义,似乎没有什么特别之处,甚至只要使用ASN.1中的基础数据类型就可以表示相同的含义(文本约定是基础数据类型的子类型)。实际上SNMP定义它们的原意是要表示特殊的含义和属性——语义,如数据类型TimeTicks,尽管其值为INTEGER(0..4294967295),但是还有“以百分之一秒(0.01)为单位计时”的特殊含义。
 
与此类似,文本约定就是在基础数据类型的基础上,通过指定新的语义和限制属性定义“新的”数据类型。这种约定使得在定义新的数据类型时简约而高效,而不需要使用过多的文本来描述该数据类型的表现形式。尽管新的数据类型有新的表现形式,但是它的Tag依然和基础数据类型保持一致,同时也不能使用先前的文本约定类型再次定义新的文本约定类型。为了规范和统一文本约定的定义形式,SNMP的RFC2579定义了宏TEXTUAL-CONVENTION。作为一个宏,MIB开发人员可在MIB中使用该宏定义自己的数据类型。同样新定义的数据类型支持其导入/导出。另外SMIv2中也定义了多个文本约定,用户可以将这些文本约定导入自定义的模块中并直接使用它们。
 
让我们看看它是如何定义和使用的。
 
TEXTUAL-CONVENTION MACRO ::=
BEGIN
    TYPE NOTATION ::=
                DisplayPart
                "STATUS" Status
                "DESCRIPTION" Text
                ReferPart
                "SYNTAX" Syntax 
    VALUE NOTATION ::= value(VALUE Syntax)
      DisplayPart ::= "DISPLAY-HINT" Text | empty
      Status ::=  "current"
                  | "deprecated"
                  | "obsolete"
      ReferPart ::= "REFERENCE" Text | empty
      Text ::= value(IA5String)

      -- 只允许基础数据类型,不能再次使用文本约定定义新的文本约定
      Syntax ::=  type  | "BITS" "{" NamedBits "}"
      NamedBits ::= NamedBit| NamedBits "," NamedBit
      NamedBit ::=  identifier "(" number ")" -- 非负整数
END

 

 
上述宏的定义,与之前讲述的宏的定义基本相同。不过“DISPLAY-HINT”是新出现的子句。从其字面上来理解意为“显示提示”,主要用于对象实例值的格式化显示,实际上这种格式化方法与C语言中的print系列函数很相似,如保留多少位小数点、字符显示格式等。通过文本约定这种格式化控制,我们可以很容易地表示带小数点的实数型数据(SNMP没有引用ASN.1中的实数型数据类型);我们也可以实现按指定分隔符分开的数字和字母,如MAC地址。
 
文本约定格式化的规则仅适用于基础数据类型:INTEGER、OCTET STRING。不能应用在OBJECT IDENTIFIER、IpAddress、Counter32、Counter64和使用(BITS、INTEGER)定义的枚举等数据类型中。
 
下面,我们学习这种格式化的规则。
 
1.INTEGER类型的文本约定
 
在DISPLAY-HINT子句中可以包含以下两部分内容。
 
第一部分为单个字符,该字符代表不同进制:x(十六进制);d(十进制);o(八进制);b(二进制)。对于这些类型的数字,其前导的0将被忽略,如果是负数,数字前面应加负号。
 
第二部分只适用于d(十进制),不过可以省略。如果使用的话,其格式为“d”字母后紧跟一个连字符和一个代表小数点位数的数字:“d-x”,“x”代表一个数字(也就是说最多显示小数点后9位)。
 
这种规则可以用下面的产生式表示:
 
intDISPLAY-HINT ::= "d" ["-" number] | o | x | b
-- number 为0..9
 
下面的代码定义了新的数据类“Hundredths”,并使用它定义了一个管理对象“exampleHundredths”。当exampleHundredths的实例值为1234时,在NMS端将显示为12.34,其提示开发人员:Agent端使用的都是整型数,传输的也是整型数,小数点由MIB中定义的数据(语法)类型控制,且由NMS负责。这可以理解为数据与显示分开的设计策略。
 
Hundredths ::= TEXTUAL-CONVENTION
          DISPLAY-HINT "d-2" –-为 "x" 时则显示为16进制
          ... ––其他部分省略
          SYNTAX     INTEGER (0..10000)
-- 使用Hundredths定义管理对象
exampleHundredths OBJECT-TYPE
    SYNTAX      Hundredths
      ... --其他部分省略
    ::= { oneroot 1 }

 

 
2.OCTET STRING类型的文本约定
 
在DISPLAY-HINT子句中可以包含以下五个格式化符号。
 
重复指示符(Repeat Indicator):为字符‘*’,表示当前值重复的次数。该次数为非负整数,默认值为1,即重复1次。其为可选项。
 
字节长度(Octet Length):一个或多个整数(可以为0),表示多少个字符按该格式化方式显示(当为0时,表示不处理任何字符);当该值大于待格式化的字符串长度时,相当于所有字符都应处理。
 
显示格式(Display Format)控制:x(十六进制);d(十进制);o(八进制);a(ascii);t(UTF-8)。当“字节长度”部分值大于1时,且字符显示格式为数字时(x、d、o),需要以网络字节顺序解释和处理;当使用t时,也就是使用UTF-8这种8位字符的编码方式,当前值的尾部不足8位时将被忽略。
 
显示分隔符(Display Separator Character):该分隔符可以是除“*”和0~9外的任意单个字符。每个字符值后附加该分隔符,如果该分隔符后紧跟“重复指示符”则分隔符失效。其为可选项。
 
重复结束符(Repeat Terminator Character):该分隔符可以是除“*”和0~9外的任意单个字符。不过只有当“重复指示符”和“显示分隔符”同时存在时才使用它。可选字符集与“显示分隔符”相同。它的出现表示“重复指示符”中指定的重复次数的格式化操作已经应用完毕。其为可选项。
 
从以上的五个格式化符号可以看出,在文本约定中具有特殊含义的字符有:*、x、d、o、a、t和0~9的数字,除此之外的符号都是分隔符。我们可以根据这个原则确定如何划分显示规则。当字符数不够所有格式化字符应用时,多余的格式化符号将被忽略;而当字符数多于格式化符号时,则可重复使用最后一个格式化符号,将其应用到剩余的字符中。这种规则可以总结为下面的产生式:
 
octetStringDisplayHint ::= ["*"] number displayFormat [ separatorChar [repTermChar] ]

number ::= INTEGER(0..9) ––数字0~9
displayFormat ::= x | d | o | a | t –-显示格式
separatorChar ::= specialChar –-显示分隔符
repTermChar ::= specialChar --重复结束符

-- 除 * 号和数字的字符
specialChar ::= OCTET STRING ( FROM ( OCTET STRING(SIZE(1))  EXCEPT ( "*" | number ) ) )

 

以上讲解不太直观。下面,我们结合上述的讲解和表3-3的内容,使读者明白其中的含义。
 
 
3.SMIv2中常见的文本约定
 
下面我们再学习下SMIv2中常见的文本约定,我们可以在编写MIB时直接使用这些类型,如表3-4所示。

 
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.4.5 一致性陈述
下一篇: 3.5 小结
相关文章
图文推荐
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站