ASNPER编码规范模板_第1页
ASNPER编码规范模板_第2页
ASNPER编码规范模板_第3页
ASNPER编码规范模板_第4页
ASNPER编码规范模板_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。ASN.1编码规范及实现方式ASN.1语言概述ASN.1(AbstractSyntaxNotationNumberOne),抽象语法描述1,是一种ISO/ITU-T标准。该语言描述了一种对数据进行表示、编码、传输和解码的数据格式,它提供的一整套正规的格式用于描述对象的结构,具有类似于面向对象程序设计语言中所提供的类型机制,可定义任意复杂结构的数据类型,而不同的数据类型之间还能够有继承的关系。因此,ASN.1是以一种独立于计算机架构和语言的方式来描述数据结构的。同时,ASN.1的描述能够容易地映被射成C、C++或Java的数据结构,直接作为应用程序代码使用,并得到运行程序库的支持。ASN.1作为一种数据表示标准产生于20世纪80年代早期的开放系统互联(OSI)网络模型,虽然OSI模型并没有得到广泛的应用,可是ASN.1标准在继续进化。今天已有大量的实际应用,这些应用包括:3G移动系统、IP语音、安全应用、传统电信网络、军事和空间应用等许多方面。另外,ASN.1有多种标准化编码规则:如基本编码规则(BER)、规范编码规则(CER)、识别名编码规则(DER)、压缩编码规则(PER)和XER编码规则(XER)。这些编码规则描述了如何对ASN.1中定义的数值进行编码,以便用于传输,而与计算机、编程语言或它在应用程序中如何表示等因素无关。同时,该编码具有先进的标识系统、信息扩展性、支持快速可靠传输等特点,这在无线传输中是一种优势。因此,ASN.1不但适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构,而且还有适合的协议编码方式。同时,3GPP标准ASN.1文档中也包含了完整、详细的数据单元(PDU)协议。这些都为3G移动系统中ASN.1的应用打下了基础。3G协议的ASN编码跟一般的编码相比具有高效性、严谨性以及规范性等特点。二、PER编码简介3GPP的规范中,由ASN.1到传输码的转换统一使用定义在ITU-TX.691中的PER(PackedEncodingRules)规则,因此这里讲的ASN编译码规则也就是ASN编码中的PER编译码规则。PER有两个变体:对齐方式和非对齐方。对齐方式用于:Iub、Iur、Iu接口的ASN.1的传输编码。非对齐方式:仅用于空中(UU)接口的ASN.1转换,两者的编码过程基本相同。在对齐的方式下,若前面所有单元的信息经编码后得到的比特流长度不是一个八位组的倍数,而后一个信息又是以八位组为单位的(字符串),那么就需要在前面生成的比特流后面补”0”,使其长度为8的倍数。因此一般补的位数为0~7bit。而非对齐的方式无此限制。所有信息单元按编码规则生成的比特数据将按其被编码的顺序首尾相连,中间不需要任何填充。按ITU-TX.691的规定,若最终的编码结束后。所得的编码不是8的倍数,信息编码结束后的填充由RRC负责。另外,PER编译码必须依赖于3GPP的标准文档,也就是说,收发双方也必须知道层3消息的具体结构,这样编码和译码的才能被编译和识别。三、PER的编码规则PER的编码规则定义了多种数据类型,简单的地可分为两大类。第一类是结构类,如CHOICE、SEQUENCE、ENUMERATED等。另一类是简单类,如INTEGER、REALL、BOOLEAN等。下面将对以下常见的类型的编码规则做一个总结:3.1INTEGER整型是协议规范中用得最多的一种数据类型。对这种数据类型编码之前,首先要确定其取值范围,即上下界之间的数的个数。而编码的长度是根据数的范围来确定的。当2m<范围≤2m例1:TimeslotNumber::= INTEGER(0..14)上面的例子中TimeslotNumber为整型,范围是0~14共15个数,因为23<15<24,故编码为4bit,若取值为7,则编码为0111。例2:MaxAllowedUL-TX-Power::= INTEGER(-50..33)同理,MaxAllowedUL-TX-Power为整型,范围是-50~33共84个数,26<84<27编码长度为7bit,若取值为0,则编0的索引值50(-50的索引值为0),因此编码为:0110010。3.2BOOLEAN布尔逻辑型编码只须1bit。用”1”表示TRUE,”0”表示FALSE。例:DL-TM-RLC-Mode::= SEQUENCE{ segmentationIndication BOOLEAN}上面的segmentationIndication是一个BOOLEAN型,意思是段的指示。当我们需要这种指示时编码为1,不需要时编码为0。3.3BITSTRING比特串的编码分成两种情况:长度固定:直接将比特串与前面的比特流叠加即可;长度可变:按前述整型编码的规则,以描述长度范围最少比特的原则在比特串前面加上用于描述长度所需的比特,然后将待编码的比特串加在后边。例1:RoutingParameter::= BITSTRING(SIZE(10))上面的RoutingParameter是一个定长,且长度为10的比特串,编码时直接给出10位二制数,例如编码为:‘’。例2:SIB-Data-variable::= BITSTRING(SIZE(1..214))SIB-Data-variable是一个变长的比特串,编码之前首先编长度,因为长度的范围为1~214共需要编8比特,因此若SIB-Data-variable是一个5位的比特串时则编码为:0000010011111(前面8位是比特串长度的编码,后面5位是该比特串的值)。3.4OCTETSTRING八位组串编码的原则与比特串相同。分成长度可变的八位串和长度不可变的八位串两种。与比特串编码不同的是编码的值是八位串而不是比特串。例:VALUE::=OCTETSTRING(SIZE(1..8))若VALUE值是长度为3的八位串,则编码为:010,后面跟着3个因为长度区间为八,因此长度编码L为3位,而3-bmin=2。因此编码为010。后面则跟着3个八位组如:000000001111111100000000。3.5CHARACTERSTRINGS字符串的编码方式有多种情况的编码方式与BITSTRING和OCTETSTRING的编码方式类似,只是对不同类型的字符串有不同的编码方法,下面将着重说明CHARACTERSTRINGS中常见的NumricString、PrintableString、NameString的编码方法:①NumricString类型中成员为0~9,共十个数。因此在编码时长度可定为4bit(23<10<24).,因此此种类型的串编码是每个数字编为4比特。同理,PrintableString中包含的字符为:”a..z”、”A..Z”、”0..9”、”space”、”,”、”(”、”)”,”+”、”、”、”-”、”/”、”.”、”=”、”?”、”:”共74个字符,每个字母应编码为7比特。NameString共52个大小写字母,每个字母编码则为6bit。②NumricString123的编码为:000100100011。NameString”cat”编码为:011100011010100010,上面每个字母编6比特,每个字母的值是其在NameString中的索引值。3.6NULLNULL类型不用编码。3.7ENUMERATED枚举型的编码类似于整型,也是以描述枚举内全体成员所需比特数最少的原则进行编码。其值的范围从0开始。枚举类型编码时,只对其项的索引值编码。例:Modulation::= ENUMERATED{mod-QPSK,mod-8PSK}上面是一个Modulation是枚举类型,编码时,首先看枚举项的个数为2,21=2,因此编码为1bit,当选mod-QPSK调制模式时编码为0,选mod-8PSK调制模式时编码为1。3.8CHOICE选择型的编码类似于整型,以最少的比特来描述选择体内各成员的索引值。值的范围从0开始。与枚举不同的是,编完CHOICE的索引值,紧接着就应编码索引值对应的单元。而枚举型将索引值编完后就结束。下面将以一个例子对这种类型的编码进行说明:例:NumberOfTransportBlocks::= CHOICE{ zero NULL, one NULL, small INTEGER(2..17), large INTEGER(18..512)}NumberOfTransportBlocks是一个选择类型,若信息传输块的个数为16,则应该选择CHOICE的small项,然后在对该项值进行编码。首先CHOICE里有4项,编码为2bit,small为第3项编码值为2,选择项编码为:10。然后再对small项编码,因为取值为16,索引值为14,整数范围是2~17共16个数,要编4比特,因此要对索引值14编4比特,即编码为:1110。3.9SEQUENCE一般说来,序列编码后都会产生一个前导位图,用以指示序列中的可选项或缺省项是否存在。每以可选项(或缺省项)用1bit来指示,”1”表示存在,”0”表示不存在。若一个序列型中包含n个标注为可选(或缺省)的成员,那么,前导位图的长度就是nbit。位图中的比特顺序与序列中各可选(或缺省)的成员排列一致。然后再对SEQUENCE中的各成员进行编码,这种类型对应于C语言中的结构。下面将以实例来说明:IndividualTimeslotInfo-LCR::= SEQUENCE{ timeslotNumber INTEGER(1..15)OPTIONAL, tfci-Existence BOOLEAN, midambleShiftAndBurstType MidambleShiftAndBurstType-LCROPTIONAL, modulation ENUMERATED{mod-QPSK,mod-8PSK}, ss-TPC-Symbols NULL, additionalSS-TPC-Symbols INTEGER(1..15) OPTIONAL}上面是一个SEQUENCE结构编码时我们分两步进行:确定其前导位图.该结构中有3个可选项,故可确定位图长度为3bit。我们根据需要选择其中的项,若某项选择了编码位图为1,否则为0。假设我们选择了timeslotNumber而其它项都不选的话,则在对结构内部编码之前应编码为:100根据SEQUENCE结构内部的项,从上到下依次编码。TimeslotNumber取值为6,则编码为0101;tfci-Existence存在TFCI指示,则编码为1;modulation选择mod-QPSK,编码为0;ss-TPC-Symbols为空类型,不用编码综上可得:该结构编码为1000101103.10SEQUENCE(SIZE(ib..ub))OFcomponentSEQUENCEOF在ASN.1描述中用作循环。循环次数由SIZE确定。SEQUENCEOF的前导比特为SIZE中数的范围,编码规则与整数型相同。紧跟在前导比特之后的是循环体成员component的编码,component能够是结构也能够是一个整型的参数。各成员编码后顺序放置,每两个成员之间编码值不需分隔符,该类型对应于C语言中的数组。下面将以一个例子来说明:MNC::= SEQUENCE(SIZE(2..3))OFDigitDigit::= INTEGER(0..9)上面的MNC移动网络码,在上面的循环中我们将分几步说明:①首先确定其循环次数,由SIZE(2..3)可知其循环的次数为2~3次,一般我们选择2次,则编码为0。②第一次对Digit进行编码为:0010(取值为2)。③第二次对Digit进行编码为:0011(取值为3)。综上,对该循环编码为:000100011。四、PER编码实例分析下面我将以手机释放流程中的RRCCONNECTIONRELEASE消息为例讲述PER编译码过程:手机释放协议流程分CC层释放、RRC释放等2个阶段。其具体协议流程如图1所示。UEUE通话过程DISCONNECTRELEASERELEASECOMPLETERRCCONNECTIONRELEASERRCCONNECTIONRELEASECOMPLETENETWORK图1手机释放协议流程上面的协议流程是通话完成后终止UE和网络连接过程,包括两个部分,前一个部分是完成呼叫终止过程,后面的一部分是信令链路的释放过程,包括释放UE和UTRAN之间的全部无线承载和释放所有建立的信令连接。这里我将在下行公共控制信道上的消息RRCCONNECTIONRELEASE为例来说明这条消息的编码:DL-CCCH-Message::=SEQUENCE{ integrityCheckInfo IntegrityCheckInfo OPTIONAL, message DL-CCCH-MessageType}编码:0。上面SEQUENCE结构有一个可选项,要编一个1bit的位图,该项选择编码为1,否则为0。DL-CCCH-MessageType::=CHOICE{ cellUpdateConfirm CellUpdateConfirm-CCCH, rrcConnectionReject RRCConnectionReject, rrcConnectionRelease RRCConnectionRelease-CCCH, rrcConnectionSetup RRCConnectionSetup, uraUpdateConfirm URAUpdateConfirm-CCCH, spare3 NULL, spare2 NULL, spare1 NULL}编码:010。CHOICE结构的编码方法是:首先对选择项的索引值进行编码,然后对选择项进行编码,每次只能选择一项。这里010是对索引值的编码,因为供选择的项共有8项,23=8编3bit,而索引值是从0开始的,因此这里的第三项编码值为2。RRCConnectionRelease-CCCH::=CHOICE{r3 SEQUENCE{ rrcConnectionRelease-CCCH-r3 RRCConnectionRelease-CCCH-r3-IEs,rrcConnectionRelease-CCCH-r3-add-ext BITSTRINGOPTIONAL },later-than-r3 SEQUENCE{ u-RNTI U-RNTI, rrc-TransactionIdentifier RRC-TransactionIdentifier,}}③编码为:00。首先上面是一个CHOICE结构,共有两项编1bit,我们选择第一项编码为0;r3 为一个SEQUENCE结构,有一个可选项,此处不选,编码为0。RRCConnectionRelease-CCCH-r3-Ies::=SEQUENCE{ u-RNTI U-RNTI, rrcConnectionRelease RRCConnectionRelease-r3-IEs}U-RNTI::= SEQUENCE{ srnc-Identity SRNC-Identity, s-RNTI S-RNTI}SRNC-Identity::= BITSTRING(SIZE(12))S-RNTI::= BITSTRING(SIZE(20))④编码为000000000001;00000000000000000001。RRCConnectionRelease-CCCH-r3-IEs为SEQUENCE结构,没有可选项,因此两项都要编码。第一项SRNC-Identity是定长的比特串类型,编码时直接给出12bit长的串。同理第二项为20bit长的串。RRCConnectionRelease-r3-IEs::=SEQUENCE{ rrc-TransactionIdentifier RRC-TransactionIdentifier, n-308 N-308 OPTIONAL, releaseCause ReleaseCause, rplmn-information Rplmn-Information OPTIONAL}⑤编码:10。RRCConnectionRelease-r3-IEs为一个SEQUENCE结构上面有2个可选项,位图长度为2bit,第一项编码,第二项不编码,因此位图为10。RRC-TransactionIdentifier::= INTEGER(0..3)N-308::= INTEGER(1..8)⑥编码:00;001。整型RRC-TransactionIdentifier范围为0~3。共4个取值,编码为2bit,这里取值0编码为00。同理整型N-308编码长度应为3bit,取值为2,编码为001(注意是对索引值的编码)。ReleaseCause::= ENUMERATED{ normalEvent, unspecified, pre-emptiveRelease, congestion, re-establishmentReject, directedsignallingconnectionre-establishment, userInactivity, spare}⑦编码:000。ReleaseCause为枚举类型,枚举类型编码只是对选项的索引值编码,释放过程属于正常事件,故选第一项,编码为000。由于上面的编码是在空中(UU)接口上传输的,为了尽可能少的传输比特,编码是采用的是PER编码的非对齐方式,在这种方式下,上面每一步生成的编码依次叠加直到编码结束,然后以八个比特为单位组成八位组,若不够则在编码的末尾添零。上面的编码后组成串为:001000000000011000001000分成八位组为:001000000000000001000000000000000000011000001000正好组成六个八位组,因此不用添零。转换成十六进制编码为:200040000608。五、PER手工编译码总结PER编码中,对齐方式编码,添加0的前提是前面的编码不能组成一个或者多个八位组,而后面的编码长度是一个或多个八位组的长度,在这种情况下需要添加0。否则,就在前面码的后面继续叠加,最后再以八个位一组分成多个的八位组。因此,编码过程中,每到下一个编码长度是一个或多个八位组时,就得把前面的码分成一个或多个字节,并可能会添加0,添0的个数为0到7个。而非对齐的方式则一直叠加到编码编完后,再分成多个八位组。在编码的最后若剩下的是0到7比特,这种情况下再添加0,因此非对齐方式最多添7个0,而对齐方式是每次最多添7个0,但次数大于或等于1次。例如:XX::=SEQUENCE{ r-TransactionIdentifier R-TransactionIdentifier, releaseIdentifier ReleaseIdentifier, rplmn-information Rplmn-Information }RRC-TransactionIdentifier::= INTEGER(0..3)ReleaseIdentifier::=INTEGER(0..255)Rplmn-Information ::=BITSTRING(SIZE(7))设RRC-TransactionIdentifier取值为2,则编码为11。ReleaseIdentifier取值为80,则编码为01010000。Rplmn-Information取比特为”1011101在对齐方式下编码为:110000000101000010111010在非对齐方式下编码为:110101000010111010000000PER的译码过程与PER的编码过程相反,与PER编码不同的是,在译码之前并不知道程序的树型结构,只有根据编的码和3GPP文档在译码的过程中才能将程序提取出来,若在此过程中出错一般不能马上检查出来,在后续的译码中能够逐步的验证,因此译码过程也必须认真谨慎,否则会走很多弯路。总之,通信协议的PER编译码是以3GPP的协议文档为基础的,在掌握其编译码规则之后,还要求认真、细心的编译协议,这样才能够正确的完成编译码。六、软件的编译码对于软件的编码,还是以上面的手机释放过程的RRCCONNECTIONRELEASE消息为例来说明:软件的编码的原理与上面的编码原理一样,但机器在编码之前必须知道3GPP的标准协议25.331的程序结构,而且有相应参数的赋值,这样机器才能够将参数赋在固定的协议结构中并编出唯一正确的码,由于该流程中所有消息的ASN描述都在文档25.331里面,因此我们只需在将25.331整个文档当成标准的ASN协议,然后给所要编码的那条消息赋值后,控制软件输出相应的消息编码即可。下面将分步骤说明软件编码的过程:1.给所要编码的消息RRCCONNECTIONRELEASE赋值,并将其加在将要运行的ASN程序后面,在程序结束符END之前。下面是对RRC释放的赋值(赋值的每个参数就是上面手工编码时所选择的参数):myRRCConnectionReleaseDL-CCCH-Message::={messagerrcConnectionRelease:r3:{rrcConnectionRelease-CCCH-r3{u-RNTI{srnc-Identity'000000000001'B,s-RNTI'00000000000000000001'B},rrcConnectionRelease-r3{rrc-TransactionIdentifier0,n-3082,releaseCausenormalEvent}}}}2.打开OSS软件运行界面。3.按下键,找到赋了值的ASN文件,然后点Add键,将该文件添加到运行栏中。4.按下键,在Output.cFile中设置文件输出的格式,由于该消息是在空中传送的,为了尽量的减少冗余比特,协议规定了选择PER的非对齐编码方式。因此选择UNALIGENDPERencode/decode项。5.按下键,若程序运行无误,ASN文件了生成.C和.H文件到OSS软件的output文件夹中。6.将生成的.C和.H文件放入编码的文件夹中使用NMAKE命令生成编码。在编码文件夹中包含有:lib、bin、include三个文件夹,这三个文件夹是从下载的OSS软件中剪切过来的;五个应用扩展程序ossdmem.dll、cstrain.dll、ossapi.dll、soedper.dll、soedapi.dll;一个MS-DOS批处理文件switch.to.spartan.dlls;Makefile文件;common.mak文件;encode.c文件;ASN文件和它在OSS软件中生成的.c和.h文件。其中makefile文件规定了ASN编码的整个过程中的一系列规则,包括需要用到哪些链接文件,存放于哪个文件夹中,运用了哪些隐含规则等等,encode.c文件则控制消息的编码范围。实际上我们下载的OSS软件中有说明软件以及编译码的实例,根据它所给的文件修改其中的一部分就能够在DOS界面下运行NMAKE命令实现软件的编码。7.输出编码的结果DL-CCCH-MessageSEQUENCE[fieldcount(notencoded)=1]messageDL-CCCH-MessageTypeCHOICE[index=2]rrcConnectionReleaseRRCConnectionRelease-CCCHCHOICE[index=0]r3SEQUENCE[fieldcount(notencoded)=1]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论