出处:http://asn1.elibel.tm.fr/en/introduction/index.htm
翻译:ddonwi([email protected])
说明:我是第一次接触ASN.1,不知道它是什么东东,所以找了这份资料,边读边翻译,希望高手能通过这篇指出我理解上存在的错误,让我能够正确的理解ASN.1
最后修订日期:2004.3.20
主要概念
ASN.1 是通信协议中描述数据传输的正式标记(notation),它与语言实现和物理表示无关,与应用的复杂度无关。
ASN.1(Abstract Sysntax Notation number One 抽象语法标记)是定义抽象数据类型规格形式的标准。
|
它提供了一系列预定义的基本类型,诸如:
integers (INTEGER),
booleans (BOOLEAN),
character strings (IA5String, UniversalString...),
bit strings (BIT STRING),
...
并且它可以定义结构类型,比如:
structures (SEQUENCE),
lists (SEQUENCE OF),
choice between types (CHOICE),
...
子类型(Subtyping)约束也可以应用于任何ASN.1类型,用来限制类型的值的范围。
与很多其他的声称可扩展的语法不同,ASN.1 提供了处理和支持早期配置系统与新系统、新版本与老版本之间交互的可扩展性。
ASN.1 发送任何形式(音频、视频、数据等等)的信息都必须用数字传送。ASN.1只能包含信息的结构方面(没有已经定义的或考虑到的处理数据值的操作)。它不是一个编程语言。
ASN.1成功的一个主要理由是它采用了一些如BER(Basic Encoding Rules) 或新制定的PER(Packed EncodingRules)这样的标准化的编码规则,它对受带宽限制的应用程序很有用。这些编码规则描述了如何将定义在ASN.1中的值译成适合传输的电码(例如:他们可以被转化为可传输的字节,或反向转化),其与机器、编程语言或者在应用程序中的表示无关。ASN.1的编码方式比很多竞争者更先进,能够快速并可靠的传输可扩展信息--这是无线带宽的一个优势。由于从1982年以后ASN.1已经成为一个国际标准,所以它的编码规则是成熟的并且它有长期的可靠性和互用性的跟踪记录。
几乎所有操作系统上的工具都支持ASN.1,ASN.1也支持如java,c和c++这样流行的编程语言,和包括COBOL这样的较老的编程语言。ASN.1的广泛性的一个例子是,有很多工具已经支持超过150种不同的计算机平台。
有大量经过检验的ASN.1工具已经被长期使用。使用这些工具,可以更快的将新产品带入市场,至少,可以召回那些没有经过有效测试的基于新代码的产品。
个案研究
假如一个公司拥有一个连接了数个销售网点的仓库,进货保存在这个仓库里 ,出货从这个仓库中调出。这个公司需要一个具有以下特征的协议:
定单收集在本地销售网点处;
它们被发送到仓库,在那里管理着交付货物手续;
通过客户的要求,交付的回执必须送回销售网点做下一步处理。
协议可以被表示为下列的两个ASN.1模块:
Module-order DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Order ::= SEQUENCE {
header Order-header,
items SEQUENCE OF Order-line}
Order-header ::= SEQUENCE {
number Order-number,
date Date,
client Client,
payment Payment-method }
Order-number ::= NumericString (SIZE (12))
Date ::= NumericString (SIZE (8)) -- MMDDYYYY
Client ::= SEQUENCE {
name PrintableString (SIZE (1..20)),
street PrintableString (SIZE (1..50)) OPTIONAL,
postcode NumericString (SIZE (5)),
town PrintableString (SIZE (1..30)),
country PrintableString (SIZE (1..20))
DEFAULT default-country }
default-country PrintableString ::= "France"
Payment-method ::= CHOICE {
check NumericString (SIZE (15)),
credit-card Credit-card,
cash NULL }
Credit-card ::= SEQUENCE {
type Card-type,
number NumericString (SIZE (20)),
expiry-date NumericString (SIZE (6)) -- MMYYYY -- }
Card-type ::= ENUMERATED { cb(0), visa(1), eurocard(2),
diners(3), american-express(4) }
Order-line ::= SEQUENCE {
item-code Item-code,
label Label,
quantity Quantity,
price Cents }
Item-code ::= NumericString (SIZE (7))
Label ::= PrintableString (SIZE (1..30))
Quantity ::= CHOICE { unites INTEGER,
millimetres INTEGER,
milligrammes INTEGER }
Cents ::= INTEGER
Delivery-report ::= SEQUENCE {
order-code Order-number,
delivery SEQUENCE OF Delivery-line }
Delivery-line ::= SEQUENCE { item Item-code,
quantity Quantity }
END
Protocol DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
IMPORTS Order, Delivery-report, Item-code, Quantity,
Order-number FROM Module-order ;
PDU ::= CHOICE { question CHOICE {
question1 Order,
question2 Item-code,
question3 Order-number,
... },
answer CHOICE {
answer1 Delivery-report,
answer2 Quantity,
answer3 Delivery-report,
... }}
END