srsLTE在4G时代以其稳定、便捷部署、兼容usrp等特征,在SDR中评价优秀,尤其是其LTE UE基本是当时唯一能稳定长时间运行的软UE。
现在srsLTE已经更名为srsRAN,截止目前2022.3.18 (2023.2)srsRAN已经支持5G NSA gNB、5G NSA UE、sidelink、LTE eNB、LTE UE、5G SA gNB、5G SA UE。由于我对srs的印象极佳,最近也对比了一下srsRAN、OpenAir*********、Seg****,的代码,简单记一下部署srsRAN的过程。(十分顺利,没有OpenAir******那么多需要注意的)
2023.3更新:注意,srsRAN.git的代码最近完成了整理,已分成了https://github.com/srsran/srsRAN_Project.git
和
https://github.com/srsran/srsRAN_4G.git
两个项目以分别进行维护5G和4G功能(之前都在一起,代码结构确实比较乱)。下面的地址记得相应修改。回头我重写一遍博客。
就是以前的srsLTE啦,因为提供了package安装,安装命令精简为:
sudo add-apt-repository ppa:softwareradiosystems/srsran
sudo apt-get update
sudo apt-get install srsran -y
详见srs官网 https://www.srs.io/
Ubuntu1804:
sudo apt-get install build-essential cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libconfig++-dev libsctp-dev
Fedora:
dnf install cmake fftw3-devel mbedtls-devel lksctp-tools-devel libconfig-devel boost-devel
CentOS:
dnf install cmake fftw3-devel mbedtls-devel lksctp-tools-devel libconfig boost-devel
用于显示星座图等
sudo apt-get install libboost-system-dev libboost-test-dev libboost-thread-dev libqwt-qt5-dev qtbase5-dev
git clone https://github.com/srsLTE/srsGUI.git
cd srsgui
mkdir build
cd build
cmake ../
make
可用make test测试是否安装成功
启用的话在srs的配置文件中,[gui]的enable即可true
比较基本,我就假设各位都装好了并且测试可用
UHD(推荐用3.15,跟OAI通用)https://github.com/EttusResearch/uhd
SoapySDR https://github.com/pothosware/SoapySDR
BladeRF https://github.com/Nuand/bladeRF
ZeroMQ替代射频仿真,类似于OAI的rfsimulator的拓扑,需要单独定义信道环境,区别于L2sim,详见第4章
https://github.com/zeromq
2023.3:注意,srsRAN.git的代码最近完成了整理,已分成了https://github.com/srsran/srsRAN_Project.git
和
https://github.com/srsran/srsRAN_4G.git
两个项目以分别进行维护5G和4G功能(之前都在一起,代码结构确实比较乱)。下面的地址记得相应修改。回头我重写一遍博客。
下载源码编译:
git clone https://github.com/srsRAN/srsRAN.git
cd srsRAN
mkdir build
cd build
cmake ../
make
make test
安装(推荐,方便)
sudo make install
srsran_install_configs.sh user
默认配置文件位置在~/.config/srsran
srsRAN目前集成了LTE和NR的协议栈。
srsepc: 简单的LTE 核心网
srsenb:通过enb.conf
rr.conf
等配置文件来控制运行LTE还是NR(集成)。
srsgnb:O-RAN 7.2x架构的NR基站,CU DU分离。
srsue:UE。
依然是愉快的
#指定配置文件
sudo srsenb ~/.config/srsran/enb.conf
#不指定,用默认配置
sudo srsenb
和
#指定配置文件
sudo srsue ~/.config/srsran/ue.conf
sudo srsue #默认配置
在./srsRAN/build/lib/examples
里可以找到配置文件示例,此外还有些很方便的SIB的配置(比如我做授时需要配置SIB9)sib.conf
、空口资源配置(比如可以引入额外的AI算法)rr.conf
、DRB承载的配置 drb.conf
。至于连接核心网的一些配置、UE的SIM的配置、核心网的配置等,可以看我之前的博客。
for f in /sys/devices/system/cpu/cpu[0-9]*/cpufreq/scaling_governor ; do
echo performance > $f
done
目前支持模式tm=2、3、4 (参TS38.213),在配置文件中:
[enb]
...
tm = 3 #传输模式
nof_ports = 2 #天线端口数
基站在tm=3和4时候配置UE上报Rank Indicator的周期可以在rr.conf
的m_ri
处配置,整数,是CQI报告周期的倍数。
ZMQ配置见第4章
enb.conf
中,配置[rf]中的device_name和device_args,如device_name = zmq
device_args = fail_on_disconnect=true,tx_port0=tcp://*:2000,rx_port0=tcp://localhost:2001,tx_port1=tcp://*:2100,rx_port1=tcp://localhost:2101,id=enb,base_srate=23.04e6
再配置RRC, rr.conf
的末尾添加一个NR小区(不需要LTE的话记得注释掉LTE的cell_list
)
nr_cell_list =
(
{
rf_port = 1;
cell_id = 0x02;
tac = 0x0007;
pci = 500;
root_seq_idx = 204;
// TDD:
//dl_arfcn = 634240;
//band = 78;
// FDD:
dl_arfcn = 368500;
band = 3;
}
);
运行BS
跟之前一样sudo srsue或者指定上配置文件,会根据配置文件启动BS。可以同时启动eNB和gNB。
log里cc_idx 0 是LTE cell,1是NR cell。
修改UE的配置文件
[rf]里修改device_name和device_args,如
device_name = zmq
device_args = tx_port0=tcp://*:2001,rx_port0=tcp://localhost:2000,tx_port1=tcp://*:2101,rx_port1=tcp://localhost:2100,id=ue,base_srate=23.04e6
添加网络
[gw]
netns = ue1
配置搜索的频段、载波数,TDD FDD都支持
[rat.nr]
bands = 3,78
nof_carriers = 1
声明标准支持(默认是声明支持R8,NSA至少R15)
[rrc]
release = 15
运行UE
跟之前一样。log中出现RRC NR reconfiguration successful
表示成功连上NSA。
测试
ping或者iperf,随意。
上行注意需要指定接口ue1(按前几步[gw]中配置):
sudo ip netns exec ue1 iperf3 -c 172.16.0.1 -b 10M -i 1 -t 60
同样,按t可以trace,打log的速度可以在配置文件metrics_period_secs
处修改。
配置文件修改类似3.3.1节,如
[rf]
device_args=type=x300,clock=external,sampling_rate=11.52e6,lo_freq_offset_hz=11.52e6
nr_cell_list =
(
{
rf_port = 1;
cell_id = 0x02;
tac = 0x0007;
pci = 500;
root_seq_idx = 204;
// TDD:
//dl_arfcn = 634240;
//band = 78;
// FDD:
dl_arfcn = 368500;
band = 3;
}
);
ue.conf
中添加ZMQ配置
[rf]
freq_offset = 0
tx_gain = 80
srate = 11.52e6
device_name = zmq
device_args = tx_port=tcp://*:2001,rx_port=tcp://localhost:2000,id=ue,base_srate=11.52e6
添加网络
[gw]
netns = ue1
关闭LTE的频段
[rat.eutra]
dl_earfcn = 2850
nof_carriers = 0
开启NR的频段
[rat.nr]
bands = 3,78
nof_carriers = 1
声明标准支持(SA至少R15)
[rrc]
release = 15
启用APN
[nas]
apn = srsapn
apn_protocol = ipv4
剩下的USIM那些跟之前的配置方法一样。
enb.conf
中MME的地址处写AMF的地址
[enb]
enb_id = 0x19B
mcc = 901
mnc = 70
mme_addr = 192.168.8.10 #OpenXG核心网物理机地址,记得添加到docker的路由
gtp_bind_addr = 127.0.1.1 #Local Address
s1c_bind_addr = 127.0.1.1
s1c_bind_port = 0
n_prb = 50
配置BS这里的ZMQ,可以修改端口但注意匹配
[rf]
rx_gain = 40
tx_gain = 80
# Example for ZMQ-based operation with TCP transport for I/Q samples
device_name = zmq
device_args = fail_on_disconnect=true,tx_port=tcp://*:2000,rx_port=tcp://localhost:2001,id=enb,base_srate=11.52e6
在rr.conf
中移除LTE的cell_list
并添加NR_cell_list
(不移除LTE小区的话会是NSA模式)
nr_cell_list =
(
{
rf_port = 0;
cell_id = 1;
root_seq_idx = 1;
tac = 7;
pci = 500;
dl_arfcn = 368500;
coreset0_idx = 6;
band = 3;
}
);
目前有点淦的是srsRAN只支持15KHz SCS,等更新吧。
目前OnePlus 5G Nord可以接入,问题不少有兴趣可参这里。
srsRAN没有自己的rfsim,用的ZMQ做转发假装是经过了一个信道,目前只支持单UE单BS。
!注意4.1这一步对应2.3节,是应该在编译srsRAN之前就安装的,如果已经编译了srsRAN需要在装完ZMQ之后重新make一下srsRAN
sudo apt-get install libzmq3-dev
或者用源码编译:
git clone https://github.com/zeromq/libzmq.git
cd libzmq
./autogen.sh
./configure
make
sudo make install
sudo ldconfig
git clone https://github.com/zeromq/czmq.git
cd czmq
./autogen.sh
./configure
make
sudo make install
sudo ldconfig
git clone https://github.com/srsRAN/srsRAN.git
cd srsRAN
mkdir build
cd build
cmake ../
make
注意要有以下log才是正确安装了ZMQ并且被srsRAN识别到了
...
-- FINDING ZEROMQ.
-- Checking for module 'ZeroMQ'
-- No package 'ZeroMQ' found
-- Found libZEROMQ: /usr/local/include, /usr/local/lib/libzmq.so
...
sudo ip netns add ue1
sudo ip netns list
sudo ./srsepc/src/srsepc
OAI的epc:https://blog.csdn.net/BUPTOctopus/article/details/81560514
OAI的5GC:见3.3.1
./srsenb/src/srsenb --rf.device_name=zmq --rf.device_args="fail_on_disconnect=true,tx_port=tcp://*:2000,rx_port=tcp://localhost:2001,id=enb,base_srate=23.04e6"
sudo ./srsue/src/srsue --rf.device_name=zmq --rf.device_args="tx_port=tcp://*:2001,rx_port=tcp://localhost:2000,id=ue,base_srate=23.04e6" --gw.netns=ue1
sudo ip netns exec ue1 ping 172.16.0.1
关闭时候要先关UE再关BS最后记得sudo ip netns delete ue1
,不然会出bug。
in fact nothing special……
一些其他的工具:
①ubuntu下的读卡器工具 https://pcsclite.apdu.fr/
②win下的读卡器工具(我之前博客发过)
③libdw-dev和libdw:使用backward-cpp进行实际信息的回溯
一些srsRAN的用例:
①树莓派4用例
②载波聚合
③eMBMS
④NB-IoT
⑤C-V2X