ASN.1解码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASN.1解码相关的知识,希望对你有一定的参考价值。
要处一些文件,是ASN.1(BER)的,里面全是16进制数,现在基本弄清他的格式,可是,不知怎么去解码,
参考技术A 首先你要搞到描述这些十六进制流的asn1描述文件,然后去www.asnlab.cn上申请一个试用license,下载他们的asn.1代码生成工具和编解码库,然后入在自己的编译器上编译这些生成的代码和库,编译出来的东西就能针对你的这个文件进行解码了。试用版的license只能使用45天 参考技术B 主要运用于通信行业,通信数据结构的编解码规则很多是用到了ASN.1的编解码规则, 参考技术C ASN.1:高级数据描述语言,描述数据类型、结构、组织及编码方法。包含语法符号和编码规则两大部分。SNMP使用ASN.1描述协议数据单元(PDU)和管理对象信息库(MIB);
BER:
是ASN.1中的基本编码规则。描述具体的ASN.1对象如何编码成比特流在网络上进行传输。SNMP使用BER作为编码方案,数据首先经过BER编码,再经由传输层协议(一般是UDP)发送往接收方。接收方在SNMP端口收到PDU后,经过BER解码后,得到具体的SNMP操作数据。
SMI
是SNMP的描述方法。ASN.1功能很强大,但SNMP只用到其中一小部分,为了方便使用,对这部分内容做了描述,限定了范围,这就是SMI。SMI由ASN.1的一个子集合和一部分自定义的类型、宏等组成。SMI是ASN.1的一个子集和超集。
MIB:
使用SMI中定义的类型和ASN.1中的基本类型进行对象描述,是一个使用SMI描述的管理信息库。每一类关心的事件都有一组MIB,比如网络接口有一棵MIB树,TCP有一棵MIB树,UDP也有一棵状态树。定义了数据格式、类型、顺序、意义等;
PDU
是网络中传送的数据包,SNMP的协议数据单元。每一种SNMP操作物理上都对应一个PDU。PDU是基本的通信格式,使用ASN.1描述,使用BER编码,通过传书层协议传送;
ASN.1编解码:asn1c的版本分析-诺基亚
前面两个文档,已经对 ASN.1 编码和 asn1c 的使用做出了详细说明,那么如何将
ASN.1编解码与编程
ASN.1编解码:asn1c的基本使用
1. 几个ASN.1版本
1.1. 官网:asn1c-0.9.28
网址:http://lionet.info/asn1c/download.html
下载:http://lionet.info/soft/asn1c-0.9.28.tar.gz
从官网下载的 asn1c-0.9.28.tar.gz经过测试,会爆出一些错误。
1.2. Nokia
Nokia在github上的开源分支比较多
展开上面的图片,展开分支:
可见,默认分支即为 s1ap。
1.2.1. asn1c-s1ap分支
在安装了这个软件后,查看版本,实际上,asn1c-s1ap分支是在v0.9.29
修改的。
[rongtao@localhost asn1c-s1ap]$ asn1c -v
ASN.1 Compiler, v0.9.29
Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info> and contributors.
s1ap分支最近提交在两年前,看下ORAN的文档。
目前使用该项目对 E2AP 编译不通过,会产生很多 Fatal。
O-RAN Working Group 3, Near-Real-time RAN Intelligent Controller, E2 Application Protocol (E2AP)
用周星驰电影《九品芝麻官》的话说,“用明朝的剑,斩清朝的官?”。所以,我个人感觉用nokia的asn1c-s1ap编译不了。起始,纵观E2Ap文档,用asn1c-s1ap分支都存在“用明朝的剑,斩清朝的官?”的问题。
目前,有两个 E2AP版本,
e2ap-v01.00.00.asn
:E2 Termination中提供;e2ap-v01.01.asn1
:我从 O-Ran 文档中提取出的 ASN.1;
2. E2AP ASN.1 代码
在 asn1c-s1ap 存在 E2AP ASN.1 代码
3. 测试各个版本
3.1. asn1c-0.9.28
暂时先不考虑这个版本。我在测试过程,发现,用asn1c-0.9.28
解析e2ap-v01.00.00.asn
或者 e2ap-v01.01.asn1
会提示语法错误。
[rongtao@localhost e2ap]$ asn1c -fcompound-names -fincludes-quoted -findirect-choice -gen-PER e2ap-v01.01.asn1
产生的错误信息为:
ASN.1 grammar parse error near line 433 (token "id-RICrequestID"): syntax error, unexpected TOK_identifier, expecting '}'Cannot parse "e2ap-v01.01.asn1"
显然发生了syntax error
,所以,诺基亚定的 ASN.1 E2AP标准,还是用诺基亚的asn1c-s1ap
吧。
TODO
:如果考虑到其他行业,我觉得不应该使用诺基亚的asn1c-s1ap
,因为会把路越走越窄,最终诺基亚有绝对的主导权。除非通读诺基亚的代码,但是带来的开发周期也是相当长的。
3.2. asn1c-s1ap
asn1c-s1ap分支是在v0.9.29
修改的。
3.2.1. 编译软件
按照下面的四个步骤执行就行了
[rongtao@localhost asn1c-s1ap]$ test -f configure || autoreconf -iv
[rongtao@localhost asn1c-s1ap]$ ./configure
[rongtao@localhost asn1c-s1ap]$ make
[rongtao@localhost asn1c-s1ap]$ sudo make install
3.2.2. 编译e2ap-v01.00.00.asn
- 首先进入ASN.1代码所在的目录,我这里使用的是
e2ap-v01.00.00.asn
:
[rongtao@localhost e2ap]$ ls
e2ap-v01.00.00.asn e2ap-v01.01.asn1
- 编译
e2ap-v01.00.00.asn
[rongtao@localhost e2ap]$ asn1c -fcompound-names -fincludes-quoted -fno-include-deps -findirect-choice -gen-PER -D. e2ap-v01.00.00.asn
此过程会拷贝生成大量的源文件和头文件,部分打印如下:
Compiled ./E2AP-PDU.c
Compiled ./E2AP-PDU.h
Compiled ./InitiatingMessage.c
Compiled ./InitiatingMessage.h
Compiled ./SuccessfulOutcome.c
Compiled ./SuccessfulOutcome.h
Compiled ./UnsuccessfulOutcome.c
Compiled ./UnsuccessfulOutcome.h
Compiled ./RICsubscriptionRequest.c
[...]
Copied /usr/local/share/asn1c/oer_support.c -> ./oer_support.c
Copied /usr/local/share/asn1c/OPEN_TYPE_oer.c -> ./OPEN_TYPE_oer.c
Copied /usr/local/share/asn1c/INTEGER_oer.c -> ./INTEGER_oer.c
Copied /usr/local/share/asn1c/BIT_STRING_oer.c -> ./BIT_STRING_oer.c
Copied /usr/local/share/asn1c/OCTET_STRING_oer.c -> ./OCTET_STRING_oer.c
Copied /usr/local/share/asn1c/NativeInteger_oer.c -> ./NativeInteger_oer.c
Copied /usr/local/share/asn1c/NativeEnumerated_oer.c -> ./NativeEnumerated_oer.c
Copied /usr/local/share/asn1c/constr_CHOICE_oer.c -> ./constr_CHOICE_oer.c
Copied /usr/local/share/asn1c/constr_SEQUENCE_oer.c -> ./constr_SEQUENCE_oer.c
Copied /usr/local/share/asn1c/constr_SET_OF_oer.c -> ./constr_SET_OF_oer.c
Generated ./Makefile.am.libasncodec
Copied /usr/local/share/asn1c/converter-example.c -> ./converter-example.c implicit
Generated pdu_collection.c
Generated ./converter-example.mk
Copied /usr/local/share/asn1c/converter-example.c -> ./converter-example.c implicit
Generated pdu_collection.c
Generated ./Makefile.am.asn1convert
Generated asn_constant.h
- 编译生成的源文件
[rongtao@localhost e2ap]$ gcc *.c -I. -DPDU
/tmp/cc1CLYT3.o:在函数‘main’中:
converter-example.c:(.text+0x2da):对‘asn_DEF_1’未定义的引用
converter-example.c:(.text+0x2e2):对‘asn_DEF_1’未定义的引用
collect2: 错误:ld 返回 1
在编译过程中会生成一个测试例文件converter-example.c
,这个文件中有些东西没有定义,为了测试,我们简单重写converter-example.c
[rongtao@localhost e2ap]$ echo "int main(){}" > converter-example.c
[rongtao@localhost e2ap]$ gcc *.c -I. -DPDU
[rongtao@localhost e2ap]$ ./a.out
时间上,我对
e2ap-v01.01.asn1
也进行了上面的测试过程,也是没有问题的。
4. 参考链接
以上是关于ASN.1解码的主要内容,如果未能解决你的问题,请参考以下文章