操作系统调整
参考ubuntu 16.04低延迟内核安装低延时内核
CPU
调整为最大性能模式,并且不允许降低频率
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo apt-get install cpufrequtils $ sudo touch /etc/default/cpufrequtils $ sudo sed -i "/GOVERNOR.*/d" /etc/default/cpufrequtils $ test -s /etc/default/cpufrequtils && sudo sed -i '$a\GOVERNOR=\"performance\"' /etc/default/cpufrequtils || echo "GOVERNOR=\"performance\"" | sudo tee /etc/default/cpufrequtils $ sudo update-rc.d ondemand disable $ sudo reboot |
安装依赖包
1 2 |
$ sudo apt-get install cmake g++ libpython-dev python-numpy swig git libsqlite3-dev libi2c-dev libusb-1.0-0-dev libwxgtk3.0-dev freeglut3-dev |
编译安装SoapySDR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ cd ~ $ git clone https://github.com/pothosware/SoapySDR.git $ cd SoapySDR $ git pull origin master $ mkdir build && cd build $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig |
编译安装LimeSDR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ cd ~ $ git clone https://github.com/myriadrf/LimeSuite.git $ cd LimeSuite # 再次更新一下,确保代码到最新 $ git pull # 不可删除build目录,清理build目录后要还原被误删除的文件, # 原因在于build目录下存在mcu程序,默认应用启动后从这个目录提取mcu程序刷新到设备 $ mkdir build ; cd build # cmake -DCMAKE_BUILD_TYPE=Debug .. $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig $ cd ../udev-rules/ $ sudo ./install.sh # Download board firmware $ sudo LimeUtil --update |
编译安装srsGUI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ cd ~ # srsGUI提供了一个软件示波器的功能,我们可以比较直观的观察到波形信息 $ git clone https://github.com/srsLTE/srsGUI.git $ cd srsGUI # 再次更新一下,确保代码到最新 $ git pull $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig |
编译安装srsLTE
1 2 |
$ sudo apt-get install git cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libboost-thread-dev libconfig++-dev libsctp-dev |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ cd ~ $ git clone https://github.com/srsLTE/srsLTE.git $ cd srsLTE # 再次更新一下,确保代码到最新 $ git pull # 目前(2018.05.04)以及之前的代码中srsenb/src/upper/rrc.cc文件中 # uint32_t rrc::generate_sibs() 函数中存在一个数组越界问题, # 已经提交patch ,具体修改 # 参看https://github.com/srsLTE/srsLTE/pull/173 # 调用LimeSDR设备的代码在 lib/src/phy/rf/rf_soapy_imp.c 文件中 # 这个文件中默认的接收天线是"LNAH",默认的发送天线是"BAND1",需要根据实际情况 # 也就是自己天线接入的接口是哪个,就修改成哪个。 # 调整这里的参数,目前是直接修改代码。比如我这边的发送天线就修改为"BAND2" $ mkdir build $ cd build # cmake -DCMAKE_BUILD_TYPE=Debug .. $ cmake ../ $ make $ make test |
测试
1 2 3 4 5 6 7 8 9 10 |
$ cd ~/srsLTE $ cd build/lib/examples #以20M带宽的形式进行基站的扫描,LTE基站带宽20M,目前版本测试不支持,无法扫描到基站 # ./cell_search -b 20 #目前测试仅支持此命令的运行 $ ./pdsch_enodeb |
搭建LTE
测试环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
$ cd ~/srsLTE $ mkdir lteCell $ cd lteCell # 生成配置文件 $ mkdir lteENB $ cp ../srsenb/enb.conf.example lteENB/enb.conf $ cp ../srsenb/rr.conf.example lteENB/rr.conf $ cp ../srsenb/sib.conf.example lteENB/sib.conf $ cp ../srsenb/drb.conf.example lteENB/drb.conf $ mkdir lteEPC $ cp ../srsepc/epc.conf.example lteEPC/epc.conf $ cp ../srsepc/user_db.csv.example lteEPC/user_db.csv # 生成运行脚本 $ echo "echo -ne \"\033]0;ENB\007\"" >> run_enb.sh $ echo "cd lteENB" >> run_enb.sh # 需要gdb的话使用如下 #echo "#gdb -args ../../build/srsenb/src/srsenb enb.conf" >> run_enb.sh $ echo "../../build/srsenb/src/srsenb enb.conf" >> run_enb.sh $ echo "echo -ne \"\033]0;EPC\007\"" >> run_epc.sh $ echo "cd lteEPC" >> run_epc.sh # 需要配置如下转发规则,否则不能正常工作,配置信息参考openair-cn的SPGW中的代码 # sudo sysctl -w net.ipv4.ip_forward=1 # sudo sync # sudo iptables -t mangle -F FORWARD # sudo iptables -t nat -F POSTROUTING # export LANG=C # 如果没有修改过配置文件,则默认使用如下配置即可, # 如果修改过sgi_if_addr的地址(默认sgi_if_addr=172.16.0.1),需要更改这个字段 # export FORDING_IPs=172.16.0.0/12 # 有线网卡一般以"en"开头,比如"enp3s0",此处需要根据自身机器上的网卡进行设置,修改 # export NIC_NAME=`ls /sys/class/net | grep en` # export NIC_IP=`ifconfig $NIC_NAME | grep 'inet addr:' | awk '{print $2}' | cut -c 6-` # sudo iptables -t nat -I POSTROUTING -s $FORDING_IPs -o $NIC_NAME ! --protocol sctp -j SNAT --to-source $NIC_IP $ echo "sysctl -w net.ipv4.ip_forward=1" >> run_epc.sh $ echo "sync" >> run_epc.sh $ echo "iptables -t mangle -F FORWARD" >> run_epc.sh $ echo "iptables -t nat -F POSTROUTING" >> run_epc.sh $ echo "export LANG=C" >> run_epc.sh $ echo 'export FORDING_IPs=172.16.0.0/12' >> run_epc.sh $ echo 'export NIC_NAME=`ls /sys/class/net | grep en`' >> run_epc.sh $ echo "export NIC_IP=\`ifconfig \$NIC_NAME | grep 'inet addr:' | awk '{print \$2}' | cut -c 6-\`" >> run_epc.sh $ echo 'iptables -t nat -I POSTROUTING -s $FORDING_IPs -o $NIC_NAME ! --protocol sctp -j SNAT --to-source $NIC_IP' >> run_epc.sh $ echo "../../build/srsepc/src/srsepc epc.conf" >> run_epc.sh $ echo "gnome-terminal -e \"bash run_epc.sh\"" >> run.sh $ echo "sleep 2" >> run.sh $ echo "gnome-terminal -e \"bash run_enb.sh\"" >> run.sh # 运行测试 $ sudo bash run.sh #日志查看 /tmp/enb.log, /tmp/epc.log |
如果设备(比如手机)的设置是按照ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境里面的设置的,设备参数如下图:
注意上图与OpenAirInterface中设置的不同之处,差别就是一个选中OPC,一个选中OP
则需要对配置文件进行如下调整:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ cd ~/srsLTE/lteCell # 修改MNC,MCC $ sed -i -r "s/^mnc[ \t]*=[ \t0-9]*/mnc = 92/g" lteENB/enb.conf $ sed -i -r "s/^mcc[ \t]*=[ \t0-9]*/mcc = 208/g" lteENB/enb.conf $ sed -i -r "s/^tac[ \t]*=[ \t]*0x[0-9]*/tac = 0x0001/g" lteENB/enb.conf $ sed -i -r "s/^mnc[ \t]*=[ \t0-9]*/mnc = 92/g" lteEPC/epc.conf $ sed -i -r "s/^mcc[ \t]*=[ \t0-9]*/mcc = 208/g" lteEPC/epc.conf $ sed -i -r "s/^tac[ \t]*=[ \t]*0x[0-9]*/tac = 0x0001/g" lteEPC/epc.conf # 修改认证加密算法 $ sed -i -r "s/^auth_algo[ \t]*=[ \ta-Z]*/auth_algo = milenage/g" lteEPC/epc.conf # 需要软件示波器界面的话,修改 lteEPC/epc.conf 里面的 [gui]部分的enable = true # 但是打开示波器会导致CPU开销加大,降低实时性,稳定性变低 # 认证数据库中增加Name,IMSI,Key,OP,AMF,SQN 这里主要的就是IMSI,Key,OP这几个参数 # OPc=AES128(Ki,OP) XOR OP 因此需要反算 OP # openair-cn需要OPc,而 srsLTE 的epc需要 OP 这是两者的主要区别 # OPc = 504f20634f6320504f50206363500a4f # Ki = 6874736969202073796d4b2079650a73 # OP = 11111111111111111111111111111111 # 最后的 SQN 目前测试发现如果一直不能正常注册,并且提示 # "Sequence number synch failure" 则会观察到,当EPC退出时候,应用一定回写 # 成000000001b02 ,一旦出现这个数字,我们就没办法注册设备了。应该是个BUG # http://www.mobibrw.com/?p=12688 中我们持续跟进这个问题,目前猜测是要比设备最后 # 一次通信记录的数据号大就可以了,如果要复位可以让设备关机,应该就从0开始了。 $ sed -i '$a\ue3,208920100001100,6874736969202073796d4b2079650a73,11111111111111111111111111111111,8000,000000001b03' lteEPC/user_db.csv |
注意目前srsLTE的CPU开销远远高于OpenAirInterface,差不多一个内核满负载,以及稳定性是低于OpenAirInterface的,经常出现连接困难以及中途掉线,这部分需要后续的持续修改。目前测试发现,在"lteEPC/epc.conf"中关闭GUI的显示,可以显著减低CPU开销,并增加稳定性,但是还是比OpenAirInterface要多消耗CPU。另外在"lteEPC/epc.conf"中日志设置成"all_level = none"也可以降低CPU开销,并且增加稳定性。
另外,注意"/tmp/enb.log",这个日志文件默认情况下,写入的比较多,文件大小增长很快,注意磁盘占用情况。
目前测试发现,使用Intel MKL加速的情况下,CPU降低并不明显,而稳定性下降非常多应该是代码的适配问题。因此,暂时不要使用Intel MKL。
目前测试发现,使用最新的FFTW3版本,使用AVX,AVX2加速的情况下,CPU开销更高,性能更差,应该是代码存在BUG。因此,暂时不要使用自己编译的FFTW3,使用系统自带的版本即可。
手机等设备的设置参考ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境最后的介绍。
上述的代码如果下载困难,可以从本站下载一份拷贝。
SoapySDR源代码下载
LimeSuite源代码下载
srsLTE源代码下载
srsGUI源代码下载
fftw3源代码下载
博主请问下,这个支持实物手机连接入srsenb基站吗?
另外,如果要使用srsUE,是不是得需要两个SDR设备?
博主请问下,这个支持实物手机连接入srsenb基站吗?
另外,如果要使用srsUE,是不是得需要两个SDR设备?
支持手机连接的,并且实验成功的。
好的,谢谢博主!
博主你好,请问是否按照上述基站和epc配置好,启动enb和epc,就能实物手机连接了吗?还是有其他操作,麻烦您告知,谢谢!
真实手机是可以正常使用的
博主,您好!
只要按照您这上面说的操作,启动基站和epc,就能够拿自己的手机找到该基站并连接成功?
谢谢!
手机需要使用测试卡,参照测试使用的手机卡的配置部分,启动基站之后,如果不使用测试卡,能找到这个基站,但是不能认证成功。主要是密钥的问题,运营商不会把密钥给泄露出来的,只能自己配置一个密钥才能进行通信,这就是为什么需要自己买空白手机卡,然后自己写卡的原因。
好的,非常感谢!
博主,您好!
还有个问题请教下您,我用的是B200设备,按照上述配置运行后,我用自己的华为P30手机手动搜索运营商,找不到该基站,这个配置里面的ip(172.16.0.0)这些应该不需要改吧 ,你们测试时找到的基站名称是啥,您能帮忙分析下为什么找不到基站的原因大概是什么吗?谢谢啦
参考图片 https://www.mobibrw.com/wp-content/uploads/2018/03/Screenshot_2018-03-27-14-36-36-533_com.android.phone_.png
手机配置参考 ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境
谢谢博主!
再请教个问题,2个srsue能否两个在当前环境上实现互通呢?有咩有做个类似的实验
两个UE的互通测试没有测试,当时主要测试上网问题,没有测试通话,不过,官方演示里面有通话演示。
请问一下博主,可以用两台设备(一台运行enb,一台运行ue)模拟出多enb多用户的场景吗?(就是能不能只用设备模拟运行多个ue,如何操作),谢谢
其实是有问题的,原因不仅仅在于系统的性能,更关键的在于实时性的要求,操作系统不是实时系统,上面运行的任务太多,导致信号收发的时候,即使是单ENB,单UE的情况下,都会发生大量的延迟,导致数据包丢失,错乱。
即使解决实时性问题,原理上,单台电脑的吞吐也没办法跟基带硬件芯片来比较的,应该是远远达不到基带芯片的性能。
这里主要是基带芯片已经特化,专门针对需求来设计硬件,设计算法,专用芯片的性能在特定领域是非常恐怖的。
FPGA芯片比PC更好一些,但是难度更大。
现在开源的基带协议,验证功能的意义远远大于实用意义。这也是为什么基带芯片开发非常困难的主要原因,能用,跟好用,商用,差很远啊。
can I use ubuntu 18.04
you can try this, I do'nt test this on ubuntu 18.04.