目录

使用USRP与srsLTE搭建软件LTE基站

软件无线电SDR实现了射频收发所需的通用硬件平台,并将传统的模拟基带通过软件实现。本文基于USRP B210SDR平台与开源的基站、核心网srsRAN 4G,自行搭建LTE网络用于测试与学习。

警告
本文出于学习LTE通信原理的目的,文中的实验均在无运营商对应频段网络覆盖的室内完成,且调整发射功率至信号仅在室内可用,未在授权频段对运营商信号进行任何干扰。若您希望搭建软件LTE基站,请确认您所在地的授权频段使用情况,并确保不会对授权频段做出干扰。

后文均在Ubuntu 22.04 LTS操作系统下完成,PC的CPU型号为Intel i7-8550U

安装UHD

UHD是USRP的开源驱动。根据官方的建议,此处选择编译安装,具体的安装步骤可以参考Ettus官方文档。此处给出简要安装过程。

首先,安装编译所需的依赖:

sudo apt-get install 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

然后,获取UHD的源码。根据srsRAN的推荐,选择最新的LTS版本,即UHD-3.15.LTS分支。

cd ~/code
git clone https://github.com/EttusResearch/uhd.git
cd uhd
git checkout UHD-3.15.LTS
git submodule update --init --recursive

编译并安装UHD。如果在cmake配置过程中,出现Dependencies for required component LibUHD not met.的错误,重新运行一次cmake ../即可。

cd ~/code/uhd/host
mkdir build
cd build
cmake ../
make -j8 && sudo make install

刷新动态链接库。

sudo ldconfig

完成上述操作后,UHD的安装步骤就完成了。此时,可以烧录FPGA镜像到USRP,并测试与USRP的连接。

sudo uhd_images_downloader #此命令必须有良好的网络环境才能成功下载

sudo uhd_usrp_probe

若出现类似如下的日志,且USRP上的橙色电源指示灯点亮,则说明UHD已经安装成功并成功烧录USRP的固件。

[INFO] [UHD] linux; GNU C++ version 11.4.0; Boost_107400; UHD_3.15.0.0-74-ge35f66e8
[INFO] [B200] Loading firmware image: /usr/local/share/uhd/images/usrp_b200_fw.hex...
[INFO] [B200] Detected Device: B210
[INFO] [B200] Loading FPGA image: /usr/local/share/uhd/images/usrp_b210_fpga.bin...
[INFO] [B200] Operating over USB 3.
[INFO] [B200] Detecting internal GPSDO....
[INFO] [GPS] Found an internal GPSDO: GPSTCXO, Firmware Rev 0.929b
[INFO] [B200] Initialize CODEC control...
[INFO] [B200] Initialize Radio control...
[INFO] [B200] Performing register loopback test...
[INFO] [B200] Register loopback test passed
[INFO] [B200] Performing register loopback test...
[INFO] [B200] Register loopback test passed
[INFO] [B200] Setting master clock rate selection to 'automatic'.
[INFO] [B200] Asking for clock rate 16.000000 MHz...
[INFO] [B200] Actually got clock rate 16.000000 MHz.
  _____________________________________________________
 /
|       Device: B-Series Device
|     _____________________________________________________
|    /
|   |       Mboard: B210
|   |   serial: XXXXXXX
|   |   name: MyB210
|   |   product: 2
|   |   revision: 4
|   |   FW Version: 8.0
|   |   FPGA Version: 16.0
|   |
|   |   Time sources:  none, internal, external, gpsdo
|   |   Clock sources: internal, external, gpsdo
|   |   Sensors: gps_gpgga, gps_gprmc, gps_time, gps_locked, gps_servo, ref_locked
|   |     _____________________________________________________
|   |    /
|   |   |       RX DSP: 0
|   |   |
|   |   |   Freq range: -8.000 to 8.000 MHz
|   |     _____________________________________________________
|   |    /
|   |   |       RX DSP: 1
|   |   |
|   |   |   Freq range: -8.000 to 8.000 MHz
|   |     _____________________________________________________
|   |    /
|   |   |       RX Dboard: A
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       RX Frontend: A
|   |   |   |   Name: FE-RX2
|   |   |   |   Antennas: TX/RX, RX2
|   |   |   |   Sensors: temp, rssi, lo_locked
|   |   |   |   Freq range: 50.000 to 6000.000 MHz
|   |   |   |   Gain range PGA: 0.0 to 76.0 step 1.0 dB
|   |   |   |   Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz
|   |   |   |   Connection Type: IQ
|   |   |   |   Uses LO offset: No
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       RX Frontend: B
|   |   |   |   Name: FE-RX1
|   |   |   |   Antennas: TX/RX, RX2
|   |   |   |   Sensors: temp, rssi, lo_locked
|   |   |   |   Freq range: 50.000 to 6000.000 MHz
|   |   |   |   Gain range PGA: 0.0 to 76.0 step 1.0 dB
|   |   |   |   Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz
|   |   |   |   Connection Type: IQ
|   |   |   |   Uses LO offset: No
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       RX Codec: A
|   |   |   |   Name: B210 RX dual ADC
|   |   |   |   Gain Elements: None
|   |     _____________________________________________________
|   |    /
|   |   |       TX DSP: 0
|   |   |
|   |   |   Freq range: -8.000 to 8.000 MHz
|   |     _____________________________________________________
|   |    /
|   |   |       TX DSP: 1
|   |   |
|   |   |   Freq range: -8.000 to 8.000 MHz
|   |     _____________________________________________________
|   |    /
|   |   |       TX Dboard: A
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       TX Frontend: A
|   |   |   |   Name: FE-TX2
|   |   |   |   Antennas: TX/RX
|   |   |   |   Sensors: temp, lo_locked
|   |   |   |   Freq range: 50.000 to 6000.000 MHz
|   |   |   |   Gain range PGA: 0.0 to 89.8 step 0.2 dB
|   |   |   |   Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz
|   |   |   |   Connection Type: IQ
|   |   |   |   Uses LO offset: No
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       TX Frontend: B
|   |   |   |   Name: FE-TX1
|   |   |   |   Antennas: TX/RX
|   |   |   |   Sensors: temp, lo_locked
|   |   |   |   Freq range: 50.000 to 6000.000 MHz
|   |   |   |   Gain range PGA: 0.0 to 89.8 step 0.2 dB
|   |   |   |   Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz
|   |   |   |   Connection Type: IQ
|   |   |   |   Uses LO offset: No
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       TX Codec: A
|   |   |   |   Name: B210 TX dual DAC
|   |   |   |   Gain Elements: None

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/usrp-b210.jpg
固件烧录成功的USRP B210

安装srsRAN 4G

编译安装srsRAN的步骤同样参考srsRAN 4G官方文档,在此做简要介绍。

安装srsGUI

提高运行性能
若您的PC性能较弱,运行srsGUI将会降低软件DSP的性能,甚至导致eNodeB断开与UE的连接。为了提升软件DSP的性能,可以跳过安装srsGUI的步骤,并忽略后续步骤中启用srsGUI的相关操作。

为了显示星座图等图形化数据,需要在安装srsRAN之前安装srsGUI。首先安装所需的依赖:

sudo apt-get install cmake build-essential libboost-system-dev libboost-test-dev libboost-thread-dev libqwt-qt5-dev qtbase5-dev

然后,获取srsGUI的源码:

cd ~/code
git clone https://github.com/srsLTE/srsGUI.git

最后,编译并安装srsGUI:

cd srsgui
mkdir build
cd build
cmake ../
make -j8 && sudo make install

安装srsRAN 4G

同样,首先安装srsRAN所需的依赖:

sudo apt-get install libfftw3-dev libmbedtls-dev libboost-program-options-dev libconfig++-dev libsctp-dev

接下来,获取srsRAN的源码:

cd ~/code
git clone https://github.com/srsRAN/srsRAN_4G.git

最后,编译并安装srsRAN 4G:

cd srsRAN_4G
mkdir build
cd build
cmake ../
make -j8 && sudo make install

二进制安装完毕后,还需要将默认配置文件拷贝至/root/.config/srsran,并更新动态链接库:

sudo srsran_install_configs.sh user

sudo ldconfig

尝试运行srsRAN 4G

安装实时内核

提示
这是一个可选步骤,在我的电脑上安装实时内核后反而会导致性能降低,请根据实际情况测试后决定是否使用实时内核。

Ubuntu的实时内核现在已经是Ubuntu Pro的一部分。为Ubuntu安装实时内核的教程可以参考Ubuntu官方页面。此处做简要的介绍。

针对个人用户,Ubuntu Pro提供5台免费的计算机激活配额。为此,请首先注册Ubuntu帐号并订阅Ubuntu Pro,在获取token后,按如下操作将token应用于Ubuntu操作系统并启用实时内核:

sudo pro attach <token>
sudo pro enable realtime-kernel

实时内核将在重启计算机后生效。

调整CPU工作模式

为了获得最好的性能,建议将切换CPU到高性能模式:

echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

允许核心网访问互联网

为了让设备能够访问网络,需要配置Linux内核将核心网产生的虚拟网卡srs_spgw_sgi的流量进行伪装,将其流量通过NAT连接到具有互联网的网卡上,从而让用户设备可以访问互联网。为此,srsEPC提供了一键脚本sudo srsepc_if_masq <out_interface>,其中<out_interface>为连接到互联网的物理网卡的接口名。常见的有线网卡的接口名一般为eth0,可以通过ifconfig命令进行确认。

sudo srsepc_if_masq.sh eth0
注意
调整CPU性能模式与启用流量伪装的操作均为临时操作,即每次重新引导系统后均需重新操作。

尝试运行srsRAN 4G

srsRAN包括简易软件核心网srsEPC与软件基站srsENB两部分。分别启动两个终端,然后在第一个终端中启动核心网:

sudo srsepc

然后在第二个终端中启动基站:

sudo srsenb

若一切正常,在运行核心网的终端中可以看到基站连接的日志:

Received S1 Setup Request.
S1 Setup Request - eNB Name: srsenb01, eNB id: 0x19b
S1 Setup Request - MCC:001, MNC:01
S1 Setup Request - TAC 7, B-PLMN 0xf110
S1 Setup Request - Paging DRX v128
Sending S1 Setup Response

在运行基站的终端中可以看到驱动USRP成功的日志:

Opening 1 channels in RF device=default with args=default
Supported RF device list: UHD file
Trying to open RF device 'UHD'
[INFO] [UHD] linux; GNU C++ version 11.4.0; Boost_107400; UHD_3.15.0.0-74-ge35f66e8
[INFO] [LOGGING] Fastpath logging disabled at runtime.
Opening USRP channels=1, args: type=b200,master_clock_rate=23.04e6
[INFO] [UHD RF] RF UHD Generic instance constructed
[INFO] [B200] Detected Device: B210
[INFO] [B200] Operating over USB 3.
[INFO] [B200] Detecting internal GPSDO....
[INFO] [GPS] Found an internal GPSDO: GPSTCXO, Firmware Rev 0.929b
[INFO] [B200] Initialize CODEC control...
[INFO] [B200] Initialize Radio control...
[INFO] [B200] Performing register loopback test...
[INFO] [B200] Register loopback test passed
[INFO] [B200] Performing register loopback test...
[INFO] [B200] Register loopback test passed
[INFO] [B200] Asking for clock rate 23.040000 MHz...
[INFO] [B200] Actually got clock rate 23.040000 MHz.
RF device 'UHD' successfully opened

==== eNodeB started ===
Type <t> to view trace
Setting frequency: DL=2680.0 Mhz, UL=2560.0 MHz for cc_idx=0 nof_prb=50

此时可以看到USRP亮起了一个发射指示灯(红色)与一个接收指示灯(绿色)。srsENB的默认配置文件中,配置基站工作在B7频段,该频段大部分国产手机均不支持,因此截至此步骤时,手机搜不到运营商是正常现象。

提示
B7频段范围与B41几乎完全重合。B7为FDD频段,而B41为TDD频段,srsLTE仅支持FDD-LTE。在国内,B41属于中国移动,被用于5G与4G主力覆盖。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/usrp-b210-on.jpg
运行中的USRP(图中是启用了MIMO后的状态,因此点亮了4个LED)

配置srsRAN 4G

配置虚拟核心网srsEPC

对于某些高通平台的国产手机而言(下文中以小米13 Pro手机举例),为了提高搜网速度,其在系统层面会通过运营商配置文件限制手机在使用某运营商SIM卡时可使用的频段,具体表现为当手机插入某运营商的SIM卡,如中国移动后,手机会限制基带只能连接中国移动拥有的频段(B3 B8 B34 B38 B39 B40 B41),而其他频段例如B1则无法连接。对于未知的运营商而言,手机则会默认应用中国移动的运营商描述文件。由于srsLTE仅支持FDD-LTE,而中国移动的4G大多为TDD-LTE,因此有必要配置核心网的PLMN,从而应用以FDD-LTE为主的运营商(中国联通、中国电信)的配置文件。

确定运营商的的主要是配置移动设备网络代码(Mobile Network Code,MNC)与移动设备国家代码(Mobile Country Code,MCC),二者合称为PLMN,由核心网确定。为此,打开srsENB的配置文件/root/.config/srsran/epc.conf,将其中的mccmnc改为合适的值即可。推荐将mccmnc分别改为46006,其中mcc为中国大陆的移动设备国家代码,06为中国联通的卫星电话网络代码,在与现网中国联通网络的01区分的同时,可以让手机将SIM卡识别为中国联通从而启用更多FDD-LTE频段。

配置文件权限
该配置文件属于root用户,使用普通用户打开该文件是会提示Permission denied,此时使用sudo -i切换到root用户即可。后文中的配置文件均是同理。

下图中展示了小米13 Pro手机在root后使用Cellular-Pro读取的不同PLMN激活的不同运营商配置文件的差异。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/plmn-vs-bands.jpg
不同PLMN所启用的频段列表(卡2)

除此之外,srsENB的配置文件中还有一些可选的修改项,例如full_net_name确定网络的全名,short_net_name确定网络名的缩写,apn确定访问互联网所使用的APN等,此处不再赘述。

选择频段并配置RRU

警告
请再次仔细确认您所在地的授权频段使用情况,确保本文中的实验不会对授权频段做出干扰。

首先对虚拟RRU进行配置。RRU在物理基站中的主要作用为将基带单元BBU所产生的数字基带信号通过射频发射或接收,需要重点关注的参数主要为虚拟RRU驱动SDR所工作的频段。目前的srsRAN 4G仅支持FDD频段,即只支持频分双工模式的LTE。在我国,运营商常用的FDD频段包括B1(中国电信、中国联通)、B3(中国移动、中国电信、中国联通)、B5(中国电信)与B8(中国联通)。具体频段的频率范围与各个运营商所拥有的频段范围可以从下图中查询。

各运营商所拥有的频段与频率范围

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/lte-bands-and-freq.jpg
3GPP规定的LTE频段表(转自通信人家园论坛)

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/cn-carriers-bands.jpg
国内运营商所拥有的频率范围(转自通信人家园论坛,截至2022年底)

其中,Band1的下行频率范围为1920-1980MHz,其中1920-1940MHz归中国电信所有,1940-1965MHz归中国联通所有。1920-1940MHz1940-1960MHz两个20M带宽的信道用于部署LTE或NR,1960-1965MHz部署WCDMA。在城区中,现网宏站常部署0-2个20MHz带宽的LTE网络,室分则常见20MHz带宽的LTE与20MHz带宽的NR,即Band1所部署的5G网络在城区仅用于室内覆盖(山东青岛城区实测)。在确认自己所在室内没有室分(一般小区都没有)之后,需要进一步确定下行ARFCN=100(1920-1940MHz)与ARFCN=300(1940-1960MHz)两个频点是否有部署LTE。通常来说,南方常使用100频点部署宏站B1(电信承建区),北方则使用300频点(联通承建区)。

我所在的地区的室内未部署室分基站,且中心频点100的Band1目前处于空闲状态,因此我将设置SDR的工作频点为100。打开RRU的默认配置文件/root/.config/srsran/rr.conf,在其中找到cell_list列表,并找到其中唯一的基站信息,其中的dl_earfcn即为RRU所使用的下行频点,将其修改为100即可。除此之外,本实验由于只部署单个基站,因此后面有关载波聚合与邻区的scell_list meas_cell_listmeas_report_desc均可删除或注释掉。

对RRU配置文件/root/.config/srsran/rr.conf的主要修改如下所示。此处主要修改的为cell_list节中的下行频点dl_earfcn,其他内容如无特殊需求保持默认即可。

// 前略...
cell_list =
(
  {
    // 此处略...

    dl_earfcn = 100; // 修改这里

    // 此处略...

    scell_list = ( //记录用于载波聚合的小区信息 只有一个基站所以不需要
      // 此处可删除...
    )

    meas_cell_list = //记录用于漫游的邻区信息 只有一个基站所以不需要
    (
      // 此处可删除...
    );

    meas_report_desc = //同上
    (
      // 此处可删除...
    );

    // 此处略...
  }
);

另一个选择是使用B8前端的5MHz带宽频谱,此频谱分配给GSM-R系统使用,如果所在区域附近没有铁路,并确定该频段在附近没有部署时,可以在室内小功率短时间发射。下图为使用RTL-SDR检查B8占用情况时的截图,可以看出中国移动占用的B8在934MHz之后的部分,934MHz前的频谱没有无线电信号。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/rtl-sdr.jpg
使用RTL-SDR检查B8前端使用情况

配置eNB

eNB在srsLTE中主要承担的是虚拟基带的作用。我们需要关注的配置项主要为射频的MIMO天线数与方式以及带宽等配置。USRP B210最高支持56M全双工带宽(由Tx与Rx共享)、2x2MIMO的射频信号发射,频率范围为70MHz-6GHz参见官方文档)。因此,使用USRP B210最高可以支持2x2 20MHz带宽的全双工LTE通信。

在eNB的配置文件/root/.config/srsran/enb.conf中,首先要修改其中的mccmnc为与核心网相同的数值,然后是下列与射频参数有关的设置项。

tm = 3 //MIMO等级
nof_ports = 2 //MIMO天线数
n_prb = 50

其中,nof_ports是使用的MIMO天线数量,选择更多的MIMO空间流数量可以成倍增加吞吐量,若电脑配置较高,强烈建议设置为2。当nof_ports超过2时,还需要设置tmtm是MIMO系统中的空间复用方式,有关其具体的描述可以参考此文章。对于室内系统而言,tm取值3或4,即空间复用是否闭环对测试结果影响不大,而启用闭环空间复用会对PC的性能提出更高的要求,因此将tm设置为3即可。n_prb是所使用的射频资源块PRB数量,我的电脑配置只能支持50PRB的软件基带调制解调。PRB数量更为我们熟知的是概念是信道带宽,PRB数量与信道带宽的关系如下表所示。PRB数量越大,速度越快,根据自己电脑配置使用合适的参数即可。

带宽 资源块数量 下行子载波数量 上行子载波数量
1.4 MHz 6 73 72
3 MHz 15 181 180
5 MHz 25 301 300
10 MHz 50 601 600
15 MHz 75 901 900
20 MHz 100 1201 1200

使用手机连接软件LTE基站

制作测试SIM卡

3G网络后,核心网与UE实行了双向鉴权,即在核心网需要确认用户为合法用户的同时,用户也需要确认核心网的合法性,因此软件LTE基站无法与软件GSM基站一样随意插入一张SIM卡就可以强制附着网络。为此,就需要制作能配合软件LTE系统使用的合法SIM卡。

我是用的测试LTE SIM白卡是从淘宝购得的,一同购买的还有其配套的读卡器,读卡器使用的主控芯片型号是AU9540

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/sim-card-reader-hardware.jpg
SIM卡读卡器

插入白卡,打开软件,可以看到如下的界面。我们使用的卡片是LTE卡,因此操作均在右侧的5G/LTE选项卡中进行。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/sim-card-reader.png
SIM卡读卡器上位机

其中,用于LTE鉴权的三元组包括IMSIKiOP/OPC。其中,IMSI是国际移动用户识别码International Mobile Subscriber Identity的缩写,用于唯一地标识一个用户;Ki是鉴权密钥Key identifier的缩写,它是特定于用户的128位密钥;OP是运营商代码Operator Code的缩写,是由运营商颁发的用于验证接入设备是否属于运营商的用户的密钥,特定移动网络中每个用户的OP都是相同的,OPC则是派生运营商代码Derived Operator Code的缩写,它由OP与Ki的值经加密算法得到,对每一张SIM卡都是独一无二的,用于确保某张SIM卡的OPC泄露时不会危害整个移动通信网络的安全。在实际网络中,IMSI是公开的,而Ki与OP/OPC则是严格保密的。上位机软件中,对正常用户加密的信息都用绿色底色表示,但由于我们拥有测试卡的管理员密码ADM,因此读卡器可以读取并写入这些数据。

srsLTE中提供了可用的三元组。为了简单起见,这里选择将srsLTE提供的三元组写入白卡内。srsLTE提供的三元组存放在/root/.config/srsran/user_db.csv文件内,每一行为一个用户信息。srsLTE提供的默认user_db.csv文件内容如下:

#
# .csv to store UE's information in HSS
# Kept in the following format: "Name,Auth,IMSI,Key,OP_Type,OP/OPc,AMF,SQN,QCI,IP_alloc"
#
# Name:     Human readable name to help distinguish UE's. Ignored by the HSS
# Auth:     Authentication algorithm used by the UE. Valid algorithms are XOR
#           (xor) and MILENAGE (mil)
# IMSI:     UE's IMSI value
# Key:      UE's key, where other keys are derived from. Stored in hexadecimal
# OP_Type:  Operator's code type, either OP or OPc
# OP/OPc:   Operator Code/Cyphered Operator Code, stored in hexadecimal
# AMF:      Authentication management field, stored in hexadecimal
# SQN:      UE's Sequence number for freshness of the authentication
# QCI:      QoS Class Identifier for the UE's default bearer.
# IP_alloc: IP allocation stratagy for the SPGW.
#           With 'dynamic' the SPGW will automatically allocate IPs
#           With a valid IPv4 (e.g. '172.16.0.2') the UE will have a statically assigned IP.
#
# Note: Lines starting by '#' are ignored and will be overwritten
ue1,xor,001010123456789,00112233445566778899aabbccddeeff,opc,63bfa50ee6523365ff14c1f45f88737d,9001,000000001234,7,dynamic
ue2,mil,001010123456780,00112233445566778899aabbccddeeff,opc,63bfa50ee6523365ff14c1f45f88737d,8000,000000001234,7,dynamic

可以看到srsLTE提供了两个默认认证三元组,我们选择ue2写入SIM白卡中。由于srsLTE提供的三元组中IMSI是15位的,提供的运营商密钥是OPC,因此需要在上位机软件中选择对应的类型后再填入。对于Ki和OPC,直接将配置文件中ue2的Ki和OPC填入上位机软件中即可。值得注意的是,OPC与Ki具有对应关系,因此不建议对其做出修改。对于IMSI,需要将配置文件与写入卡片的IMSI的前5位都改为46006,即前面设置的MCC与MNC的值,否则手机将加载错误的运营商配置文件。IMSI的数值只要满足位数正确且前5位中的MCC/MNC值正确,其他位数可以自行设置。

对应最终写入SIM白卡的user_db.csv文件内容如下:

ue2,mil,460060000000001,00112233445566778899aabbccddeeff,opc,63bfa50ee6523365ff14c1f45f88737d,8000,000000001234,7,dynamic

除了鉴权三元组之外,还有一些需要配置的项目。首先是卡片的ICCID,一定要以代表中国大陆地区的89860开头,否则手机会将SIM卡识别为国外运营商发行的SIM卡,从而触发漫游或加载错误的运营商配置文件。除了开头5位之外,后面的可以自行设置,只需要满足总长度为20位即可。然后是AD,即SIM卡操作模式的选项。下表是AD的取值与对应的描述。

AD 描述
00 正常模式(用户登录3GPP网络)
01 正常模式+特定设施
02 离线维护模式
04 基站小区测试模式(在某个小区在商用之前,进行测试)
80 型号批准(在型号批准过程中,允许ME的特定的使用)
81 型号批准+特定设施(允许ME制造商执行专有的自动测试,例如维护阶段)

点击AD右侧的按钮,会弹出如下的界面,将AD保持默认的00,即正常模式。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/sim-card-reader-ad-window.png
AD设置窗口

接下来还需要设置HPLMN。HPLMN是Home PLMN的缩写,即SIM卡所属的运营商的PLMN,填写与核心网设置中MCC和MNC对应的46006即可,PLMN ATI代表为Access Technologies Identifier的缩写,即接入技术识别码。ATI共有两个字节,其第一个字节用于选择E-UTRAN模式,即LTE模式:

B7 B6 B5 模式
0 x x E-UTRAN未选择
1 0 0 E-UTRAN在WB-S1模式和NB-S1模式
1 0 1 E-UTRAN只在NB-S1模式
1 1 0 E-UTRAN只在WB-S1模式
1 1 1 E-UTRAN在WB-S1模式和NB-S1模式

我们使用LTE,因此将ATI的第一个字节为80H。第二个字节用于选择GSM模式,我们不使用GSM模式,因此直接将第二个字节设置为00H即可。因此,ATI的取值为8000H。下图展示了设置HPLMN的界面。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/sim-card-reader-plmn-window.png
HPLMN设置窗口

除此之外,设置界面中还包含了其他的PLMN设置,感兴趣的可以自行上网搜索。最后,请注意设置智能卡的加密算法Algorithm,一定要使用与srsLTE配置文件中相同的加密算法,否则无法成功鉴权。这里选择默认配置文件内ue2使用的的Milenage算法。

一切设置完成后,点击Write Card将数据写入SIM卡后,便可以把SIM卡插入手机了。

使用手机连接网络

接下来,再次使用分别运行srsepcsrsenb,并切换手机的飞行模式,此时应该可以看到手机正常搜索到我们发射出的LTE信号了。

提示
别忘记每次引导系统后都需要执行一次允许核心网访问互联网中的操作。

进入手机的设置,关闭手机的自动运营商选择,稍等片刻应该可以搜索到发射出PLMN为46006的LTE网络。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/carrier-selection.png
手动搜索网络

iPhone的设置里还可以识别出SIM卡的ICCID与运营商名称。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/iphone-sim-card.png
iPhone设置中的SIM卡信息

我的射频设置为2x2 MIMO,10MHz带宽,测速结果如下。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/speedtest.jpg
测速结果

使用Cellular-Pro查询的详细LTE网络信息如下。

https://img.yuanze.wang/posts/lte-basestation-with-srslte-and-usrp/cellular-z.jpg
详细LTE网络信息

可以看到网络目前是运行到了256QAM的下行调制状态,跑满了带宽。

下面是用户成功接入时srsENB的日志。

Active RF plugins: libsrsran_rf_uhd.so
Inactive RF plugins:
---  Software Radio Systems LTE eNodeB  ---

Couldn't open , trying /root/.config/srsran/enb.conf
Reading configuration file /root/.config/srsran/enb.conf...
Couldn't open sib.conf, trying /root/.config/srsran/sib.conf
Couldn't open rr.conf, trying /root/.config/srsran/rr.conf
Couldn't open rb.conf, trying /root/.config/srsran/rb.conf

Built in Release mode using commit fa56836b1 on branch master.

Opening 2 channels in RF device=default with args=default
Supported RF device list: UHD file
Trying to open RF device 'UHD'
[INFO] [UHD] linux; GNU C++ version 11.4.0; Boost_107400; UHD_3.15.0.0-74-ge35f66e8
[INFO] [LOGGING] Fastpath logging disabled at runtime.
Opening USRP channels=2, args: type=b200,master_clock_rate=23.04e6
[INFO] [UHD RF] RF UHD Generic instance constructed
[INFO] [B200] Detected Device: B210
[INFO] [B200] Operating over USB 3.
[INFO] [B200] Detecting internal GPSDO....
[INFO] [GPS] Found an internal GPSDO: GPSTCXO, Firmware Rev 0.929b
[INFO] [B200] Initialize CODEC control...
[INFO] [B200] Initialize Radio control...
[INFO] [B200] Performing register loopback test...
[INFO] [B200] Register loopback test passed
[INFO] [B200] Performing register loopback test...
[INFO] [B200] Register loopback test passed
[INFO] [B200] Asking for clock rate 23.040000 MHz...
[INFO] [B200] Actually got clock rate 23.040000 MHz.
[INFO] [MULTI_USRP]     1) catch time transition at pps edge
[INFO] [MULTI_USRP]     2) set times next pps (synchronously)
RF device 'UHD' successfully opened

==== eNodeB started ===
Type <t> to view trace
Starting plot for worker_id=0
Creating plot window 'srsENB PCI 1'...
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
Setting frequency: DL=1835.0 Mhz, UL=1740.0 MHz for cc_idx=0 nof_prb=50
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
RACH:  tti=7931, cc=0, pci=1, preamble=10, offset=0, temp_crnti=0x46
User 0x46 connected

常见问题

  • 当搜不到信号时,首先请检查手机是否支持发射的频段,然后请参考配置虚拟核心网srsEPC检查使用的PLMN是否能触发手机加载正确的运营商配置文件,并检测srsENB与RRU配置中的射频参数是否正确。

  • 当PC性能不足时,会出现如下所示的Could not transmit RAR within the window警告信息,且SDR上的Tx/Rx指示灯会闪烁,此时可以尝试调低射频参数,或更换配置更高的PC。

ser 0x48 connected
RACH:  tti=4091, cc=0, pci=1, preamble=55, offset=18, temp_crnti=0x49
RACH:  tti=4111, cc=0, pci=1, preamble=43, offset=18, temp_crnti=0x4a
RACH:  tti=4131, cc=0, pci=1, preamble=42, offset=18, temp_crnti=0x4b
RACH:  tti=4151, cc=0, pci=1, preamble=60, offset=18, temp_crnti=0x4c
Disconnecting rnti=0x49.
RACH:  tti=4171, cc=0, pci=1, preamble=10, offset=32, temp_crnti=0x4d
RACH:  tti=4191, cc=0, pci=1, preamble=12, offset=32, temp_crnti=0x4e
SCHED: Could not transmit RAR within the window (RA=4191, Window=[4194, 4204), RAR=4720
RACH:  tti=4211, cc=0, pci=1, preamble=16, offset=32, temp_crnti=0x4f
RACH:  tti=4231, cc=0, pci=1, preamble=49, offset=18, temp_crnti=0x50
RACH:  tti=4251, cc=0, pci=1, preamble=43, offset=18, temp_crnti=0x51
SCHED: Could not transmit RAR within the window (RA=4211, Window=[4214, 4224), RAR=4721
SCHED: Could not transmit RAR within the window (RA=4231, Window=[4234, 4244), RAR=4721
SCHED: Could not transmit RAR within the window (RA=4251, Window=[4254, 4264), RAR=4721
RACH:  tti=4271, cc=0, pci=1, preamble=56, offset=18, temp_crnti=0x52
RACH:  tti=4441, cc=0, pci=1, preamble=28, offset=1, temp_crnti=0x53
SCHED: Could not transmit RAR within the window (RA=4271, Window=[4274, 4284), RAR=4762
SCHED: Could not transmit RAR within the window (RA=4441, Window=[4444, 4454), RAR=4762
RACH:  tti=4461, cc=0, pci=1, preamble=2, offset=1, temp_crnti=0x54
RACH:  tti=4481, cc=0, pci=1, preamble=30, offset=1, temp_crnti=0x55
Disconnecting rnti=0x4a.
SCHED: Could not transmit RAR within the window (RA=4461, Window=[4464, 4474), RAR=4763
SCHED: Could not transmit RAR within the window (RA=4481, Window=[4484, 4494), RAR=4763
RACH:  tti=4891, cc=0, pci=1, preamble=22, offset=1, temp_crnti=0x56
SCHED: Could not transmit RAR within the window (RA=4891, Window=[4894, 4904), RAR=4939
RACH:  tti=4911, cc=0, pci=1, preamble=51, offset=1, temp_crnti=0x57
RACH:  tti=4931, cc=0, pci=1, preamble=8, offset=1, temp_crnti=0x58
Disconnecting rnti=0x4b.
  • 当SIM卡内鉴权信息错误时,会出现如下所示的Sending PDN Connectivity Reject报错信息,此时请核对SIM卡中写入的鉴权信息与srsEPC中配置的是否一致。
wangyz@XPS13:~$ sudo srsepc

Built in Release mode using commit fa56836b1 on branch master.


---  Software Radio Systems EPC  ---

Couldn't open , trying /root/.config/srsran/epc.conf
Reading configuration file /root/.config/srsran/epc.conf...
Couldn't open user_db.csv, trying /root/.config/srsran/user_db.csv
HSS Initialized.
MME S11 Initialized
MME GTP-C Initialized
MME Initialized. MCC: 0xf460, MNC: 0xff88
SPGW GTP-U Initialized.
SPGW S11 Initialized.
SP-GW Initialized.
Received S1 Setup Request.
S1 Setup Request - eNB Name: srsenb01, eNB id: 0x19b
S1 Setup Request - MCC:460, MNC:88
S1 Setup Request - TAC 7, B-PLMN 0x64f088
S1 Setup Request - Paging DRX v128
Sending S1 Setup Response
Initial UE message: LIBLTE_MME_MSG_TYPE_ATTACH_REQUEST
Received Initial UE message -- Attach Request
Attach request -- M-TMSI: 0xeca8d327
Attach request -- eNB-UE S1AP Id: 1
Attach request -- Attach type: 2
Attach Request -- UE Network Capabilities EEA: 11110000
Attach Request -- UE Network Capabilities EIA: 01110000
Attach Request -- MS Network Capabilities Present: true
PDN Connectivity Request -- EPS Bearer Identity requested: 0
PDN Connectivity Request -- Procedure Transaction Id: 6
PDN Connectivity Request -- ESM Information Transfer requested: true
UL NAS: Received Identity Response
ID Response -- IMSI: 460060000000001
Downlink NAS: Sent Authentication Request
UL NAS: Received Authentication Response
Authentication Response -- IMSI 460060000000001
UE Authentication Accepted.
Generating KeNB with UL NAS COUNT: 0
Downlink NAS: Sending NAS Security Mode Command.
UL NAS: Received Security Mode Complete
Security Mode Command Complete -- IMSI: 460060000000001
Sending ESM information request
UL NAS: Received ESM Information Response
ESM Info: APN ppnet
Getting subscription information -- QCI 7
Sending Create Session Request.
Creating Session Response -- IMSI: 460060000000001
Creating Session Response -- MME control TEID: 1
Received GTP-C PDU. Message type: GTPC_MSG_TYPE_CREATE_SESSION_REQUEST
SPGW: Allocated Ctrl TEID 1
SPGW: Allocated User TEID 1
SPGW: Allocate UE IP 172.16.0.2
Received Create Session Response
Create Session Response -- SPGW control TEID 1
Create Session Response -- SPGW S1-U Address: 127.0.1.100
SPGW Allocated IP 172.16.0.2 to IMSI 460060000000001
Adding attach accept to Initial Context Setup Request
Sent Initial Context Setup Request. E-RAB id 5
Received Initial Context Setup Response
E-RAB Context Setup. E-RAB id 5
E-RAB Context -- eNB TEID 0x1; eNB GTP-U Address 127.0.1.1
UL NAS: Received Attach Complete
Unpacked Attached Complete Message. IMSI 460060000000001
Unpacked Activate Default EPS Bearer message. EPS Bearer id 5
Received GTP-C PDU. Message type: GTPC_MSG_TYPE_MODIFY_BEARER_REQUEST
Sending EMM Information
UL NAS: PDN Connectivity Request
DL NAS: Sending PDN Connectivity Reject
UL NAS: PDN Connectivity Request
DL NAS: Sending PDN Connectivity Reject
UL NAS: PDN Connectivity Request
DL NAS: Sending PDN Connectivity Reject
UL NAS: PDN Connectivity Request
DL NAS: Sending PDN Connectivity Reject