5G NR的RRC ASN.1协议
eefocus 2023-06-27

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 = {
&39;\x01',6),
&39;:&39;,
&39;:10,
&39;pos2',
&39;:100,
&39;notBarred',
&39;allowed',
&39;,1)
}

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

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

>>>import ans1tools,json


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

>>>class MyEncoder(json.JSONEncoder):

def default(self, obj):

if isinstance(obj, bytes):

return str(obj, encoding=&39;);

return json.JSONEncoder.default(self, obj)


#构造MIB消息

>>>MIB = {
&39;\x01',6),
&39;:&39;,
&39;:10,
&39;pos2',
&39;:100,
&39;notBarred',
&39;allowed',
&39;,1)
}

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

>>>foo = asn1tools.compile_files(&39;, &39;)


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

>>>encoded = foo.encode(&39;,MIB)

>>>print(encoded.hex())


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

014648


#读者可以对比MIB消息,

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


#解码

>>>decoded=foo.decode(&39;,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对应的结构体如下表。

LYIF%Z%8DWUV3DFX7KUEES1

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • RF
  • 射频
  • 通信
  • 无线
下载排行榜
更多
评测报告
更多
广告