1、ASN.1编码规范及实现方式一、 ASN.1语言概述ASN.1(Abstract Syntax Notation Number One),抽象语法描述1,是一种 ISO/ITU-T 原则。该语言描述了一种对数据进行表达、编码、传播和解码数据格式,它提供一整套正规格式用于描述对象构造,具备类似于面向对象程序设计语言中所提供类型机制,可定义任意复杂构造数据类型,而不同数据类型之间还可以有继承关系。因而,ASN.1是以一种独立于计算机架构和语言方式来描述数据构造。同步,ASN.1 描述可以容易地映被射成 C 、C+ 或 Java 数据构造,直接作为应用程序代码使用,并得到运营程序库支持。 ASN.1
2、作为一种数据表达原则产生于20世纪80年代初期开放系统互联(OSI)网络模型,虽然OSI模型并没有得到广泛应用,但是ASN.1原则在继续进化。今天已有大量实际应用,这些应用涉及:3G移动系统、IP语音、安全应用、老式电信网络、军事和空间应用等许多方面。此外,ASN.1 有各种原则化编码规则:如基本编码规则(BER)、规范编码规则(CER)、辨认名编码规则(DER)、压缩编码规则(PER)和 XER 编码规则(XER)。这些编码规则描述了如何对 ASN.1 中定义数值进行编码,以便用于传播,而与计算机、编程语言或它在应用程序中如何表达等因素无关。同步,该编码具备先进标记系统、信息扩展性、支持迅速
3、可靠传播等特点,这在无线传播中是一种优势。因而,ASN.1不但适合表达当代通信应用中那些复杂、变化及可扩展数据构造,并且尚有适合合同编码方式。同步,3GPP原则ASN.1文档中也包括了完整、详细数据单元(PDU)合同。这些都为3G移动系统中ASN.1应用打下了基本。3G合同ASN编码跟普通编码相比具备高效性、严谨性以及规范性等特点。 二、PER 编码简介3GPP规范中,由ASN.1到传播码转换统一使用定义在ITU-T X.691中PER(Packed Encoding Rules)规则,因而这里讲ASN编译码规则也就是ASN编码中PER编译码规则。PER 有两个变体:对齐方式和非对齐方。对齐方
4、式用于:Iub、Iur、Iu 接口ASN.1 传播编码。非对齐方式:仅用于空中(UU)接口ASN.1转换,两者编码过程基本相似。在对齐方式下,若前面所有单元信息经编码后得到比特流长度不是一种八位组倍数,而后一种信息又是以八位组为单位(字符串),那么就需要在前面生成比特流背面补“0”,使其长度为8倍数。因此普通补位数为07bit。而非对齐方式无此限制。所有信息单元按编码规则生成比特数据将按其被编码顺序首尾相连,中间不需要任何填充。按ITU-T X.691规定,若最后编码结束后。所得编码不是8倍数,信息编码结束后填充由RRC负责。此外,PER编译码必要依赖于3GPP原则文档,也就是说,收发双方也必
5、要懂得层3消息详细构造,这样编码和译码才干被编译和辨认。三、PER编码规则 PER编码规则定义了各种数据类型,简朴地可分为两大类。第一类是构造类,如CHOICE、SEQUENCE 、ENUMERATED 等。另一类是简朴类,如INTEGER、REALL 、BOOLEAN 等。下面将对如下惯用类型编码规则做一种总结: 3.1 INTEGER整型是合同规范中用得最多一种数据类型。对这种数据类型编码之前,一方面要拟定其取值范畴,即上下界之间数个数。而编码长度是依照数范畴来拟定。当2m范畴2m+1时,对该整数取值用m+1位二进制表达。但对范畴内数编码不是对其实值而是对其索引值进行编码,编码索引值是从0
6、开始。例1: TimeslotNumber :=INTEGER (0.14) 上面例子中TimeslotNumber为整型,范畴是014共15个数,由于231524,故编码为4bit,若取值为7,则编码为0111。例2: MaxAllowedUL-TX-Power :=INTEGER (-50.33) 同理,MaxAllowedUL-TX-Power为整型,范畴是5033共84个数,268427编码长度为7bit,若取值为0,则编0索引值50(-50索引值为0),因而编码为:0110010。3.2 BOOLEAN布尔逻辑型编码只须1bit。用“1”表达TRUE,“0”表达FALSE。例:DL-
7、TM-RLC-Mode :=SEQUENCE segmentationIndicationBOOLEAN上面segmentationIndication是一种 BOOLEAN型,意思是段批示。当咱们需要这种批示时编码为1,不需要时编码为0。3.3 BITSTRING比特串编码提成两种状况:长度固定:直接将比特串与前面比特流叠加即可;长度可变:按前述整型编码规则,以描述长度范畴至少比特原则在比特串前面加上用于描述长度所需比特,然后将待编码比特串加在后边。例1:RoutingParameter :=BIT STRING (SIZE (10)上面RoutingParameter是一种定长,且长度为1
8、0比特串,编码时直接给出10位二制数,例如编码为:。例2:SIB-Data-variable :=BIT STRING (SIZE (1.214)SIB-Data-variable是一种变长比特串,编码之前一方面编长度,由于长度范畴为1214共需要编8比特,因而若SIB-Data-variable是一种5位比特串时则编码为:00000100 11111(前面8位是比特串长度编码,背面5位是该比特串值)。3.4 OCTETSTRING八位组串编码原则与比特串相似。提成长度可变八位串和长度不可变八位串两种。与比特串编码不同是编码值是八位串而不是比特串。例: VALUE := OCTETSTRING
9、(SIZE(1.8)若VALUE值是长度为3八位串,则编码为:010,背面跟着3个由于长度区间为八,因此长度编码L为3位,而3bmin=2。因而编码为010。背面则跟着3个八位组如:00000000 11111111 00000000 。3.5 CHARACTER STRINGS 字符串编码方式有各种状况编码方式与BITSTRING 和OCTETSTRING 编码方式类似,只是对不同类型字符串有不同编码办法,下面将着重阐明CHARACTER STRINGS 中惯用NumricString、PrintableString、NameString编码办法: NumricString类型中成员为09,
10、共十个数。因而在编码时长度可定为4bit(231024).,因而此种类型串编码是每个数字编为4比特。同理,PrintableString中包括字符为:“a.z”、“A.Z”、“0.9”、“space”、“,”、“(”、“)”,“”、“、”、“-”、“/”、“.”、“”、“?”、“:”共74个字符,每个字母应编码为7比特。NameString共52个大小写字母,每个字母编码则为6bit。 NumricString 123 编码为: 0001 0010 0011。 NameString “cat”编码为: 011100 011010 100010,上面每个字母编6比特,每个字母值是其在NameSt
11、ring中索引值。3.6 NULLNULL类型不用编码。3.7 ENUMERATED枚举型编码类似于整型,也是以描述枚举内全体成员所需比特数至少原则进行编码。其值范畴从0开始。枚举类型编码时,只对其项索引值编码。例:Modulation :=ENUMERATED mod-QPSK ,mod-8PSK 上面是一种Modulation是枚举类型,编码时,一方面看枚举项个数为2,212,因而编码为1bit,当选mod-QPSK调制模式时编码为0,选mod-8PSK调制模式时编码为1。3.8 CHOICE选取型编码类似于整型,以至少比特来描述选取体内各成员索引值。值范畴从0开始。与枚举不同是,编完CH
12、OICE索引值,紧接着就应编码索引值相应单元。而枚举型将索引值编完后就结束。下面将以一种例子对这种类型编码进行阐明:例:NumberOfTransportBlocks:=CHOICE zeroNULL,oneNULL,smallINTEGER (2.17),largeINTEGER (18.512)NumberOfTransportBlocks是一种选取类型,若信息传播块个数为16,则应当选取CHOICEsmall项,然后在对该项值进行编码。一方面CHOICE里有4项,编码为2bit,small为第3项编码值为2,选取项编码为:10。然后再对small项编码,由于取值为16,索引值为14,整数
13、范畴是217共16个数,要编4比特,因而要对索引值14编4比特,即编码为:1110。3.9 SEQUENCE普通说来,序列编码后都会产生一种前导位图,用以批示序列中可选项或缺省项与否存在。每以可选项(或缺省项)用1bit来批示,“1”表达存在,“0”表达不存在。若一种序列型中包括n个标注为可选(或缺省)成员,那么,前导位图长度就是n bit。位图中比特顺序与序列中各可选(或缺省)成员排列一致。然后再对SEQUENCE 中各成员进行编码,这种类型相应于C语言中构造。下面将以实例来阐明:IndividualTimeslotInfo-LCR:=SEQUENCE timeslotNumberINTEG
14、ER(1.15) OPTIONAL,tfci-ExistenceBOOLEAN,midambleShiftAndBurstTypeMidambleShiftAndBurstType-LCR OPTIONAL,modulationENUMERATED mod-QPSK,mod-8PSK ,ss-TPC-SymbolsNULL ,additionalSS-TPC-SymbolsINTEGER(1.15) OPTIONAL上面是一种SEQUENCE构造编码时咱们分两步进行: 拟定其前导位图.该构造中有3个可选项,故可拟定位图长度为3bit。咱们依照需要选取其中项,若某项选取了编码位图为1,否则为0。
15、假设咱们选取了timeslotNumber而其他项都不选话,则在对构造内部编码之前应编码为:100 依照SEQUENCE构造内部项,从上到下依次编码。TimeslotNumber 取值为6,则编码为0101;tfci-Existence 存在TFCI批示,则编码为1;modulation 选取mod-QPSK,编码为0;ss-TPC-Symbols 为空类型,不用编码综上可得:该构造编码为100 0101 1 03.10 SEQUENCE(SIZE(ib.ub)OF componentSEQUENCE OF在ASN.1描述中用作循环。循环次数由SIZE 拟定。SEQUENCE OF前导比特为S
16、IZE中数范畴,编码规则与整数型相似。紧跟在前导比特之后是循环体成员component编码,component可以是构造也可以是一种整型参数。各成员编码后顺序放置,每两个成员之间编码值不需分隔符,该类型相应于C语言中数组。下面将以一种例子来阐明: MNC :=SEQUENCE (SIZE (2.3) OF DigitDigit :=INTEGER (0.9) 上面MNC移动网络码,在上面循环中咱们将分几步阐明:一方面拟定其循环次数,由SIZE (2.3)可知其循环次数为23次,普通咱们选取2次,则编码为0。第一次对Digit进行编码为:0010(取值为2)。第二次对Digit进行编码为:001
17、1 (取值为3)。综上,对该循环编码为: 0 0010 0011。四、PER编码实例分析下面我将以手机释放流程中RRC CONNECTION RELEASE消息为例讲述PER编译码过程: 手机释放合同流程分CC层释放、RRC释放等2个阶段。其详细合同流程如图1所示。UE通话过程DISCONNECTRELEASERELEASE COMPLETERRC CONNECTION RELEASERRC CONNECTION RELEASE COMPLETENETWORK图1手机释放合同流程上面合同流程是通话完毕后终结UE和网络连接过程,涉及两个某些,前一种某些是完毕呼喊终结过程,背面一某些是信令链路释放
18、过程,涉及释放UE和UTRAN之间所有无线承载和释放所有建立信令连接。这里我将在下行公共控制信道上消息RRC CONNECTION RELEASE 为例来阐明这条消息编码:DL-CCCH-Message := SEQUENCE integrityCheckInfoIntegrityCheckInfo OPTIONAL,messageDL-CCCH-MessageType 编码:0 。上面SEQUENCE构造有一种可选项,要编一种1bit位图,该项选取编码为1,否则为0。DL-CCCH-MessageType := CHOICE cellUpdateConfirmCellUpdateConfir
19、m-CCCH,rrcConnectionRejectRRCConnectionReject,rrcConnectionReleaseRRCConnectionRelease-CCCH,rrcConnectionSetupRRCConnectionSetup,uraUpdateConfirmURAUpdateConfirm-CCCH,spare3NULL,spare2NULL,spare1NULL 编码:010。CHOICE构造编码办法是:一方面对选取项索引值进行编码,然后对选取项进行编码,每次只能选取一项。这里010是对索引值编码,由于供选取项共有8项,23=8编3bit,而索引值是从0开始,
20、因此这里第三项编码值为2。RRCConnectionRelease-CCCH := CHOICE r3SEQUENCE rrcConnectionRelease-CCCH-r3 RRCConnectionRelease-CCCH-r3-IEs,rrcConnectionRelease-CCCH-r3-add-ext BITSTRING OPTIONAL ,later-than-r3SEQUENCE u-RNTIU-RNTI, rrc-TransactionIdentifier RRC-TransactionIdentifier, 编码为:0 0 。一方面上面是一种CHOICE构造,共有两项编1
21、bit,咱们选取第一项编码为0;r3为一种SEQUENCE 构造,有一种可选项,此处不选,编码为0。RRCConnectionRelease-CCCH-r3-Ies := SEQUENCE u-RNTIU-RNTI,rrcConnectionReleaseRRCConnectionRelease-r3-IEsU-RNTI :=SEQUENCE srnc-IdentitySRNC-Identity,s-RNTIS-RNTI SRNC-Identity :=BIT STRING (SIZE (12)S-RNTI :=BIT STRING (SIZE (20) 编码为0000 0000 0001 ;
22、 0000 0000 0000 0000 0001。RRCConnectionRelease-CCCH-r3-IEs为SEQUENCE构造,没有可选项,因而两项都要编码。第一项SRNC-Identity是定长比特串类型,编码时直接给出12bit长串。同理第二项为20bit长串。RRCConnectionRelease-r3-IEs := SEQUENCE rrc-TransactionIdentifierRRC-TransactionIdentifier,n-308N-308OPTIONAL,releaseCauseReleaseCause,rplmn-informationRplmn-Inf
23、ormation OPTIONAL 编码:10 。 RRCConnectionRelease-r3-IEs为一种SEQUENCE构造上面有2个可选项,位图长度为2bit,第一项编码,第二项不编码,因而位图为10。RRC-TransactionIdentifier :=INTEGER (0.3)N-308 :=INTEGER (1.8) 编码:00;001。整型RRC-TransactionIdentifier范畴为03。共4个取值,编码为2bit,这里取值0编码为00。同理整型N-308编码长度应为3bit,取值为2,编码为001(注意是对索引值编码)。ReleaseCause :=ENUME
24、RATED normalEvent,unspecified,pre-emptiveRelease,congestion,re-establishmentReject,directedsignallingconnectionre-establishment,userInactivity,spare 编码:000。ReleaseCause为枚举类型,枚举类型编码只是对选项索引值编码,释放过程属于正常事件,故选第一项,编码为000。由于上面编码是在空中(UU)接口上传播,为了尽量少传播比特,编码是采用是PER编码非对齐方式,在这种方式下,上面每一步生成编码依次叠加直到编码结束,然后以八个比特为单位构
25、成八位组,若不够则在编码末尾添零。上面编码后构成串为:0 010 00 00000001 10 00 001 000 提成八位组为:00100000 00000000 01000000 00000000 00000110 00001000正好构成六个八位组,因而不用添零。转换成十六进制编码为:20 00 40 00 06 08。五、PER手工编译码总结PER编码中,对齐方式编码,添加0前提是前面编码不能构成一种或者各种八位组,而背面编码长度是一种或各种八位组长度,在这种状况下需要添加0。否则,就在前面码背面继续叠加,最后再以八个位一组提成各种八位组。因而,编码过程中,每到下一种编码长度是一种或
26、各种八位组时,就得把前面码提成一种或各种字节,并也许会添加0,添0个数为0到7个。而非对齐方式则始终叠加到编码编完后,再提成各种八位组。在编码最后若剩余是0到7比特,这种状况下再添加0,因而非对齐方式最多添7个0,而对齐方式是每次最多添7个0,但次数不不大于或等于1次。例如:XX := SEQUENCE r-TransactionIdentifierR-TransactionIdentifier,releaseIdentifierReleaseIdentifier,rplmn-informationRplmn-Information RRC-TransactionIdentifier :=IN
27、TEGER (0.3)ReleaseIdentifier := INTEGER (0.255)Rplmn-Information := BIT STRING (SIZE (7)设RRC-TransactionIdentifier取值为2,则编码为11。 ReleaseIdentifier取值为80,则编码为0101 0000。Rplmn-Information取比特为“1011101”。在对齐方式下编码为:11 000000 01010000 1011101 0在非对齐方式下编码为:11 010100 0 0 101110 1 0000000PER译码过程与PER编码过程相反,与PER编码不同
28、是,在译码之前并不懂得程序树型构造,只有依照编码和3GPP文档在译码过程中才干将程序提取出来,若在此过程中出错普通不能立即检查出来,在后续译码中可以逐渐验证,因而译码过程也必要认真谨慎,否则会走诸多弯路。总之,通信合同PER编译码是以3GPP合同文档为基本,在掌握其编译码规则之后,还规定认真、细心编译合同,这样才可以对的完毕编译码。六、软件编译码 对于软件编码,还是以上面手机释放过程RRC CONNECTION RELEASE消息为例来阐明:软件编码原理与上面编码原理同样,但机器在编码之前必要懂得3GPP原则合同25.331程序构造,并且有相应参数赋值,这样机器才可以将参数赋在固定合同构造中并
29、编出唯一对的码,由于该流程中所有消息ASN描述都在文档25.331里面,因而咱们只需在将25.331整个文档当成原则ASN合同,然后给所要编码那条消息赋值后,控制软件输出相应消息编码即可。下面将分环节阐明软件编码过程:1. 给所要编码消息RRC CONNECTION RELEASE赋值,并将其加在将要运营ASN程序背面,在程序结束符END之前。下面是对RRC释放赋值(赋值每个参数就是上面手工编码时所选取参数):myRRCConnectionRelease DL-CCCH-Message := message rrcConnectionRelease :r3: rrcConnectionRele
30、ase-CCCH-r3 u-RNTI srnc-Identity 0000 0000 0001B, s-RNTI 0000 0000 0000 0000 0001B , rrcConnectionRelease-r3 rrc-TransactionIdentifier 0, n-308 2, releaseCause normalEvent 2. 打开OSS软件运营界面。 3. 按下 键,找到赋了值ASN文献,然后点Add键,将该文献添加到运营栏中。4. 按下键,在Output.c File中设立文献输出格式,由于该消息是在空中传送,为了尽量减少冗余比特,合同规定了选取PER非对齐编码方式。因
31、而选取UNALIGEND PER encode/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文献;enco
32、de.c文献; ASN文献和它在OSS软件中生成.c和.h文献。其中makefile文献规定了ASN编码整个过程中一系列规则,涉及需要用到哪些链接文献,存储于哪个文献夹中,运用了哪些隐含规则等等,encode.c文献则控制消息编码范畴。事实上咱们下载OSS软件中有阐明软件以及编译码实例,依照它所给文献修改其中一某些就可以在DOS界面下运营NMAKE命令实现软件编码。7输出编码成果DL-CCCH-Message SEQUENCE fieldcount (not encoded) = 1 message DL-CCCH-MessageType CHOICE index = 2 rrcConnect
33、ionRelease RRCConnectionRelease-CCCH CHOICE index = 0 r3 SEQUENCE fieldcount (not encoded) = 1 rrcConnectionRelease-CCCH-r3 RRCConnectionRelease-CCCH-r3-IEs SEQUENCE fieldcount (not encoded) = 2 u-RNTI U-RNTI SEQUENCE fieldcount (not encoded) = 2 srnc-Identity SRNC-Identity BIT STRING length (not en
34、coded) = 1.4 0x0010 s-RNTI S-RNTI BIT STRING length (not encoded) = 2.4 0x000010 rrcConnectionRelease RRCConnectionRelease-r3-IEs SEQUENCE fieldcount(not encoded) = 3 rrc-TransactionIdentifier RRC-TransactionIdentifier INTEGER length(not encoded) = 0.2 0 n-308 N-308 INTEGER length (not encoded) = 0.
35、3 2 releaseCause ReleaseCause ENUMERATED length (not encoded) = 0.3 0Total PDV length = 6.0this is the RRCConnectionRelease4000 0608将赋值构造参数和手工编码与上面软件编码成果对照可知,编码对的。七、软件编译码总结u 软件译码文献夹与编码文献夹文献大某些是相似,不作任何修改。但译码C文献是decode.c文献,该文献与编码时encode.c文献是有很大不同,这两个文献都可以由OSS ASN软件编译码实例C文献修改得来。译码时要注意所译码起始位置和译码消息所在合同单元,编码时也必要阐明要编消息所在合同单元。这样才干编译对的。u 每次修改ASN文献后,必要将该ASN文献在OSS ASN软件中重新生成.c和.h文献,并将该文献加到编译码文献夹中,这样才干进行下一次编译码。u 在每次运营NMAKE命令后,最佳运营一次NMAKE CLEAN命令,这样才干将运营过程中生成中间文献去除,而不影响下次重新编译。 总之,软件编译码过程调用OSS ASN软件许多内部文献,是以OSS ASN软件为基本。