构建指南:OAI RAN

本篇介绍如何从OAI的基站部分代码构建OAI的gNB应用。本篇写于2024年8月,若后续流程有更新,请以官方代码仓库下中的doc文件夹下的教程为主。

gNB 前置依赖

从源码构建UHD驱动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo apt update
# https://files.ettus.com/manual/page_build_guide.html
sudo apt install -y autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool g++ git inetutils-tools libboost-all-dev libncurses5 libncurses5-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev python3-dev python3-mako python3-numpy python3-requests python3-scipy python3-setuptools python3-ruamel.yaml

git clone https://github.com/EttusResearch/uhd.git ~/uhd
cd ~/uhd
git checkout v4.6.0.0
cd host
mkdir build
cd build
cmake ../
make -j $(nproc)
make test # This step is optional
sudo make install
sudo ldconfig
sudo uhd_images_downloader

构建 OAI gNB

注意,很多指令需要以sudo权限运行。

1
2
3
4
5
6
7
8
9
10
11
12
# Get openairinterface5g source code
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g
cd ~/openairinterface5g
git checkout develop

# Install OAI dependencies
cd ~/openairinterface5g/cmake_targets
sudo ./build_oai -I

# Build OAI gNB
cd ~/openairinterface5g/cmake_targets
sudo ./build_oai -w USRP --ninja --gNB -C

值得注意的是,在最后一部分构建OAI gNB时,最后的-C选项为首次编译时使用。如果之前已有过成功的编译,那么在下一次的编译时可以去掉-C以提高编译速度,具体原因请参考“其他构建选项”部分内容。如果你还需要再构建nrUE,那么修改上述命令的最后一行为:

1
sudo ./build_oai -w USRP --ninja --gNB --nrUE

常见问题

  1. 无法克隆代码:有两种可能,其一是网络连接不稳定,挂上梯子或代理再尝试下载;其二是OAI服务器进行维护,一般持续时间为6个小时,但较为少见。

  2. 克隆代码后,运行./build_oai -I报错:这是因为代理并没有在运行脚本的终端中作用。如果即便挂上梯子也无法克隆其中部分源码,请考虑参考以下操作:打开cmake_targets/tools/build_helper的文件并打开,注释掉约650, 652行和675, 676行的以下内容(在句首添加一个“#”号):

    1
    2
    3
    4
    5
    6
    7
    # $SUDO rm -rf /tmp/asn1c
    ...
    # git clone https://github.com/mouse07410/asn1c /tmp/asn1c
    ...
    # $SUDO rm -rf /tmp/simde
    # git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde
    ...

    关闭保存后,在挂了代理的终端中运行下列两行指令:

    1
    2
    git clone https://github.com/mouse07410/asn1c /tmp/asn1c 
    git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde

    最后再运行sudo ./build_oai -I指令即可。

  3. 其他报错问题:使用Mailing List进行咨询,并提供详细的硬件、操作系统信息,具体操作请参考OAI Intro

其他构建选项

OAI使用了CMake以及Ninja以加快项目的编译,具体请参考doc/BUILD.md文档。这里仅列出几个比较常见的使用命令:

  • -I:用于安装部分前置库,只需要在第一次构建时使用。
  • -w:该项用于构建使用的射频前端,可选的选项有SIMUUSRP,前者是用于构建仿真模拟器,后者则是调用UHD驱动以使用真实射频设备,在选择USRP时,也会一并编译SIMU中的内容,所以一般选择USRP
  • --gNB:用于构建nr-softmodemnr-cuup可执行文件以及其他需要的共享库。
  • --nrUE:用于构建nr-uesoftmodem的NR UE可执行应用以及所需共享库。
  • --ninja:使用增量构建工具ninja,可以加快构建速度。
  • -c :清空编译工作空间并强行构建应用。

OAI有两种使用方式:真实射频硬件和RFSIM的射频仿真模拟方式。真实的射频软件一般使用NI/Ettus 公司的USRP配合UHD驱动进行使用,而RFSIM的射频仿真则完全依赖运行主机的CPU进行模拟。同时,OAI构建的应用有基站和UE两种,他们分别对应的是上述构建选项中的 nrUEgNB。下面的运行介绍,只是定性的介绍,你可以从中了解部分的运行方式并加以修改,但是完全按照如下的指令,你可能依然无法正确地运行。可复现的成功案例会在其他博文中有所介绍。

基站运行

基站运行的指令是类似的,仅在部分参数上有些许区别。以大部分人接触到的 USRP B210设备为例,运行指令如下:

1
2
cd ~/openairinterface5g/cmake_targets/ran_build/build
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --sa -E --continuous-tx

其中,需要关注的是 -O 选项跟着的参数,它是一个配置文件的目录,该文件配置了基站文件的相关运行参数。一般来说,仅需要关心SCTP中的和AMF连接的地址,以及PLMN的设置即可;-E选项是使用3/4 采样,你可以理解为这是专属于B210以及X310的USRP的特定运行选项;--sa 表示基站运行在SA工作模式,可供选择的还有 --nsa--phy-test 等选项,具体可参考官方的参数说明,但一般的研究只会在sa模式下进行。

请注意,-O 选项后期可能会使用 .yaml文件作为输入,现有的 .conf 文件解析读取实在是做得一言难尽…有很多选项已经被弃用,但依然没有被官方移除接口,如THREAD_STRUCT 字段。

如果你没有射频设备,或者只关心信令研究,那么你可以使用RFSIM来运行gNB:

1
2
cd ~/openairinterface5g/cmake_targets/ran_build/build
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa

你可以注意到,和上一条命令相比几乎一模一样,使用了 --rfsim 选项指定使用RFSIM,此时由于没有B210的使用,故 -E 选项就不再需要了。

nrUE 运行

在使用nrUE前,你需要做一些更改。请修改openair3/UICC/usim_interface.c中的文件,然后再重新编译nrUE。需要修改的内容为宏定义的UICC_PARAMS_DESC中,imsi, key , opc, dnn, nssai_sst 以及 nssai_sd中的内容,这些内容需要和基站、核心网中的元素一一对应。使用B210来运行nrUE,可以使用如下命令:

1
2
cd ~/openairinterface5g/cmake_targets/ran_build/build
sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --ue-fo-compensation --sa -E

使用RFSIM则是如下:

1
2
cd ~/openairinterface5g/cmake_targets/ran_build/build
sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --sa --uicc0.imsi --rfsim

注意,RFSIM的使用是成对的,即如果使用nrUE的RFSIM,那么他也只可能与gNB的RFSIM进行连接。