B05、IEC62056技术文档--ASN.1语法讲解学习.doc

上传人:豆**** 文档编号:33578777 上传时间:2022-08-11 格式:DOC 页数:11 大小:108.50KB
返回 下载 相关 举报
B05、IEC62056技术文档--ASN.1语法讲解学习.doc_第1页
第1页 / 共11页
B05、IEC62056技术文档--ASN.1语法讲解学习.doc_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《B05、IEC62056技术文档--ASN.1语法讲解学习.doc》由会员分享,可在线阅读,更多相关《B05、IEC62056技术文档--ASN.1语法讲解学习.doc(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、如有侵权,请联系网站删除,仅供学习与交流B05、IEC62056技术文档-ASN.1语法【精品文档】第 11 页IEC62056技术文档ASN.1语法简介深圳市航天泰瑞捷电子有限公司修订记录版本日期作者备注1。02012-5-23梁高强初版范围:本文就IEC62056系列标准中涉及的ASN.1语法进行简要概述,便于协助开发工程师阅读、理解DLMS/COSEM通信协议。目录ASN.1 语法简介1. ASN.1是什么ASN.1全称为abstract syntax notation dot one ,抽象语法1(数字1被ISO加在ASN的后边,是为了保持ASN的开放性,可以让以后功能更加强大的ASN

2、被命名为ASN.2等,但至今也没有出现),是一种独立于机器的描述语言,用于描述在网络上传递的消息。通俗的来讲,抽象语法就是协议采用ASN.1规范描述的描述文本,这里涉及到另一个语法:传输语法,就是实际通讯系统间的码流。例如字母A为抽象语法,0X41为传输语法。2. ASN.1历史开始于1982年,许多开发应用层标准的人意识到他们面临同一个问题:数据结构变得越来越复杂,难以用预定的规程来编码比特或字节,ASN.1由此而生,它特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构,它不是用一些表格,及一些固定的帧格式来描述的,而是用一种抽象语法语言来描述。这样做的好处是,极大的提高了协议的

3、抽象性和通用性,可扩展性。3. 应用领域在GSM系统中,空中接口上传递的补充业务内容采用了ASN.1的BER编码格式,其RRM模块以及其他层3消息均采用ASN.1编码。3G移动系统使用ASN.1标准数据交换的第三代移动通信网络。这一系统基于UMTS(通用移动通信系统)标准,其使用了ASN.1和分组编码标准(PER)。在3GPP的层3消息体系中,使用ASN.1描述层3消息(包括Uu,Iub,Iur,Iu等接口的层3消息)使用ITU-T建议X.691的各种算法进行编解码,如RRC消息采用UPER编码格式。IP语音在通信领域中的另一个重要应用是通过包转换网络(如因特网)传递语音数据。多媒体数据信号编

4、解码器(CODEC)标准(H.323等等)基于ASN.1并且使用于分组编码标准来获取理想的数据传输速率。安全应用因特网安全授权同样也使用了ASN。1。高级编码标准在数据表示方面形成了 一个方便的、平台无关的标准,比加密要优越。PKIX、PKCS和X。509也是我们所熟悉的标准,它们也是基于ASN.1的。传统通信网络ASN.1和基本编码规则(BER)已经在主要通信领域流行了很长一段时间,所有的ss7到ISDN 的一切都使用了ASN.1 BER信息在各种类型的设备和计算机之间传递信号。军事和空间应用美国国家宇航局(NASA)在其航空通信网规范中,也正在使用ASN.1和分组编码规则作为空对地或地对空

5、协议。在DLMS中的应用如下图所示:例COSEM-OPEN.request服务原语,用ASN。1描述出来如下所示AARQ-apdu := APPLICATION 0 IMPLICIT SEQUENCEprotocol-version 0 IMPLICIT BIT STRING version1 (0) DEFAULTversion1,application-context-name 1 Application-context-name,called-AP-title2 AP-title OPTIONAL,called-AE-qualifier3 AE-qualifier OPTIONAL,ca

6、lled-AP-invocation-id4 AP-invocation-identifier OPTIONAL,called-AE-invocation-id 5 AE-invocation-identifier OPTIONAL,calling-AP-title6 AP-title OPTIONAL,calling-AE-qualifier 7 AE-qualifier OPTIONAL,calling-AP-invocation-id 8 AP-invocation-identifier OPTIONAL,calling-AE-invocation-id9 AE-invocation-i

7、dentifier OPTIONAL,. The following field shall not be present if only the kernel is used。. sender-acse-requirements 10 IMPLICIT ACSE-requirements OPTIONAL,- The following field shall only be present if the authentication functional unit is selected。mechanism-name 11 IMPLICIT mechanism-name OPTIONAL,

8、- The following field shall only be present if the authentication functional unit is selected。calling-authentication-value12 EXPLICIT authentication-value OPTIONAL,implementation-information 29 IMPLICIT implementation-data OPTIONAL,user-information 30 IMPLICIT association-information OPTIONAL4. ASN.

9、1语法ASN.1语法遵循传统的巴科斯范式BNF风格,最基本的表达式如:Name := type 。 表示为定义某个名称为Name的元素,它的类型为type。例如:MyName := IA5String。表示为定义了一个名为MyName的元素或变量,其类型为ASN.1类型IA5String (类似于ASCII字符串)。 一个用ASN.1语法描述的数据帧,看上去应该是下面的样子:Name := tag IMPLICIT/ EXPLICIT Data typenull-data 0 IMPLICIT NULL,item11 IMPLICIT/ EXPLICITData type A1 OPTIONA

10、Litem22 IMPLICIT/ EXPLICITData type A2 OPTIONALitem33 Data type 5. ASN.1显式值(Explict Value)有些时候,我们需要定义一种ASN.1类型,它的子集元素包含预定义值。Name := type (Explict Value)。显式值(Explict Value)必须是ASN.1类型允许选择的值,而且也必须是元素所允许的值。例: MyName := IA5String (Tom) 表示MyName是字符串Tom的IA5String编码。又例如: MyName := IA5String(Tom|Joe) 表示字符串的值

11、既可以是Tom, 也可以是Joe。这种语法的使用是为了扩展确定的解码器,例:Data-Access-Result := ENUMERATEDSuccess (0)Hardware-flaut (1)Temporary-failure (2)Read-write-denied (3)Other-reason (250)6. ASN.1容器容器是值一个包含了其他相同或者不同类型元素的数据类型(例如序列值SEQUENCE或集合值SET类型)目的是为了组合一些复杂的数据类型集ASN.1规范定义了4种容器类型:序列,单一序列(SEQUENCE OF),集合和单一集合(SET OF)虽然它们意义不同,但是

12、语法是一样的。Name := Container Name Type Name Type。方括号中的内容和容器的元素个数都是可选项。还可以进行嵌套定义。例:Get-Request-With-List := SEQUENCEInvoke-id-and-priority Invoke-And-PriorityAttribute-descriptor-list SEQUENCE OF Cosem-Attribute-Descriptor-With-Selection7. ASN.1修改器ASN.1定义了各种修改器,如可选(OPTIONAL),默认(DEFAULT),和选择(CHOICE)。 他们可以

13、改变表达式的声明典型地用于定义一种要求编码灵活,而定义又不繁琐的类型。7.1. 可选(OPTIONAL)顾名思义,其表示改变一个元素以便在编码时它的类型是可选择的即编码器可以忽略这个元素,解码器不能假设它将出现。定义: Name := Type OPTIONAL7.2. 默认(DEFAULT)默认修改器允许容器包含默认值如果待编码的数据值等同于它的默认值,那么它将在发送的数据流中被忽略。7.3. 选择(CHOICE)选择修改器允许一个元素在给定的实例中可以有多个可能值。GET-Respose :=CHOICEget-respone-normal 1IMPLICIT Get-Response-N

14、ormalget-response-with-datablock 2 IMPLICIT Get-Response-With-Datablockget-response-with-list 3 IMPLICIT Get-Response-With-List8. ASN.1头字节(tag)头字节(hearder byte)位于ASN.1编码的开始,通常是一个八位组,由3部分组成,有如下两种形式,如下图:当Tag不大于30时,Tag只在一个八位组中编码;当Tag大于30时,则Tag在多个八位组中编码。在多个八位组中编码时,第一个八位组后五位全部为1,其余的八位组最高位为1表示后续还有,为0表示Tag

15、结束。8.1. 类别位类别位(classification bits)由两位表示,用来描述数据将要解释的上下文。 位7位6类别及解释00通用(Universal)01应用(Application)10上下文特定(Context Specific)11专用(Private)所有的类型中,通用类别最常用。8.2. 结构化位结构化位(constructed bit)表示一个给定的编码是否是相同类型的多种编码的结构化。结构化元素是容器类型必需的,因为在逻辑上,它们只是其他元素的集合。结构化元素有自己的头字节和长度字节,之后是元素各个要素组件的单独编码。也就是说,这些要素组件是独立地可解码ASN。1数据

16、类型。严格的说,容器类是唯一允许使用结构化位的数据类型。这是因为对于其他数据类型,给定内容,只允许一种编码。所以其他所有数据类型的结构化位都为0。8.3. 原始类型ASN.1头字节的低5位定义了32种ASN。1的原始类型(primitive type)代码ASN。1类型作用1布尔型存储布尔值2整数存储整数3位串存储位数组4八位位串存储字节数组5空预留位(例如在选择修改器中)6对象标识符标识算法及协议16序列和单一序列未分类元素的容器17集合和单一集合已分类元素的容器19可打印字符串ASCII编码(忽略一些不可打印字符)22IA5StringASCII编码23世界协调时以统一格式表示的时间9.

17、ASN.1长度编码根据编码的实际长度,ASN.1定义了两种长度编码(length encoding)方法,定长方式(长编码和短编码),不定长方式。编码字节的最高位代表的是短编码还是长编码;而低7位则形成一个长度立即数。9.1. 定长方式9.1.1. 短编码。在短编码中,负载的长度必须小于128字节。长度立即数用来表示负载的长度。例如,对于一个长度为65 (0x41)的负载进行编码,其长度编码字节只需简单的设置为0x41即可。因为其最高位是0,则编码器可以判断出这是短编码,而且长度是65。9.1.2. 长编码。在长编码中,定义了附加的抽象数据来对长度进行编码,它仅适用于所有长度为128字节或以上

18、的负载。在这种模式下,长度立即数存储的是为了表示负载长度所需的字节数。这个长度必须以big-endian格式进行编码。例如,为一个长度为47310 (0xB8CE)的负载进行编码,因为它的长度大于127, 所以要采用长编码方式。实际的长度需要1个字节来表示。则,长度编码字节为0x81 02; 然后用big-endian格式存储的长度值为0xB8 0xCE。则全部长度编码为 0x81 02 B8 CE。9.2. 不定长方式Length所在八位组固定编码为0x80,但在Value编码结束后以两个0x00结尾。这种方式使得可以在编码没有完全结束的情况下,可以先发送部分消息给对方。图解如下所示:10.

19、 ASN.1的数据类型ASN.1针对广泛的应用定义了多种数据类型,这里只讨论跟DLMS相关的数据类型。我们将讨论如下数据类型:布尔型 (Boolean);八位位组串 (OCTET String);位串 (BIT String);IA5String;可打印字符串 (PrintableString);整数 (INTEGER);对象标识符 (OBJECT Identifier, OID);世界协调时 (UTCTIME);空 (NULL);序列,单一序列;集合;单一集合;任何ASN.1编码都是以两个字节开始(或者八位位组,含有个二进制位),不管什么类型它们都是通用的第一个字节是类型标识符,也包含一些修

20、正位;第二各字节是长度。10.1. ASN.1布尔类型布尔编码的负载或者是全0或者是任何不是全0的八位位组。头字节以0x01开始,长度编码字节为0x01,负载内容取决于布尔值的取值。布尔值编码False0x01 01 00True0x01 01 FF10.2. ASN.1整数类型整数类型表示一个有符号的任意精度的标量,它的编码是可移植,平台无关的。正整数的编码比较简单。每个字节表示的最大整数是255 (0xFF), 存储的实际数值分成字节大小的数字,并且以big-endian格式存储。例如:八位位组Xk, Xk-1,。, X0将以递减的顺序从Xk到X0进行存储编码规定正整数的第一个字节的最高位

21、必须是0,即Xk的最高为必须是0,为1的话则为负数例如:x = 49468= 193 * 256 + 60 = 0xC1 * 0x FF + 0x3C; 即X1=0xC1, X0 = 0x3C。 按正常规定,编码应该是 0x02 02 C1 3C, 但是X1的最高位是1, 应该被看成负数最简单的方法是用前端零字节进行填充编码变为 0x02 02 00 C1 3C。负整数的编码有些复杂要先找到一个最小的256的幂,使它比要编码的负数的绝对值还要大例如:x = - 1555; 被1555大的256的最小的幂是2562 = 65536; 然后将这个数跟负数相加以得到2的补码 65536 + (-15

22、55) = 63981 = 0xF9 * 0xFF + 0x ED。 则编码为 0x02 02 F9 ED。 以下是一些常用整数编码的例子:值编码00x02 01 0010x02 01 0120x02 01 021270x02 01 7F1280x02 02 00 80-10x02 01 FF-1280x02 01 80-327680x02 02 80 0012345678900x02 04 49 96 02 D210.3. ASN.1位串类型位串(BIT STRING)类型以可移植形式表示位数组除了ASN。1头部两个字节之外,还有一个附加的头部用来表示填充数据(通常是一个字节,因为填充是为了

23、形成一个完整的字节)编码规则:位串的第一位放到第一个负载字节的第8位;位串的第二位放到第一个负载字节的第7位; 依此类推填充满第一个负载字节,就继续填充第二个负载字节如果最后一个负载字节未被填充满,空的位用0来填充, 0的个数存放到头部用来表示填充数据的那个字节里下面举例说明:有一个位串1,0,0,0,1,1,1,0,1,0,0,1,开始填充负载字节第一个字节填充后为10001110 = 0x 8E; 第二个字节填充后为10010000 = 0x90, 低位4个0为填充的空位则,负载为2个字节加上表示填充0个数的一个字节0x04总共3个字节则完整的编码为:0x03 03 04 8E 90。解码

24、器通过计算8 * 负载长度 - 填充数 来得到存储输出所需要的位数10.4. ASN.1八位位组串类型八位位组串(OCTET STRING)是保存字节数组,它和位串类型(BIT STRING)很相似这种编码非常简单,像其他类型一样对头部进行编码,然后直接将八位位组复制过去即可例如:对FE, ED, 6A, B4编码;首先存储类型0x04, 接着是长度0x04,然后是字节本身0xFE ED 6A B4; 完整的编码为 0x04 04 FE ED 6A B4。10.5. 空类型空(NULL)类型实际上是占位符, 它是含有空白选项的选择修改器所特有。例如: MyAccount := SEQUENCE

25、 Name IA5String,Group IA5String,Credentials CHOICE rsaKey RSAPublicKey,passwdHash OCTET STRING,none NULL 在上面这个结构中,帐号的证书应该包含一个RSA密钥或一个密码散列值或什么都没有空类型的编码是 0x05 00。10.6. 对象标识标符类型对象标识符(OBJECT IDENTIFIER, OID)类型用层次的形式来表示标准规范。标识符树通过一个点分的十进制符号来定义,这个符号以组织,子部分然后是标准的类型和各自的子标识符开始。例如:Application-context-name的LN引

26、用 表示为joint-iso-ccitt(2) country (16) country-name(756) identified-organization(5) DLMS-UA (8) Application-context (1) context_id(1)对OID的编码规则: 前两部分如果定义为x。y, 那么它们将合成一个字40*x + y, 其余部分单独作为一个字节进行编码。每个字首先被分割为最少数量的没有头零数字的7位数字。这些数字以big-endian格式进行组织,并且一个接一个地组合成字节。 除了编码的最后一个字节外,其他所有字节的最高位(位8)都为0。Application-c

27、ontext-nameOID的编码:第一步:将2.16.756.5.8.1.1转换成字数组 96, 756, 5, 8, 1,1。第二步:将每个字分割为带有最高位的7位数字,0x60,ox85,0x74,0x05,0x02,0x08,0x01,0x01。第三步:完整的编码为 06 07 60 85 74 05 02 08 01 01。10.7. ASN.1序列和集合类型序列(SEQUENCE)和单一序列(SEQUENCE OF)以及相应的集合(SET)和单一集合(SET OF)类型叫做结构类型或简单容器它们是一种用来把相关数据元素收集为一个独立的可解码元素的简单方法。序列编码有以下性质:1.

28、编码是结构化的即头字节的位6必须设置。2. 编码的内容是由ASN。1序列类型定义列表中的所有数据类型值的完全编码所组成,并且按照它们出现的顺序进行编码,除非这些类型被可选(OPTIONAL)或默认(DEFAULT)关键字所引用。例:考虑如下序列 User := SEQUENCE IDINTEGER, Active BOOLEAN 当取值为32,TRUE时,编码为 0x 30 06 02 01 20 01 01 FF 在ASN.1文档里,使用空格来表示编码的属性0x30 0602 01 2001 01 FF10.8. ASN.1可打印字符串和IA5String类型可打印字符串对象是ASCII集合

29、的一个有限子集,这个子集包括32,39,4041,4358,61,63以及65122。IA5String类型的编码对象是ASCII集合中的大多数包括NULL,BEL,TAB,NL,LF,CR以及32126。 可打印字符串和IA5String的编码和八位位组串相似可打印字符串的头字节是0x13, IA5String的是0x16。 例如:Hello World的编码为0x13 0B 48 65 6D 6D 6F 20 57 6F 72 6D 64。 10.9. ASN.1世界协调时类型 世界协调时(UTCTIME)定义了一种相对GMT时间的标准时间(以日期)编码。它使用YYMMDDHHMMSSZ的格式分别表示年,月,日,时,分,秒。 其中Z是遗留自初始的UTCTIME。 如果没有Z,就允许两种附加组+/-hh mm,其中hh和mm分别为与GMT的时差和分差。 如果有Z,则时间是以Zulu或GMT时间表示。字符串的编码按照IA5String编码规则进行转换(ASCII字符集),其头字节为0x17而不是0x16。 例如: July 4,2003 at 11:33 and 28 seconds编码为030704113328Z, 再编码0x17 0D 30 33 30 37 30 34 31 31 33 33 32 38 5A。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com