LimeSDR实验教程(13) LTE基站、终端、核心网 (srsLTE nextepc)

接下来我会讲一个大型应用,实现LTE基站和LTE终端。其实这个应用之前国内就有很多人做,但是一般都是使用OAI实现的,这个软件包虽然很全,但是安装很麻烦,而且很不稳定。我使用的是srsLTE实现的,它包含了EPC、eNodeB和UE三大部分。srsepc是一个简易核心网,srsenb是基站,srsue是终端。srsepc和srsenb可以运行在一台电脑上,srsue必须运行在另一台电脑上。然后它们之间就可以建立一个高速连接,实现以太网通信,就好像互相之间连了一根网线一样。

演示视频:https://www.bilibili.com/video/av78917560

演示视频2:https://www.bilibili.com/video/av79578637

除了可以为2台电脑提供连接外,还可以用普通手机或者LTE模块接入srsepc和srsenb的网络,但是要自己写卡并配置user_db.csv,另外srsue也支持连接运营商的基站,但是需要另外购买一个sim读卡器。

为了本教程的完整性,我会从头开始安装,你只需要安装一个干净的ubuntu即可,我现在用的是16.04。

先安装Lime的驱动。如果你apt装过了就不要重新装,否则会有问题。soapy我建议你自己编译安装,如果apt安装会自动安装limesuite,这样limesuite就不是最新版本的了。不过soapy不能用太新的版本,否则srslte可能不兼容它,可能要从release里下载一个老一点的版本。

#packages for soapysdr available at myriadrf PPA
sudo add-apt-repository -y ppa:myriadrf/drivers
sudo apt-get update

#install core library and build dependencies
sudo apt-get install git g++ cmake libsqlite3-dev

#install hardware support dependencies
sudo apt-get install libsoapysdr-dev libi2c-dev libusb-1.0-0-dev

#install graphics dependencies
sudo apt-get install libwxgtk3.0-dev freeglut3-dev

git clone https://github.com/pothosware/SoapySDR.git
cd SoapySDR
mkdir build
cd build
cmake ..
make -j4
sudo make install

git clone https://github.com/myriadrf/LimeSuite.git
cd LimeSuite
git checkout stable
mkdir builddir && cd builddir
cmake ../
make -j4
sudo make install
sudo ldconfig

cd LimeSuite/udev-rules
sudo ./install.sh

装完以后安装srsLTE。

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

git clone https://github.com/srsLTE/srsLTE.git
cd srsLTE
mkdir build
cd build
cmake -DUSE_LTE_RATES=True ..
make
make test

sudo make install
sudo ldconfig
srslte_install_configs.sh user

如果你需要图形界面,就再安装srsGUI。

sudo apt-get install libboost-system-dev libboost-test-dev libboost-thread-dev libqwt-dev libqt4-dev
git clone https://github.com/srsLTE/srsGUI.git
cd srsGUI
mkdir build
cd build
cmake ../
make 
sudo make install
sudo ldconfig

 这样就基本装完了。

你可以到~/.config/srslte/下找到enb.conf和ue.conf来编辑你所想要的工作频段(arfcn)和带宽(prb),另外收发增益也很重要。

现在这套软件同时支持LimeSDR-USB和LimeSDR Mini。

运行:

在电脑1上开2个终端窗口,分别运行下面两个命令。

sudo srsepc
sudo srsenb

在电脑2上开1个终端窗口,运行下面命令。

sudo srsue

要选择天线可以在enb.conf和ue.conf里加入下面的语句

device_name = soapy
device_args = rxant=LNAL,txant=BAND1

现在可以在两台电脑上运行ifconfig看看多出来一个虚拟网卡,两个电脑可以互相ping对方的ip地址172.16.0.X,并且可以ssh登录。

前几天我做实验,发现了奇怪的现象,我用两个mini一个做基站一个做终端不行,必须用mini做基站,usb做终端,如果反一反usb做基站,mini做终端就不行,而且即使mini做基站,usb做终端也不是很稳,甚至不能保证每次都能接上。所以昨天我又试了试基站和终端都用LimeSDR-USB,信号质量提高了不少,见演示视频2。

我现在是3MHz的小区,prb 15,这个带宽对电脑配置要求也比较低,可以用被动散热的M3芯片跑(我用的是8代m3,终端或者基站都可以做),传输文件大概400kbps~700kbps,cpu占用率在30%以下。我后来在M3上单开基站,发现prb 100的20MHz小区也可以跑,cpu占用比i5 5200u还低。

还测试了其他频段arfcn 5200和5800,它们属于LTE FDD Band 13和17,频率都是700MHz的,都是北美运营商用的频段,用国外手机和模组就能支持。后来还试了arfcn 9870,这个是460MHz的,工业用频段,网上可以找到配套cpe。另外我还手动设置过dl_freq和ul_freq,只要enb和ue都设置为同样的频率值,可以脱离3gpp的规定,任意使用任何频段并互相通信。

我现在已经可以用enb作为路由器接入互联网了。

参考这个文章:https://blog.csdn.net/qq_30943197/article/details/83863819

首先在enb上运行下面的命令,eth0表示你连上公网的网卡,如果是别的可以用ifconfig里查到的名字替换掉。

sudo srsLTE/srsepc/srsepc_if_mask.sh eth0

然后ue上运行下面命令。ifconfig里tun_srsue后面会有小序号,不用填。

sudo route add default gw 172.16.0.1 tun_srsue

今天我试过商用终端(华为p20)接入enb了,要写sim卡,必须要用mil的方式,不能用xor(xor是srsue用的),然后把user_db.csv里的IMSI,Key(KI),OPC填入写卡软件就行。

#
# .csv to store UE's information in HSS
# Kept in the following format: "Name,Auth,IMSI,Key,OP_Type,OP,AMF,SQN,QCI,IP_alloc"
#
# Name:     Human readable name to help distinguish UE's. Ignored by the HSS
# IMSI:     UE's IMSI value
# Auth:     Authentication algorithm used by the UE. Valid algorithms are XOR
#           (xor) and MILENAGE (mil)
# 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
ue2,mil,001010123456780,00112233445566778899aabbccddeeff,opc,63bfa50ee6523365ff14c1f45f88737d,8000,00000000510f,7,dynamic
ue1,xor,001010123456789,00112233445566778899aabbccddeeff,opc,63bfa50ee6523365ff14c1f45f88737d,9001,000000001234,7,dynamic

上面是user_db.csv,我们只能用ue2的参数,ue1的不能用,把对应信息填入写卡软件即可。

LimeSDR实验教程(13) LTE基站、终端、核心网 (srsLTE nextepc)_第1张图片 

我开了enb,然后手机连上去,另一个电脑开ue,可以同时接入同一个enb,sdr我都用limesdr mini也可以。不过似乎手机会被srsue干扰掉。

另外我还测试了一下最大带宽,我一个enb+limesdr mini开了75prb也就是15MHz小区,手机也可以接上,测速确实比10MHz快,不过速度不太稳定。试下来还是10MHz最好。我用了双工器后只能开5MHz小区手机才能连上,星座图完美,但是limesdr mini的ue这时会有dc offset。所以我还是想开10MHz小区,后来我用频谱仪看了一下,发现我这运营商信号太强,开10MHz的时候,下行信号左侧会被干扰,5MHz时不会,所以我把arfcn改为2560,这时手机和srsue都能接入了,尤其是手机星座图很好,srsue也有好的时候但是不稳定,看来双工器是有用的,问题是ue的反向双工器不太好找。

接下来我要测试使用另一种方案的epc对接srsenb了,这样有望实现基站切换功能,我参考了下文,但是我是apt安装的。

https://blog.csdn.net/qq_32037393/article/details/96269517

我现在本机同时安装nextepc和srsenb可以正常运行,挺稳定。

今天我还测试成功了nextepc和srsenb分别安装在局域网内的两台不同电脑上,mme连接成功了,并且手机能接入,能ping通epc也能上外网。

我之前参考的那篇文章有不少问题,今天又参考了一篇oai epc + srsenb的文章,才搞定了。

http://www.pianshen.com/article/809368876/

我的nextepc是在ubuntu 18.04上apt安装的。

步骤如下:

sudo apt-get update
sudo apt-get -y install software-properties-common
sudo add-apt-repository ppa:nextepc/nextepc
sudo apt-get update
sudo apt-get -y install nextepc

sudo apt-get -y install curl
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
curl -sL https://nextepc.org/static/webui/install | sudo -E bash -

装完要验证一下:

sudo systemctl status nextepc-mmed
● nextepc-mmed.service - NextEPC MME Daemon
   Loaded: loaded (/lib/systemd/system/nextepc-mmed.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-02-21 19:29:43 MST; 27s ago
   ...
sudo systemctl status nextepc-sgwd
   ...
sudo systemctl status nextepc-pgwd
   ...
sudo systemctl status nextepc-hssd
   ...
sudo systemctl status nextepc-pcrfd
   ...

ifconfig pgwtun
pgwtun    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:45.45.0.1  P-t-P:45.45.0.1  Mask:255.255.0.0
          inet6 addr: fe80::50f6:182c:5aa3:16bb/64 Scope:Link
          inet6 addr: cafe::1/64 Scope:Global
          ...

nextepc配置我没做,都是默认值。

装完后还要增加ue,在epc电脑的http://locahost:3000,网页里配置就行,用户名admin,密码1423,参考那篇博客截图填写imsi等信息就行。

装完了nextepc要配置srsenb,下面是我的例子:

epc的ip是192.168.1.15,enb的ip是192.168.1.11。

我摘录了enb.conf的关键部分。

[enb]
enb_id = 0x19B
cell_id = 0x01
phy_cell_id = 1
tac = 0x3039 #0x0007
mcc = 001
mnc = 01
mme_addr = 192.168.1.15 #127.0.1.100
gtp_bind_addr = 192.168.1.11 #127.0.1.1
s1c_bind_addr = 192.168.1.11 #127.0.1.1
n_prb = 25
#tm = 4
#nof_ports = 2

可以看到要改tac, mme_addr, gtp_bind_addr, s1c_bind_addr。

mme_addr是局域网中epc电脑的网卡地址。gtp_bind_addr和s1c_bind_addr填写的是enb电脑的网卡ip。

如果ue要访问公网,在epc电脑上还要做一件事,要在命令行里运行如下3行。

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo iptables -t nat -A POSTROUTING -o wlp7s0 -j MASQUERADE
sudo iptables -I INPUT -i pgwtun -j ACCEPT

其中wlp7s0替换为你的连接公网的网卡名字,可以在ifconfig里查到,这一步与srsepc的srsepc_if_mask.sh差不多的,只不过nextepc没做成一个单独的脚本。

接下来我就可以试试两台enb连接局域网内的epc了。到时再看看能不能做基站切换。

这里还要插一段,作为记录。

srsepc和srsenb也可以分开在两台电脑上运行,只需要更改epc.conf和enb.conf即可。

现在192.168.1.11作为epc,192.168.1.15作为enb。

epc.conf摘录

[mme]
mme_code = 0x1a
mme_group = 0x0001
tac = 0x0007
mcc = 001
mnc = 01
mme_bind_addr = 192.168.1.11 #127.0.1.100
apn = srsapn
dns_addr = 8.8.8.8
encryption_algo = EEA0
integrity_algo = EIA1
paging_timer = 2

[spgw]
gtpu_bind_addr   = 192.168.1.11 #127.0.1.100
sgi_if_addr      = 172.16.0.1
sgi_if_name      = srs_spgw_sgi
max_paging_queue = 100

enb.conf摘录

[enb]
enb_id = 0x19B
cell_id = 0x01
phy_cell_id = 1
tac = 0x0007
mcc = 001
mnc = 01
mme_addr = 192.168.1.11 #127.0.1.100
gtp_bind_addr = 192.168.1.15 #127.0.1.1
s1c_bind_addr = 192.168.1.15 #127.0.1.1
n_prb = 50
#tm = 4
#nof_ports = 2

注意,srsepc和nextepc的mcc mnc分别是001和01,这两个项目是一样的,tac在nextepc里是0x3039,srsepc是0x0007。因此,如果srsenb要连它们,他的tac也要对应填写,否则连不上去的。

现在我用两台电脑+sdr实现了两个基站并同时接入局域网内的epc,可以实现基站切换了。

两个基站下的手机都可以访问同一台服务器。

实验视频:https://www.bilibili.com/video/av86505146/

不过目前的切换必须要重新切一下飞行模式,也就是说在一个基站覆盖范围外才有可能切到另一个基站上,这样两个基站之间的重叠区域还不知道如何处理,貌似还不是无缝切换。

你可能感兴趣的:(LimeSDR实验教程)