官方淘宝店 易迪拓培训 旧站入口
首页 > 无线通信 > 通信技术学习讨论 > 使用lameditor和asn1c开源工具解析北京LTE现网 RRC SIB ASN1消

使用lameditor和asn1c开源工具解析北京LTE现网 RRC SIB ASN1消

01-03
我的博客被新浪粗暴关闭了,所有博文已经迁移至:http://sdr-x.github.io/
原始链接: http://sdr-x.github.io/LTE-SIB-decoding-by-asn1c/
(关于一些基本的软件无线电概念,Linux操作,代码库git操作,以及软件包安装(apt-get)等,参见:http://t.cn/R7Q4jEu  )
主要参考了这篇blog:
http://blog.csdn.net/peng_yw/article/details/22437251
本工作是这个LTE小区搜索项目的一部分: https://github.com/JiaoXianjun/LTE-Cell-Scanner
解析RRC SIB ASN1消息的程序已经封装为一个matlab函数parse_SIB(),并用在这个Matlab/LTE_DL_receiver.m 脚本中,用来将PDSCH信道解调出来的SIB原始比特正确解析为SIB消息。成功解析的北京4G现网的三个SIB消息,见三个附件。
具体方法:
1. 根据LTE RRC 的spec生成ASN1描述文档
从这里:
http://www.3gpp.org/ftp/Specs/archive/36_series/36.331/
下载36.331协议文档。
把36331-ac0.zip解压缩,得到36331-ac0.doc
把36331-ac0.doc另存为36331-ac0.txt.
从这里
http://sourceforge.net/projects/lameditor/
下载lameditor工具,并编译安装好。
然后执行:
cd lameditor-1.0/src/getasn/
把36331-ac0.txt拷贝到上述目录,然后运行:
./getasn 36331-ac0.txt
至此,得到LTE协议的ASN1描述文件36331-ac0.asn
2. 为LTE协议解析生成ASN1解码器
从这里:
https://github.com/vlm/asn1c
获取asn1c工具,并编译安装。
然后执行:
    cd asn1c/examples/
    mkdir sample.source.LTERRC
    cd sample.source.LTERRC
把第一步里得到的36331-ac0.asn拷贝到目录sample.source.LTERRC,然后执行:
asn1c  -S /usr/local/share/asn1c -fcompound-names -fskeletons-copy -gen-PER -pdu=auto 36331-ac0.asn
得到编译工具所需的源文件。在正式编译我们所需的工具之前,需要对源文件做如下修改:
文件converter-sample.c:
在#include <asn_internal.h>后面,加入:
#define PDU BCCH_DL_SCH_Message
#define ASN_PDU_COLLECTION
文件per_opentype.c:
在ASN_DEBUG("Too large padding %d in open type", (int)padding);后面,加入:
padding = padding % 8;
并且注释掉:_ASN_DECODE_FAILED;
现在编译解码工具,执行:
make -f Makefile.am.sample
得到解码工具progname
3. 解码工具的使用。
执行:
./progname recv_bits.per -p BCCH-DL-SCH-Message
recv_bit.per即收到的PDSCH上的SIB的原始bit存成的二进制文件。-p用来指定消息类型,PDSCH上的SIB的消息类型为:BCCH-DL-SCH-Message
运行命令之后,会打印出解析出来的SIB消息各个字段的名称、内容。

 f2360_s19.2_bw20_1s_hackrf_SIB.txt

 f2585_s19.2_bw20_1s_hackrf_1_SIB.txt

 f2585_s19.2_bw20_1s_hackrf_SIB.txt

附件是用asn1c解碼的嗎?
爲什麼我用這個progname解碼總是提示
Decode failed past byte 7: Input processing error

原帖里是解码后得到的信息。
解码前的二进制文件见附件(从代码库上挑选了几个),你可以用于测试你的程序。
这些文件都在代码库的regression_test_signal_file目录下,由parse_SIB函数生成并使用。
parse_SIB由LTE_DL_receiver.m调用。

附件里有如下显示:
decoded by: http:/
/www.marben-products.com/asn.1/services/decoder-asn1-lte.html
or
decoded by: /asn1_test/LTE-BCCH-DL-SCH-decode/progname
用marben网页上解码显示确实和附件相同,但编译出的progname运行解码始终有问题。
原始参考链接上的评论中也有和我类似的问题,感觉是对齐的问题,还是有参数没有设置对。但是你这确实解决了。是否和我用的是64位cpu有关?

你解的我给的哪个per文件?我来试验一下。

7051800111271486C0182359C242041127D9

你这个看起来像文本,我给的那几个per是二进制格式的。那个程序的输入文件应该是二进制格式的,所以文本不行。我用的命令如下:
progname a.per -p BCCH-DL-SCH-Message
a.per是二进制格式的输入文件

多谢,转成二进制文件就解析出来了。

我的博客被新浪粗暴关闭了,所有博文已经迁移至:http://sdr-x.github.io/

Top