漫谈5G RRC协议的ASN.1编解码

标签:5GRRC协议
分享到:

7C8N(BZ5FY[I4~]LPSJ@`3C

 

5G NR的RRC协议定义在TS38.331, 下载地址是https://www.3gpp.org/ftp/Specs/archive/38_series。RRC协议主要用于发送系统广播消息,UE和基站之间交换连接控制消息,测量配置和上报,RRC的功能的详细描述见TS-38.331的第4.4章节。

 

移动通信领域的某些从业人员会对RRC协议感兴趣,比如正在从事无线网络优化、软件开发、系统设计和标准制定等工作。通常为了学习RRC协议都要先去了解一下ASN.1协议,一般推荐阅读《ASN.1 Complete》这本书和 X.691 《ASN.1 encoding rules: Specification of Packed Encoding Rules (PER)》。因为空口资源比较紧张,RRC消息采用PER编码,不需要按照8比特做对齐 ,最大限度的减少了空口传输的数据量。

 

ASN.1协议还支持BER和XER等对齐方式。使用ASN.1协议定义网元之间的接口有一些好处,比如1)编码方式紧凑,2)不需要定义私有协议,3)不需要开发编码器和解码器。有些软件厂家提供ASN.1的定制软件,还有一些网站提供在线RRC解码, 比如https://www.marben-products.com/decoder-asn1-lte/。相信有些对协议感兴趣的朋友还花了不少时间去研究编译原理,尝试自己制作一个RRC的编解码软件。

 

免费的ASN.1解码软件比较好的是ASN1C(C语言编译环境)和asn1tools(Python第三方软件模块)。网友“一张洪枫叶”在他的博客里做了很好的介绍, 见链接https://www.cnblogs.com/zhanghongfeng/p/9234663.html。

 

下面以5G 的MIB消息为例来说明一下编解码的过程。

PKQ42O1L_NBF(J[V(%UYU{U

1. 下载RRC协议标文档。RRC协议版本在不停的演进之中,手机和基站产品一般会说明更新到了哪个版本,因此需要从本文开头提到的网站去下载对应版本的的WORD文件,然后另存成文本格式的文件。

2. 从文本格式的RRC文档中提取 ASN.1协议文本,即提取“-ASN1START”和“--ASN1STOP”标记之间的文本,然后保存成一个新文件,比如文件名是38331f21.asn。

TG8$28VT%`LLK4JA((E[VQR

3. 准备python环境。包括安装python软件,使用pip安装asn1tools模块和json模块。

    - pip install ans1tools

    - pip install json

 

4. 编辑MIB消息,产生一个python程序可识别的的字典格式的数据结构。

MIB = {
    'systemFrameNumber':(b'\x01',6),
    'subCarrierSpacingCommon':'scs15or60',
    'ssb-SubcarrierOffset':10,
    'dmrs-TypeA-Position':'pos2',
    'pdcch-ConfigSIB1':100,
    'cellBarred':'notBarred',
    'intraFreqReselection':'allowed',
    'spare':(b'\x00',1)
}

5. 使用python编解码MIB消息,演示代码如下。

#导入需要的第三方软件模块

>>>import ans1tools,json

 

#把二进制比特变成可识别的字符

>>>class MyEncoder(json.JSONEncoder):

    def default(self, obj):

        if isinstance(obj, bytes):

            return str(obj, encoding='utf-8');

        return json.JSONEncoder.default(self, obj)

 

#构造MIB消息

>>>MIB = {
    'systemFrameNumber':(b'\x01',6),
    'subCarrierSpacingCommon':'scs15or60',
    'ssb-SubcarrierOffset':10,
    'dmrs-TypeA-Position':'pos2',
    'pdcch-ConfigSIB1':100,
    'cellBarred':'notBarred',
    'intraFreqReselection':'allowed',
    'spare':(b'\x00',1)
}

# 编译RRC协议,用于后面的编解码

>>>foo = asn1tools.compile_files('38331f21.asn', 'uper')


# 对MIB文本编码,转成二进制数据

>>>encoded = foo.encode('MIB',MIB)

>>>print(encoded.hex())

 

#编码结果,以16进制显示,二进制值是‘00000001 01000110 01001000’

014648

 

#读者可以对比MIB消息,

}N9H7`YEAM{}[9095Q6)6H3

 

#解码

>>>decoded=foo.decode('MIB',encoded)

>>>value=json.dumps(decoded,indent=1,cls=MyEncoder,ensure_ascii=False)

>>> print (value)

#解码结果如下

{
 "systemFrameNumber": [
  "\u0000",
  6
 ],
 "subCarrierSpacingCommon": "scs15or60",
 "ssb-SubcarrierOffset": 10,
 "dmrs-TypeA-Position": "pos2",
 "pdcch-ConfigSIB1": 100,
 "cellBarred": "notBarred",
 "intraFreqReselection": "allowed",
 "spare": [
  "\u0000",
  1
 ]
}

 

TS-38331协议的Release-16最新版本是g10, 但是第三方软件asn1tools还不支持这个版本,所以采用了f21版本举例。不久之后应该就可以支持了。

 

3GPP中有大量的数据结构,例如sequence, bit string, octerstring, bool, sequence of等等,这些结构体在python对应的结构体如下表。

I8G8D2TDUZ63G0E(<a href=@0C7K_S" src="https://upload.semidata.info/sns.eefocus.com/rf/article/media/2020/11/18/350399.png" />

N<a href=@R1NMSZ8TRJO20HX[S))E7" src="https://upload.semidata.info/sns.eefocus.com/rf/article/media/2020/11/18/350400.png" />

 

LYIF%Z%8DWUV3DFX7KUEES1

 

继续阅读
5G如何提升上行能力?

5G上下行能力差异明显。5G上行能力薄弱,行业急盼上行千兆能力。

三大运营商当前5G用户数最新情况!

三大运营商近日公布截至10月份的用户数情况,我们进行了汇总

5G基站成了“电老虎”,如何降低成本?

前一段时间,关于洛阳联通在夜间部分时段休眠关闭部分5G基站的消息引发了普遍关注。有媒体探究背后的原因发现主要是由于5G基站的耗电量太大,让运营商难以承受高昂的电费,因此在没有5G用户连接或连接数低于某个阈值就休眠关闭5G基站,由4G+基站提供数据服务。

中兴5G最新创新技术与成果

截止2020年第三季度,我国三大运营商已建成5G基站69万个,已基本全面开通5G SA网络,5G商用步伐全球领先。

罗德与施瓦茨率先将1 GHz分析带宽引入中端信号和频谱分析仪,成为5G NR的理想选择

想分析 5G NR 和其他未来无线标准宽带信号,高分析带宽至关重要。为了能以有限的预算满足这种测试需求,罗德与施瓦茨公司(Rohde & Schwarz)为中端信号和频谱分析仪 R&S FSVA3000 新增优异的 1 GHz 内部分析带宽。