|
主要是想自己写csta标准协议的编解码,我下载过asn1的编译器,虽说可以将asn结构的描述编译成c/c++代码,但生成的代码仍然比较复杂,而且我还要将交换机返回的16进制代码信息再根据asn1规范进行解码,所以只有编译器依然达不够用,只有靠自己写了
现将找到的部分资料共享出来,供大家探讨
转载: 感悟 人生真是很奇妙!在你满怀希望的时候,它会出其不意的给你当头一棒;而你决定放弃时,它却意想不到的奉上希望。有时候,真的是谋事在人,成事在天。 17:00 | 评论 (0)
2004年3月27日 #
无题 郁闷,这两天忙着到处找asn.1的资料,希望能找到一个报文编解码的例子,可是怎么也找不到,我从前一点都没接触过这种东西,但现在竟然要做一个asn.1报文编解码器的自动生成器!这就像一个小孩还不没学会走路,就参加赛跑比赛。
10:23 | 评论 (3)
2004年3月20日 #
ASN.1 笔记 作者:ddonwi(ddonwi@sina.com) 最后修改时间:17:13 04-3-20 一、介绍 Abstract Syntax Notation One (ASN.1)是一种独立于机器的描述语言,用于描述在网络上传递的消息 标准包括: ISO 8824-1 | ITU-T X.680: Specification of basic notation, ISO 8824-2 | ITU-T X.681: Information object specification, ISO 8824-3 | ITU-T X.682: Constraint specification, ISO 8824-4 | ITU-T X.683: Parameterization of ASN.1 ASN.1特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构 ASN.1 可分为两个部分 语法规则:从数据类型、内容顺序或结构等方面来描述消息的内容 编码规则:如何编码实际消息中的数据 特点: 表达简单和复杂类型的能力 可对类型根据大小及(或)数值进行约束 也可以施加更强的约束 字段可标记为 OPTIONAL 大写开头表示类型名,小写开头的表示变量名/字段名
二、ASN.1术语 1.抽象语法(Abstract Syntax) 描述通用数据结构 允许定义数据类型和值 2.数据类型(Data Type) 值的集合,可以是简单类型或结构类型 可以对数据类型命名 3.编码(Encoding) 用于表示数据值的字节序列 4.编码规则(Encoding Rules) 给出从一种语法到另一种的映射方法 5.传输语法(Transfer Syntax) 位模式(Bits pattern) 描述数据是在传输时是如何表示的
三、ASN.1模块定义 模块(module):ASN.1规范中的基本构造块 模块定义格式如下:
<modulereference> DEFINITIONS ::= BEGIN EXPORTS IMPORTS AssignmentList END 其中:EXPORTS 这个模块中的定义可能被其他模块引入 IMPORTS 定义由其他模块引入 AssignmentList 这个模块中将定义类型分配、值分配及宏定义
四、ASN.1简单类型 1. 基本类型:BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING 2. 字符串类型(ISO10646-1的子集) NumericString (0-9,<space>) PrintableString (0-9,A-Z,a-z,<space>,<s[ecial> VisibleString GraphicString UTF8String IA5String (ASCII) 3. 对象类型 OBJECT IDENTIFIER ObjectDescriptor 对象标识符:一个任意长的非负整数序列,用于标记对象(如算法等) 4. 其它类型 NULL 空值 UTCTime yymmdd hhmm[ss] <local offset from UTC> GeneralizedTime yyyymmdd hhmm[ss] <local offset from UTC> 强制从2050年开始
五、ASN.1类型定义 语法: <type name> ::= <type> 示例: Counter ::= INTEGER IpAddress ::= OCTET STRING Months ::= ENUMERATED { january (1), february (2), march (3), april (4), may (5), june (6), july (7), august (8), september (9), october (10), november (11), december(12) } 六、ASN.1子类型定义 语法: <subtype name> ::= <type> (<constraint>) 示例: Counter ::= INTEGER (0..65536) IpAddress ::= OCTET STRING ( SIZE(4) ) Spring ::= Months (march | april | may) Summer ::= Months (june | july | august ) SmallPrime ::= INTEGER ( 2 | 3 | 5 | 7 | 11 ) ExportKey ::= BIT STRING ( SIZE(40) )
七、ASN.1赋值 语法: <value name> <type> ::= <value> 示例: ipInReceives Counter ::= 2450 ipRouteMask IpAddress ::= ‘FFFFFF00’H currentMonth Months ::= july currentTime UTCTime ::= “030708094018+0800” name VisibleString ::= “John” married BOOLEAN ::= TRUE faxMessage BIT STRING ::= ‘01100001101’B
internet OBJECT IDENTIFIER ::= { iso(1) org(3) dod(6) 1 } private OBJECT IDENTIFIER ::= { internet 4 }
八、ASN.1结构类型 SEQUENCE 对应于C语言中的struct 类型定义 UserAccount ::= SEQUENCE { username PrintableString, password PrintableString, accountNr INTEGER } 赋值 myAccount UserAccount ::= { username “tly”, password “guesswhat”, accountNr 2345 } SEQUENCE OF 对应于C语言中的数组 类型定义 MemberCountries ::= SEQUENCE OF PrintableString AccountRegistry ::= SEQUENCE OF UserAccount 赋值 eastAsia MemberCountries ::= { “China”, “Japan”, “Korean”, “DPR” } SET 类似于SEQUENCE,但不考虑分量顺序 类型定义 UserAccount ::= SET { username [0] PrintableString, password [1] PrintableString, accountNr [2] INTEGER } 赋值 myAccount UserAccount ::= { accountNr 2345, username “tly”, password “guesswhat” } SET OF 集合类型,每一分量类型相同,不考虑顺序 类型定义 Keywords ::= SET OF PrintableString 赋值 someASN1Keywords Keywords ::= { “INTEGER”, “BOOLEAN”, “REAL” }
15:10 | 评论 (2)
ASN.1介绍 出处:http://asn1.elibel.tm.fr/en/introduction/index.htm 翻译:ddonwi(ddonwi@sina.com) 说明:我是第一次接触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
15:06 | 评论 (1)
2004年3月18日 #
**************************************** 另外附件中是asn1的开源代码,有lience的
请高手指点
|