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消息为例来说明一下编解码的过程。
1. 下载RRC协议标文档。RRC协议版本在不停的演进之中,手机和基站产品一般会说明更新到了哪个版本,因此需要从本文开头提到的网站去下载对应版本的的WORD文件,然后另存成文本格式的文件。
2. 从文本格式的RRC文档中提取 ASN.1协议文本,即提取“-ASN1START”和“--ASN1STOP”标记之间的文本,然后保存成一个新文件,比如文件名是38331f21.asn。
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消息,
#解码
>>>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对应的结构体如下表。