ASN.1编解码:asn1c的版本分析

荣涛 2021年8月24日

前面两个文档,已经对 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

  1. 首先进入ASN.1代码所在的目录,我这里使用的是e2ap-v01.00.00.asn
[rongtao@localhost e2ap]$ ls
e2ap-v01.00.00.asn  e2ap-v01.01.asn1
  1. 编译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
  1. 编译生成的源文件
[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. 参考链接

  1. http://lionet.info/asn1c/basics.html
  2. http://lionet.info/asn1c/examples.html
  3. http://lionet.info/asn1c/download.html
  4. https://wiki.o-ran-sc.org/display/ORANSDK/ASN.1+Compiler
  5. https://gerrit.o-ran-sc.org/r/admin/repos/com/asn1c【该asn1c已经废弃,移步github】
  6. https://github.com/nokia/asn1c【这里】

ASN.1编解码:asn1c的版本分析-诺基亚相关推荐

  1. ASN.1编解码:asn1c、enber和unber

    ASN.1编解码:asn1c.enber和unber 荣涛 2021年8月24日 相关: ASN.1编解码:asn1c的版本分析-诺基亚 1. 编译安装 见之前的文档. 2. asn1c指令 asn1 ...

  2. ASN.1编解码:ORAN-E2AP分析

    ASN.1编解码:ORAN-E2AP分析 荣涛 2021年8月25日 rongtao@sylincom.com 前面的文档讲述了如何编译asn1c,如何选取合适的asn1c软件版本,及其简单使用方法. ...

  3. ASN.1编解码:asn1c的基本使用

    ASN.1编解码:asn1c的基本使用 荣涛 2021年8月23日 上篇主要讲了ASN.1编码<ASN.1编解码与编程> 本文主要介绍 ASN.1 编码的C语言实现,asn1c.ASN.1 ...

  4. ASN.1编解码:asn1c-ORAN-E2AP

    ASN.1编解码:asn1c-ORAN-E2AP 荣涛 2021年8月25日 前面的文档讲述了如何编译asn1c,如何选取合适的asn1c软件版本,及其简单使用方法.本文将对asn1c的详细使用进行介 ...

  5. 高效的5G ASN.1编解码工具

    它是一款具有编码和解码的工具,它是一款覆盖基站和终端多种接口消息的编码和解码工具,它还是一款编码和解码分析工具,通过它,你可以清晰的了解码流的每一位代表的含义. 操作效果 先看一下这个工具的操作,给大 ...

  6. ASN.1编解码:asn1c-ORAN-E2AP编解码示例

    ASN.1编解码:asn1c-ORAN-E2AP编解码示例 荣涛 2021年9月2日 整体代码:https://gitee.com/rtoax/test/tree/master/ASN.1/asn1c ...

  7. ASN.1编解码与编程

    ASN.1编解码与编程 荣涛 2021年8月23日 2386499836@qq.com 1. 概述 ASN.1 – Abstract Syntax Notation dot one,抽象记法1.数字1 ...

  8. 实验三 LZW编解码算法实现与分析

    LZW简述 本部分参考wiki https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch LZW压缩算法在1978年提出,由 Abr ...

  9. java asn.1_ASN1编解码实现方法 | 学步园

    第1章概述 1.1背景 系统与充值平台的接口是文件的方式,充值平台将文件内容以ASN.1方式进行编码,系统需要根据ASN.1协议进行解码. 关于ASN.1开发的资料,网上资料非常少,特别是涉及到具体的 ...

最新文章

  1. Django 操作Mysql数据库 对表进行增删改查
  2. 一个帮助Java开发者快速学会Kotlin的开源项目
  3. 7-18 银行业务队列简单模拟 (25 分)
  4. 最近的状态很不好,需要调整
  5. curl模拟delete/put/post/get请求
  6. Java中的字符串常量池详细介绍
  7. 收集sqlite常见问题
  8. vue-element-admin中 vuex 的使用
  9. 第一季2:视频设备开发的技术流
  10. 运算放大器基本公式_还在被三阶/四阶/运算放大器滤波器PLL这些概念困扰?这篇文章帮你搞懂它...
  11. Forefront TMG 2010 篇(二)--安装
  12. 四轮驱动机器人(SSMR)的运动规律
  13. 【模板】左偏树(可并堆)
  14. Java ByteCode
  15. Linux性能优化(九)——Kernel Bypass
  16. NorFlash和NandFlash区别
  17. matlab解决最短路径问题
  18. google autoaugment
  19. 如何将图片转换base64格式?data:image/png;base64又是什么?
  20. 为什么硬盘总坏?为什么就冠希兄的修好了?

热门文章

  1. springboot整合Mybatis例子
  2. idea-导入其他项目模块的包爆红
  3. Javascript的两种“单引号”
  4. 【Codeforces 63C】Bulls and Cows
  5. C语言实现Winsocket网络传输数据时乱码问题
  6. Mybatis中的延迟加载的使用方法
  7. H5前端性能测试总结
  8. Android QA
  9. 修改oracle内存大小
  10. 列出所有子集----------2013年1月3日