概述
移动设备国家代码 ( Mobile country code / MCC ) 定义于国际电信联盟 E.212 ,其目的为在电信网络中辨识用移动设备基地,特别是在全球移动通信系统和通用移动通信系统中。移动设备国家代码通常和移动设备网络代码结合使用(MCC/MNC)以用来辨试网络营运商。
移动设备国家代码是国际移动用户识别码的一部分。此识别码是用来辨认特定的用户,通常存储于可移除的SIM卡。在 GSM/UMTS 无线调制解调器中可用 AT 指令 AT+COPS 来得到目前的国家代码。
移动设备国家代码 ( Mobile country code / MCC ) 定义于国际电信联盟 E.212 ,其目的为在电信网络中辨识用移动设备基地,特别是在全球移动通信系统和通用移动通信系统中。移动设备国家代码通常和移动设备网络代码结合使用(MCC/MNC)以用来辨试网络营运商。
移动设备国家代码是国际移动用户识别码的一部分。此识别码是用来辨认特定的用户,通常存储于可移除的SIM卡。在 GSM/UMTS 无线调制解调器中可用 AT 指令 AT+COPS 来得到目前的国家代码。
操作系统调整
参考 ubuntu 16.04低延迟内核 安装低延时内核CPU
调整为最大性能模式,并且不允许降低频率。
1 2 3 4 5 6 7 8 9 10 11 |
$ 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 |
$ 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 |
$ 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 31 32 33 34 35 36 37 38 39 40 |
$ cd ~ $ git clone https://github.com/myriadrf/LimeSuite.git $ cd LimeSuite #目前的测试发现,超过这个版本的代码无法正常的发出信号, #也就是手机搜索不到我们创建好的基站, #反复研究,确认是“Commit 9883bb97 by ignasj, 2017-06-30 下午04:20” #对于“lms7_device.cpp”的修改导致的问题,原因为天线发射增益设置不正确 #解决方法参考 https://www.mobibrw.com/?p=11957 #截止目前2018.09.03版本的代码貌似已经修正这个问题了,应该已经可以正常使用了。 #测试来说,还是使用这个版本吧 $ git checkout v17.06.0 # 不可删除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 bash install.sh # Download board firmware $ sudo LimeUtil --update #固件下载地址 http://downloads.myriadrf.org/project/limesuite/ #如果上述的固件无法下载,可以从此处下载一份拷贝 #https://www.mobibrw.com/wp-content/uploads/2018/03/17.06-LimeUtils-fpga-fw.zip |
编译安装USRP
驱动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ sudo apt-get install libboost-all-dev libusb-1.0-0-dev python-mako doxygen python-docutils python-requests cmake build-essential $ cd ~ $ git clone git://github.com/EttusResearch/uhd.git $ cd uhd; mkdir host/build; cd host/build $ cmake -DCMAKE_INSTALL_PREFIX=/usr .. $ make -j4 $ sudo make install $ sudo ldconfig #下面脚本的作用是到http://files.ettus.com/binaries/images/下载最新的镜像文件,并解压缩到 /usr/share/uhd/images目录下 $ sudo /usr/lib/uhd/utils/uhd_images_downloader.py #如果上面的镜像下载失败,可以尝试执行如下命令从本站下载 # cd ~ ; wget https://www.mobibrw.com/wp-content/uploads/2018/03/uhd-images_003.010.003.000-release.zip # sudo unzip uhd-images_003.010.003.000-release.zip -d /user |
下载并解压缩需要的补丁,点击此处下载
1 2 3 4 5 6 7 |
$ cd ~ # 原始补丁地址 http://open-cells.com/d5138782a8739209ec5760865b1e53b0/opencells-mods-20170710.tgz $ wget https://www.mobibrw.com/wp-content/uploads/2018/03/opencells-mods-20170710.tgz $ tar xf opencells-mods-20170710.tgz |
下载并编译eNB
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 |
$ cd ~ $ git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git $ cd openairinterface5g $ git checkout develop #目前的补丁程序只在这个版本上是有效的,后续版本会补丁失败 $ git checkout 08b8b3142df16831396a5283a015564ff56bf91c -b ubuntu16 #应用补丁 $ git apply ../opencells-mods/eNB.patch #对于国内的用户来说,国外的几个代码地址需要修改一下,否则会出现无法下载或者下载非常慢的情况 $ sed -i "s/git clone https:\/\/gist.github.com\/2190472.git \/opt\/ssh/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/ssh.tar.gz \&\& sudo tar -zxvf ssh.tar.gz -C \/opt/g" cmake_targets/tools/build_helper $ sed -i "s/git clone https:\/\/gitlab.eurecom.fr\/oai\/asn1c.git \/tmp\/asn1c/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/asn1c.tar.gz \&\& tar -zxvf asn1c.tar.gz -C \/tmp/g" cmake_targets/tools/build_helper $ sed -i "s/https:\/\/pypi.python.org\/packages\/18\/fa\/dd13d4910aea339c0bb87d2b3838d8fd923c11869b1f6e741dbd0ff3bc00\/netifaces-0.10.4.tar.gz/https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/netifaces-0.10.4.tar.gz/g" cmake_targets/tools/build_helper $ sed -i "s/https:\/\/github.com\/google\/protobuf\/releases\/download\/v2.6.1\/protobuf-2.6.1.tar.gz/https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/protobuf-2.6.1.tar.gz/g" cmake_targets/tools/build_helper $ sed -i "s/git clone https:\/\/github.com\/protobuf-c\/protobuf-c.git/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/protobuf-c.tar.gz \&\& tar -zxvf protobuf-c.tar.gz/g" cmake_targets/tools/build_helper $ sed -i "s/http:\/\/mirrors.dotsrc.org\/gcrypt\/gnutls\/v3.1\/gnutls-3.1.23.tar.xz/https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/gnutls-3.1.23.tar.xz/g" cmake_targets/tools/build_helper $ sed -i "s/https:\/\/ftp.gnu.org\/gnu\/nettle\/nettle-2.5.tar.gz/https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/nettle-2.5.tar.gz/g" cmake_targets/tools/build_helper #修正兼容问题,更高版本的protobuf-c跟我们上面安装的版本不匹配,会导致编译错误 $ sed -i "s/cd protobuf-c/cd protobuf-c \&\& git checkout 2a46af42784abf86804d536f6e0122d47cfeea45/g" cmake_targets/tools/build_helper #执行编译 $ source oaienv $ ./cmake_targets/build_oai -I # install SW packages from internet # ./cmake_targets/build_oai -w USRP --eNB # compile eNB # 注意如果后续重新编译过limesdr的驱动,这部分也需要重新编译 $ ./cmake_targets/build_oai -c -w LMSSDR --eNB |
下载并编译EPC
(核心网)
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 |
$ git clone https://gitlab.eurecom.fr/oai/openair-cn.git $ cd openair-cn $ git checkout develop $ git checkout 724542d0b59797b010af8c5df15af7f669c1e838 -b ubuntu16 #应用补丁 $ git apply ../opencells-mods/EPC.patch #对于国内的用户来说,国外的几个代码地址需要修改一下,否则会出现无法下载或者下载非常慢的情况 $ sed -i "s/git clone https:\/\/gitlab.eurecom.fr\/oai\/freediameter.git -b eurecom-1.2.0/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/freediameter.tar.gz \&\& tar -zxvf freediameter.tar.gz \&\& cd freediameter \&\& git checkout eurecom-1.2.0 \&\& cd ../g" build/tools/build_helper $ source oaienv; cd scripts #安装依赖的软件,库 $ ./build_hss -i # Do you want to install freeDiameter 1.2.0 ?<y/N>: yes # 其他具体情况自行处理 #对于国内的用户来说,国外的几个代码地址需要修改一下,否则会出现无法下载或者下载非常慢的情况 $ sed -i "s/git clone git:\/\/git.osmocom.org\/libgtpnl/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/libgtpnl.tar.gz \&\& tar -zxvf libgtpnl.tar.gz/g" ../build/tools/build_helper #Install 3PP SW for mme and spgw $ ./build_mme -i # Do you want to install freeDiameter 1.2.0 ?<y/N>: no # Do you want to install asn1c rev 1516 patched? <y/N>: no # Do you want to install libgtpnl ? <y/N>: yes # 其他具体情况自行处理 $ ./build_spgw -i # Do you want to install libgtpnl ? <y/N>: no #调整mme的编译模板,默认情况下mme编译出来的是Debug版本, #但是这会触发"src/gtpv2-c/nwgtpv2c-0.11/src/NwGtpv2c.c"的断言异常 #”mme: ~/openair-cn/src/gtpv2-c/nwgtpv2c-0.11/src/NwGtpv2c.c:487: nwGtpv2cCreateLocalTunnel: Assertion `0' failed.“ #这个断言异常并不是大问题,直接无视即可 #因此我们把此处的编译调整为RelWithDebInfo $ sed -i "s/\"Debug\"/\"RelWithDebInfo\"/g" ../build/mme/CMakeLists.template #修正代码里面的几处问题 $ sed -i "s/while 0/while (0)/g" ../src/utils/log.h $ sed -i 's/char[ \t]*pid_dec\[32]/char pid_dec\[128]/g' ../src/utils/pid_file.c #正式进行编译操作 $ ./build_hss -c -v $ ./build_mme -v $ ./build_spgw -v |
配置EPC
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 |
# 拷贝配置文件 $ cd ~ $ sudo mkdir -p /usr/local/etc/oai $ sudo cp -rp opencells-mods/config_epc/* /usr/local/etc/oai # 生成证书文件 $ cd openair-cn; source oaienv; cd scripts $ ./check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter hss.OpenAir5G.Alliance $ ./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter mme.OpenAir5G.Alliance # 配置出口网卡的名字,这个网卡用于访问互联网的时候使用 # 如果只有一块有线网卡,并且用这块有线网卡上网,则使用如下命令即可拿到网卡名 # `ifconfig | grep "Link" | awk '{print $1}' | grep "en"` # 其他情况请根据实际情况配置网卡 $ sudo sed -i "s/PGW_INTERFACE_NAME_FOR_SGI.*/PGW_INTERFACE_NAME_FOR_SGI = \"`ifconfig | grep "Link" | awk '{print $1}' | grep "en"`\";/g" /usr/local/etc/oai/spgw.conf # 配置访问MySQL时候的密码,"/usr/local/etc/oai/hss.conf",此处假定MySQL的密码为"123" $ sudo sed -i "s/^MYSQL_pass.*/MYSQL_pass = \"123\"/g" /usr/local/etc/oai/hss.conf #导入数据库,建立表结构 $ ./hss_db_import 127.0.0.1 root 123 oai_db ~/opencells-mods/opencells_db.sql |
修改我们UE
需要使用的配置文件
1 2 3 4 5 6 7 8 |
$ cd ~ $ cd openairinterface5g; source oaienv #配置文件为"targets/PROJECTS/GENERIC-LTE-EPC/CONF/"目录下的包含lmssdr的配置文件 $ sed -i "s/mobile_network_code.*/mobile_network_code = \"92\";/g" ./targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.lmssdr.conf $ vim ./targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.lmssdr.conf |
找到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
////////// MME parameters: mme_ip_address = ( { ipv4 = "192.168.12.148"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.150/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.150/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; |
替换为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
////////// MME parameters: mme_ip_address = ( { ipv4 = "127.0.0.20"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.10/8"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.10/8"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; |
测试功能,按照顺序打开四个独立Shell
1 2 3 4 5 6 7 8 9 10 |
$ echo -ne "\033]0;HSS\007" $ cd ~ $ cd openair-cn; source oaienv; cd scripts; #貌似需要运行之前先清理一下数据库才行,否则可能导致设备无法入网,应该是个BUG $ ./hss_db_import 127.0.0.1 root 123 oai_db ~/opencells-mods/opencells_db.sql $ ./run_hss |
1 2 3 4 5 6 7 |
$ echo -ne "\033]0;MME\007" $ cd ~ $ cd openair-cn; source oaienv; cd scripts; $ ./run_mme |
1 2 3 4 5 6 7 |
$ echo -ne "\033]0;SPGW\007" $ cd ~ $ cd openair-cn; source oaienv; cd scripts; $ sudo -E ./run_spgw |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ echo -ne "\033]0;EUE\007" $ cd ~ $ cd openairinterface5g; source oaienv #配置文件为"targets/PROJECTS/GENERIC-LTE-EPC/CONF/"目录下的包含lmssdr的配置文件 #这个配置文件跟天线的接入方式直接相关,天线接入的是主板上的RX1_H,TX1_2这两个天线接口 #最后的-d 参数是启动图形界面分析流量 $ sudo -E ./cmake_targets/lte_build_oai/build/lte-softmodem -O ./targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.lmssdr.conf --rf-config-file ./targets/ARCH/LMSSDR/LimeSDR_above_1p8GHz_1v4.ini -d #如果启动之后,出现 “[PHY][E]TX : Timeout (sent 6800/7680)” 这样的红色内容,然后退出,可以多尝试几次,一般就可以恢复正常了 |
正常启动之后,用手机(比如华为荣耀7)搜索运营型,可以找到一个名为20892
的运营商,或者有些欧洲制式的手机可以正确的显示Eurecom
这个法国电信运营商的名字。
(updated: 2017, July 10th)
Modifs since version on July 6th:
This document explains how to install and configure OAI EPC+eNB on one single Ubuntu 17.04 64 bits machine connected with a regular UE (a Huawei E3272), routing the UE traffic to internet.
We use EPC after a major contribution in May 2017: a lot of code has been modified, all directories names were changes, configuration parameters names/values changed.
The description uses a USRP B210 board, a Lime SDR page is provided separately.
We also explain how to simplify, fix existing issues, to make a single computer as a full LTE network: EPC+eNB.
Known limitations fixed in the hereafter description
继续阅读OpenAir, single machine Ubuntu 17.04, after major EPC update
前几天从github
下载代码的时候,一直失败,提示如下:
1 2 3 4 5 6 7 |
$ git clone http://github.com/myriadrf/LimeSuite.git 正克隆到 'LimeSuite'... remote: Counting objects: 13921, done. error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received. fatal: The remote end hung up unexpectedly fatal: 过早的文件结束符(EOF) fatal: index-pack failed |
如果操作系统的语言是英文的话,输出如下内容:
1 2 3 4 |
error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received. fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed |
刚刚开始以为是由于GnuTLS
的BUG
导致的。
当时的解决方法是翻墙出去进行克隆。或者用Windows
进行克隆操作。
然而,从最近的新闻来看,更像是遭受了攻击导致的。
操作系统调整
参考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源代码下载
在某些特殊环境中,比如音视频实时处理(比如MIDI),无线电数据的编解码(比如 OpenAirInterface 明确要求使用低延时内核)等情况下,我们希望系统尽可能的实时,同时又不会降低太多的性能(实时性越高,性能,功耗等的损失越大)。这种情况下,我们可以尝试使用低延时内核。
Linux
提供了五种内核类型,对于内核类型的选择,可以参考如下的解释:
*******************************************
*******************************************
目前(2018.02)为止,ubuntu
官方库中提供前四种内核,我们一般建议使用lowlatency
版本。可以使用如下命令安装:
1 2 3 4 5 6 7 8 |
$ sudo apt-get install linux-lowlatency $ sudo apt-get install linux-image-`uname -r | cut -d- -f1-2`-lowlatency $ sudo apt-get install linux-headers-`uname -r | cut -d- -f1-2`-lowlatency # 重启加载新内核 $ sudo reboot |
目前,如果机器上使用了nvidia
显卡,并且使用nvidia
的闭源驱动的情况下,重启机器会无法进入图形界面,查看系统日志,出现如下错误信息:
1 2 |
$ cat /var/log/syslog | grep dkms Feb 28 16:23:01 xx-System-Product-Name gpu-manager[831]: Error: can't open /lib/modules/4.13.0-36-lowlatency/updates/dkms |
解决方法如下:
1 2 3 |
#目前最新版本驱动是384版本,如果使用的其他版本,请配置使用的版本 $ sudo dpkg-reconfigure nvidia-384 |
注意,使用sudo apt-get dist-upgrade
升级内核的时候,内核会被替换成generic
版本,低延时内核需要手工重新安装一遍。
最近在使用LimeSDR
捣鼓软件定义无线电,结果在刷新固件的过程中,莫名失败,导致无法识别硬件。
使用LimeUtil
检查硬件,出现如下结果:
1 2 |
$ sudo ./LimeUtil --find * [WestBridge , media=USB 2.0, module=STREAM, addr=04b4:00f3, serial=0000000004BE] |
之后就再也无法通过
1 |
$ sudo ./LimeUtil --update |
更新固件了,一直失败。
泰勒公式是将一个在x=x0处具有n阶导数的函数f(x)利用关于(x-x0)的n次多项式来逼近函数的方法。
若函数f(x)在包含x0的某个闭区间[a,b]上具有n阶导数,且在开区间(a,b)上具有(n+1)阶导数,则对闭区间[a,b]上任意一点x,成立下式:
其中,表示f(x)的n阶导数,等号后的多项式称为函数f(x)在x0处的泰勒展开式,剩余的Rn(x)是泰勒公式的余项,是(x-x0)n的高阶无穷小。
这里需要注意的是,我们规定0的阶乘 " 0!=1 "。
在编写Chrome
扩展的时候,我们需要修改一个input
控件的内容,并且在内容修改完成后,需要触发控件的onFocus
,onBlur
事件,在这两个事件中,网页有相关的处理逻辑。
使用如下代码修改input
控件的内容的时候,没有正确的触发焦点变化事件:
1 2 3 4 |
var inputElement = document.getElementsByTagName("inputTagName"); inputElement.focus(); inputElement.value="123456"; inputElement.blur(); |
经过Google
发现,原来不能直接调用控件的事件函数,直接调用控件事件函数会导致事件流程不正确,尤其是网页使用Kissy
,JQuery
框架的时候,可能导致框架内部流程异常。
应当通过发送事件的方式,驱动整个框架的运行,代码如下:
1 2 3 4 5 6 7 8 |
var inputElement = document.getElementsByTagName("inputTagName"); var focusEvent = document.createEvent("HTMLEvents"); focusEvent.initEvent("focus", true, true); inputElement.dispatchEvent(focusEvent); inputElement.value="123456"; var blurEvent = document.createEvent("HTMLEvents"); blurEvent.initEvent("blur", true, true); inputElement.dispatchEvent(blurEvent); |
同样的道理适用于change
事件触发的情况:
1 2 3 4 |
var inputElement = document.getElementsByTagName("inputTagName"); var changeEvent = document.createEvent("HTMLEvents"); changeEvent.initEvent("change", true, true); inputElement.dispatchEvent(changeEvent); |
最近WordPress
上使用的WP Statistics
打开的时候,整个网站都几乎处于卡顿的状态,无法正常访问。
使用top
命令发现主要是mysqld
的CPU
占用很高。于是使用mytop
分析当前执行的查询语句,发现主要是在查询wp_statistics_visitor
表导致的问题(我设置了不要删除浏览记录,因此会导致表内数据偏多)。
大致估计是由于分配给MySQL
的内存不足导致频繁的磁盘交换引起的性能问题。
解决方法比较简单,就是增大MySQL
可以使用的内存即可。
首先确认服务器上的MySQL
使用的存储引擎是否为Innodb
(缺省情况下已经是Innodb
了):
1 |
$ mysql -p -e "show variables like '%storage_engine%';" |
如果确定是Innodb
,则查询Innodb
被限制使用的内存大小,如下:
1 |
$ mysql -p -e "SELECT @@innodb_buffer_pool_size;" |
默认情况下是128MB
,鉴于内存已经不够了,我们扩大到256MB
,这部分内存原则上越大越好,越大与磁盘的交互越少,性能越高。
如下命令调整Innodb
的内存:
1 |
$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf |
在[mysqld]
部分增加(如果存在则修改):
1 |
innodb_buffer_pool_size = 256M |
然后重启MySQL
服务:
1 |
$ sudo service mysql restart |
上面的调整之后,性能提升还是比较明显的。