B05IEC6技术文档ASN1语法详解.docx

上传人:b****8 文档编号:9347170 上传时间:2023-02-04 格式:DOCX 页数:17 大小:119.80KB
下载 相关 举报
B05IEC6技术文档ASN1语法详解.docx_第1页
第1页 / 共17页
B05IEC6技术文档ASN1语法详解.docx_第2页
第2页 / 共17页
B05IEC6技术文档ASN1语法详解.docx_第3页
第3页 / 共17页
B05IEC6技术文档ASN1语法详解.docx_第4页
第4页 / 共17页
B05IEC6技术文档ASN1语法详解.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

B05IEC6技术文档ASN1语法详解.docx

《B05IEC6技术文档ASN1语法详解.docx》由会员分享,可在线阅读,更多相关《B05IEC6技术文档ASN1语法详解.docx(17页珍藏版)》请在冰豆网上搜索。

B05IEC6技术文档ASN1语法详解.docx

B05IEC6技术文档ASN1语法详解

 

IEC62056技术文档

 

ASN.1语法简介

 

深圳市航天泰瑞捷电子有限公司

 

修订记录

版本

日期

作者

备注

1。

0

2012-5-23

梁高强

初版

范围:

本文就IEC62056系列标准中涉及的ASN.1语法进行简要概述,便于协助开发工程师阅读、理解DLMS/COSEM通信协议。

 

目录

1.ASN.1是什么5

2.ASN.1历史5

3.应用领域5

4.ASN.1语法7

5.ASN.1显式值(ExplictValue)7

6.ASN.1容器7

7.ASN.1修改器8

7.1.可选(OPTIONAL)8

7.2.默认(DEFAULT)8

7.3.选择(CHOICE)8

8.ASN.1头字节(tag)8

8.1.类别位9

8.2.结构化位9

8.3.原始类型9

9.ASN.1长度编码10

9.1.定长方式10

9.1.1.短编码。

10

9.1.2.长编码。

11

9.2.不定长方式11

10.ASN.1的数据类型11

10.1.ASN.1布尔类型12

10.2.ASN.1整数类型12

10.3.ASN.1位串类型13

10.4.ASN.1八位位组串类型13

10.5.空类型14

10.6.对象标识标符类型14

10.7.ASN.1序列和集合类型14

10.8.ASN.1可打印字符串和IA5String类型15

10.9.ASN.1世界协调时类型15

 

ASN.1语法简介

1.ASN.1是什么

ASN.1全称为abstractsyntaxnotationdotone,抽象语法1(数字1被ISO加在ASN的后边,是为了保持ASN的开放性,可以让以后功能更加强大的ASN被命名为ASN.2等,但至今也没有出现),是一种独立于机器的描述语言,用于描述在网络上传递的消息。

通俗的来讲,抽象语法就是协议采用ASN.1规范描述的描述文本,这里涉及到另一个语法:

传输语法,就是实际通讯系统间的码流。

例如字母A为抽象语法,0X41为传输语法。

2.ASN.1历史

开始于1982年,许多开发应用层标准的人意识到他们面临同一个问题:

数据结构变得越来越复杂,难以用预定的规程来编码比特或字节,ASN.1由此而生,它特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构,它不是用一些表格,及一些固定的帧格式来描述的,而是用一种抽象语法语言来描述。

这样做的好处是,极大的提高了协议的抽象性和通用性,可扩展性。

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语音——在通信领域中的另一个重要应用是通过包转换网络(如因特网)传递语音数据。

多媒体数据信号编解码器(CODEC)标准(H.323等等)基于ASN.1并且使用于分组编码标准来获取理想的数据传输速率。

安全应用——因特网安全授权同样也使用了ASN。

1。

高级编码标准在数据表示方面形成了一个方便的、平台无关的标准,比加密要优越。

PKIX、PKCS和X。

509也是我们所熟悉的标准,它们也是基于ASN.1的。

传统通信网络——ASN.1和基本编码规则(BER)已经在主要通信领域流行了很长一段时间,所有的ss7到ISDN的一切都使用了ASN.1BER信息在各种类型的设备和计算机之间传递信号。

军事和空间应用——美国国家宇航局(NASA)在其航空通信网规范中,也正在使用ASN.1和分组编码规则作为空对地或地对空协议。

在DLMS中的应用如下图所示:

例COSEM-OPEN.request服务原语,用ASN。

1描述出来如下所示

AARQ-apdu:

:

=[APPLICATION0]IMPLICITSEQUENCE

{

protocol-version[0]IMPLICITBITSTRING{version1(0)}DEFAULT{version1},

application-context-name[1]Application-context-name,

called-AP-title[2]AP-titleOPTIONAL,

called-AE-qualifier[3]AE-qualifierOPTIONAL,

called-AP-invocation-id[4]AP-invocation-identifierOPTIONAL,

called-AE-invocation-id[5]AE-invocation-identifierOPTIONAL,

calling-AP-title[6]AP-titleOPTIONAL,

calling-AE-qualifier[7]AE-qualifierOPTIONAL,

calling-AP-invocation-id[8]AP-invocation-identifierOPTIONAL,

calling-AE-invocation-id[9]AE-invocation-identifierOPTIONAL,

.Thefollowingfieldshallnotbepresentifonlythekernelisused。

.sender-acse-requirements[10]IMPLICITACSE-requirementsOPTIONAL,

--Thefollowingfieldshallonlybepresentiftheauthenticationfunctionalunitisselected。

mechanism-name[11]IMPLICITmechanism-nameOPTIONAL,

--Thefollowingfieldshallonlybepresentiftheauthenticationfunctionalunitisselected。

calling-authentication-value[12]EXPLICITauthentication-valueOPTIONAL,

implementation-information[29]IMPLICITimplementation-dataOPTIONAL,

user-information[30]IMPLICITassociation-informationOPTIONAL

}

4.ASN.1语法

ASN.1语法遵循传统的巴科斯范式BNF风格,最基本的表达式如:

 Name:

:

=type。

表示为定义某个名称为Name的元素,它的类型为type。

例如:

MyName:

:

=IA5String。

表示为定义了一个名为MyName的元素或变量,其类型为ASN.1类型IA5String(类似于ASCII字符串)。

一个用ASN.1语法描述的数据帧,看上去应该是下面的样子:

Name:

:

=[tag]IMPLICIT/EXPLICITDatatype

{

null-data[0]IMPLICITNULL,

item1[1]IMPLICIT/EXPLICITDatatypeA1OPTIONAL

item2[2]IMPLICIT/EXPLICITDatatypeA2OPTIONAL

item3[3]Datatype

}

5.ASN.1显式值(ExplictValue)

有些时候,我们需要定义一种ASN.1类型,它的子集元素包含预定义值。

Name:

:

=type(ExplictValue)。

显式值(ExplictValue)必须是ASN.1类型允许选择的值,而且也必须是元素所允许的值。

例:

MyName:

:

=IA5String(Tom)表示MyName是字符串Tom的IA5String编码。

又例如:

MyName:

:

=IA5String(Tom|Joe)表示字符串的值既可以是Tom,也可以是Joe。

这种语法的使用是为了扩展确定的解码器,例:

Data-Access-Result:

:

=ENUMERATED

{

Success(0)

Hardware-flaut

(1)

Temporary-failure

(2)

Read-write-denied(3)

Other-reason(250)

}

6.ASN.1容器

容器是值一个包含了其他相同或者不同类型元素的数据类型(例如序列值SEQUENCE或集合值SET类型).目的是为了组合一些复杂的数据类型集.ASN.1规范定义了4种容器类型:

序列,单一序列(SEQUENCEOF),集合和单一集合(SETOF).虽然它们意义不同,但是语法是一样的。

Name:

:

=Container{NameType[NameType。

]}方括号中的内容和容器的元素个数都是可选项。

还可以进行嵌套定义。

例:

Get-Request-With-List:

:

=SEQUENCE

{

Invoke-id-and-priorityInvoke-And-Priority

Attribute-descriptor-listSEQUENCEOFCosem-Attribute-Descriptor-With-Selection

}

7.ASN.1修改器

ASN.1定义了各种修改器,如可选(OPTIONAL),默认(DEFAULT),和选择(CHOICE)。

他们可以改变表达式的声明.典型地用于定义一种要求编码灵活,而定义又不繁琐的类型。

7.1.可选(OPTIONAL)

顾名思义,其表示改变一个元素以便在编码时它的类型是可选择的.即编码器可以忽略这个元素,解码器不能假设它将出现。

定义:

Name:

:

=TypeOPTIONAL

7.2.默认(DEFAULT)

默认修改器允许容器包含默认值.如果待编码的数据值等同于它的默认值,那么它将在发送的数据流中被忽略。

7.3.选择(CHOICE)

选择修改器允许一个元素在给定的实例中可以有多个可能值。

GET-Respose:

:

=CHOICE

{

get-respone-normal[1]IMPLICITGet-Response-Normal

get-response-with-datablock[2]IMPLICITGet-Response-With-Datablock

get-response-with-list[3]IMPLICITGet-Response-With-List

}

8.ASN.1头字节(tag)

头字节(hearderbyte)位于ASN.1编码的开始,通常是一个八位组,由3部分组成,有如下两种形式,如下图:

 

当Tag不大于30时,Tag只在一个八位组中编码;当Tag大于30时,则Tag在多个八位组中编码。

在多个八位组中编码时,第一个八位组后五位全部为1,其余的八位组最高位为1表示后续还有,为0表示Tag结束。

 

8.1.类别位

类别位(classificationbits)由两位表示,用来描述数据将要解释的上下文。

                 

位7

位6

类别及解释

0

0

通用(Universal)

0

1

应用(Application)

1

0

上下文特定(ContextSpecific)

1

1

专用(Private)

所有的类型中,通用类别最常用。

8.2.结构化位

结构化位(constructedbit)表示一个给定的编码是否是相同类型的多种编码的结构化。

结构化元素是容器类型必需的,因为在逻辑上,它们只是其他元素的集合。

结构化元素有自己的头字节和长度字节,之后是元素各个要素组件的单独编码。

也就是说,这些要素组件是独立地可解码ASN。

1数据类型。

严格的说,容器类是唯一允许使用结构化位的数据类型。

这是因为对于其他数据类型,给定内容,只允许一种编码。

所以其他所有数据类型的结构化位都为0。

8.3.原始类型

ASN.1头字节的低5位定义了32种ASN。

1的原始类型(primitivetype)

代码

ASN。

1类型

作用

1

布尔型

存储布尔值

2

整数

存储整数

3

位串

存储位数组

4

八位位串

存储字节数组

5

预留位(例如在选择修改器中)

6

对象标识符

标识算法及协议

16

序列和单一序列

未分类元素的容器

17

集合和单一集合

已分类元素的容器

19

可打印字符串

ASCII编码(忽略一些不可打印字符)

22

IA5String

ASCII编码

23

世界协调时

以统一格式表示的时间

9.ASN.1长度编码

根据编码的实际长度,ASN.1定义了两种长度编码(lengthencoding)方法,定长方式(长编码和短编码),不定长方式。

编码字节的最高位代表的是短编码还是长编码;而低7位则形成一个长度立即数。

9.1.定长方式

9.1.1.短编码。

在短编码中,负载的长度必须小于128字节。

长度立即数用来表示负载的长度。

例如,对于一个长度为65(0x41)的负载进行编码,其长度编码字节只需简单的设置为0x41即可。

因为其最高位是0,则编码器可以判断出这是短编码,而且长度是65。

9.1.2.长编码。

在长编码中,定义了附加的抽象数据来对长度进行编码,它仅适用于所有长度为128字节或以上的负载。

在这种模式下,长度立即数存储的是为了表示负载长度所需的字节数。

这个长度必须以big-endian格式进行编码。

例如,为一个长度为47310(0xB8CE)的负载进行编码,因为它的长度大于127,所以要采用长编码方式。

实际的长度需要1个字节来表示。

则,长度编码字节为0x8102;然后用big-endian格式存储的长度值为0xB80xCE。

则全部长度编码为0x8102B8CE。

9.2.不定长方式

Length所在八位组固定编码为0x80,但在Value编码结束后以两个0x00结尾。

这种方式使得可以在编码没有完全结束的情况下,可以先发送部分消息给对方。

 

图解如下所示:

10.ASN.1的数据类型

ASN.1针对广泛的应用定义了多种数据类型,这里只讨论跟DLMS相关的数据类型。

我们将讨论如下数据类型:

布尔型(Boolean);

八位位组串(OCTETString);

位串(BITString);

IA5String;

可打印字符串(PrintableString);

整数(INTEGER);

对象标识符(OBJECTIdentifier,OID);

世界协调时(UTCTIME);

空(NULL);

序列,单一序列;

集合;

单一集合;

任何ASN.1编码都是以两个字节开始(或者八位位组,含有8个二进制位),不管什么类型它们都是通用的.第一个字节是类型标识符,也包含一些修正位;第二各字节是长度。

10.1.ASN.1布尔类型

布尔编码的负载或者是全0或者是任何不是全0的八位位组。

头字节以0x01开始,长度编码字节为0x01,负载内容取决于布尔值的取值。

布尔值

编码

False

0x010100

True

0x0101FF

10.2.ASN.1整数类型

整数类型表示一个有符号的任意精度的标量,它的编码是可移植,平台无关的。

正整数的编码比较简单。

每个字节表示的最大整数是255(0xFF),存储的实际数值分成字节大小的数字,并且以big-endian格式存储。

例如:

八位位组{Xk,Xk-1,。

X0}将以递减的顺序从Xk到X0进行存储.编码规定正整数的第一个字节的最高位必须是0,即Xk的最高为必须是0,为1的话则为负数.例如:

 x=49468=193*256+60=0xC1*0xFF+0x3C;即X1=0xC1,X0=0x3C。

按正常规定,编码应该是0x0202C13C,但是X1的最高位是1,应该被看成负数.最简单的方法是用前端零字节进行填充.编码变为0x020200C13C。

负整数的编码有些复杂.要先找到一个最小的256的幂,使它比要编码的负数的绝对值还要大.例如:

x=-1555;被1555大的256的最小的幂是256^2=65536;然后将这个数跟负数相加以得到2的补码.65536+(-1555)=63981= 0xF9*0xFF+0xED。

则编码为0x0202F9ED。

     以下是一些常用整数编码的例子:

编码

0

0x020100

1

0x020101

2

0x020102

127

0x02017F

128

0x02020080

-1

0x0201FF

-128

0x020180

-32768

0x02028000

1234567890

0x0204499602D2

10.3.ASN.1位串类型

位串(BITSTRING)类型以可移植形式表示位数组.除了ASN。

1头部两个字节之外,还有一个附加的头部用来表示填充数据(通常是一个字节,因为填充是为了形成一个完整的字节).编码规则:

位串的第一位放到第一个负载字节的第8位;位串的第二位放到第一个负载字节的第7位;依此类推.填充满第一个负载字节,就继续填充第二个负载字节.如果最后一个负载字节未被填充满,空的位用0来填充,0的个数存放到头部用来表示填充数据的那个字节里.

下面举例说明:

有一个位串{1,0,0,0,1,1,1,0,1,0,0,1},开始填充负载字节.第一个字节填充后为10001110=0x8E;第二个字节填充后为10010000=0x90,低位4个0为填充的空位.则,负载为2个字节加上表示填充0个数的一个字节0x04总共3个字节.则完整的编码为:

0x0303048E90。

解码器通过计算8*负载长度-填充数来得到存储输出所需要的位数.

10.4.ASN.1八位位组串类型

八位位组串(OCTETSTRING)是保存字节数组,它和位串类型(BITSTRING)很相似.这种编码非常简单,像其他类型一样对头部进行编码,然后直接将八位位组复制过去即可.例如:

对{FE,ED,6A,B4}编码;首先存储类型0x04,接着是长度0x04,然后是字节本身0xFEED6AB4;完整的编码为0x0404FEED6AB4。

10.5.空类型

空(NULL)类型实际上是"占位符",它是含有空白选项的选择修改器所特有。

例如:

         MyAccount:

:

=SEQUENCE

{

                   Name                           IA5String,

                   Group                          IA5String,

                   Credentials                   CHOICE

{

                     rsaKey          RSAPublicKey,

                             passwdHash OCTETSTRING,

                             none              NULL

                     }

          }

    在上面这个结构中,帐号的证书应该包含一个RSA密钥或一个密码散列值或什么都没有.空类型的编码是0x0500。

10.6.对象标识标符类型

对象标识符(OBJECTIDENTIFIER,OID)类型用层次的形式来表示标准规范。

标识符树通过一个点分的十进制符号来定义,这个符号以组织,子部分然后是标准的类型和各自的子标识符开始。

例如:

Application-context-name的LN引用表示为"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-context-nameOID的编码:

第一步:

将2.16.756.5.8.1.1转换成字数组{96,756,5,8,1,1}。

第二步:

将每个字分割为带有最高位的7位数字,{{0x60},{ox85,0x74},{0x05},{0x02,{0x08},{0x01},{0x01}}。

第三步:

完整的编码为06076085740502080101。

 

10.7.ASN.1序列和集合类型

序列(SEQUENCE)和单一序列(SEQUENCEOF)以及相应的集合(SET)和单一集合(SETOF)类型叫做"结构"类型或简单容器.它们是一种用来把相关数据元素收集为一个独立的可解码元素的简单方法。

序列编码有以下性质:

1.编码是结构化的.即头字节的位6必须设置。

2.编码的内容是由ASN。

1序列类型定义列表中的所有数据类型值的完全编码所组成,并且按照它们出现的顺序进行编码,除非这些类型被可选(OPTIONAL)或默认(DEFAULT)关键字所引用。

例:

考虑如下序列

 User:

:

==SEQUENCE

{

         ID    INTEGER,

         ActiveBOOLEAN

    }

    当取值为{32,TRUE}时,编码为0x30060201200101FF}在ASN.1文档里,使用空格来表示编码的属性.

0x3006

        020120

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 水产渔业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1