OaisimWithS1搭建笔记(2019.5)

0 前言

0.1 写作起因

  • 笔者做毕业设计需要搭建OAI仿真环境,由于没有通用无线电外设,因此选择了OAISIM。主要参考OAI官网Wiki上的一篇教程:HowtorunoaisimwithvirtualMMEonsamemachine 。虽然笔者严格按照教程来做,但还是遇到了不少问题,因此将自己的搭建经验分享给像我这样的初学者。
  • 本篇教程写的比较详细,对搭建其他OAI仿真版本也或有一些启发作用,希望能帮助大家尽快搭建好仿真环境,将精力尽早投入到学习更加深入的理论知识中去。

0.2 学习建议

  • 如果是像我这样小白从零入门,开始还对LTE技术还不了解,可以下载我上传的资源——“LTE学习资料”,先看一下我整理的笔记或是《LTE教程:原理与实现 [孙宇彤]》第一章即可。
  • 如果对linux相关知识不太了解,可以去看菜鸟教程-linux教程,非常适合入门。
  • 如果对git相关的知识不了解,可以去看廖雪峰的官方网站-Git教程,站主自称“史上最浅显易懂的Git教程”。
  • 笔者搭建过程中很多问题的解决是受官方讨论邮件列表中的启发,如果实在有些问题不能解决不妨去邮件列表中看看有没有前人遇到过。如何订阅邮件列表可以参考“如何加入OAI邮件列表”,实际上我订阅了也很少查看,只有在遇到问题后才去官网检索查阅邮件列表。

0.3 OAI理解

0.3.1 OAI概述
  • OpenAirInterface平台是由Eurocom(欧洲通信组织)开发的开源实时仿真平台,其架构严格按照3GPP协议设计,使用标准C语言基于Linux实时内核优化完成,通过提供各种不同的仿真场景和完整的通信系统功能分层,最大限度地减少计算机模拟和实际硬件实验之间的差距。
  • OAI项目是用标准C语言编写的,C语言源代码要经过编译、优化、汇编和链接才能生成可执行程序。由于源文件非常多,开发者就编写了一些shell脚本(AutoBuildScripts)可以自动完成整个生成可执行程序的过程。AutoBuildScripts包括build_epc、build_hss、build_oai等,使用者只需要选择不同的选项,就可以执行不同命令,如对于build_oai,-h选项是显示所有的可选选项,-i是安装依赖软件包,–oaisim是搭建OAISIM仿真版本。
    在这里插入图片描述
0.3.2 openair-cn
  • openair-cn工程是对LTE核心网EPC的仿真,主要由 HSS(Home Subscriber Server,归属用户服务器)、MME(Mobility Management Entity,移动管理实体)、SGW(Serving Gateway,服务网关)、PGW(PDN Gateway,PDN 网关)等网元构成。
  • openair-cn工程项目在v0.3.2版本及其之前,HSS网元单独搭建,MME、SGW和PGW三个网元合在一起搭建;v0.3.2版本之后HSS网元单独搭建,MME网元单独搭建,SGW和PGW两个网元合在一起搭建。
0.3.3 openairinterface5g
  • openairinterface5g工程是对LTE无线系统的仿真,包括基站侧和终端侧。实际操作时,可根据需求通过变换编译选项,将项目编译成eNodeB(基站侧)或者 UE(终端侧)。openairinterface5g主要由三部分组成:
    openair1:包含PHY层和相关参数的定义,主要功能是实现基带信号处理,并为MAC层提供接口;
    openair2:包括OSI参考模型中的第2层(MAC、RLC、PDCP)和无线资源控制层的实现,主要功能是实现媒介访问协议;与openair1通过PHY层的接口组成了LTE无线通信系统的基本特征;
    openair3:包含使用IP协议的网络模块,主要功能是为应用程序提供了接口,使整个平台更加完整和实用,这意味着该平台可以用来研究新的技术,实现更多的应用。
  • openairinterface5g工程项目的OAISIM仿真在v0.6.1版本及其之前属于“old oaisim”,在v0.6.1版本之后变成了“new oaisim”,两者的搭建方法不一样,我搭建的是“old oaisim”。
0.3.4 OAI版本
  • 按照时间线,随着开发人员不断地修复一些问题或更新一些功能,存在着很多分支和标签的版本。
  • 按照仿真需求,OAI工程项目提供了不同的编译选项,可以搭建不同的仿真版本(或者称为“应用场景”)。主要有以下几个:
    (1)主流版本:是EPC+eNB+UE最完整的仿真,需要用到通用无线电外设(如USRP B210),可与商用设备对接,也就是将EPC、eNB和UE三者任意一个换成商用的设备都是可以的,比较常见的是“仿真EPC+仿真eNB+商用终端(我们用的手机)”的部署方案;
    (2)OAI系统仿真:即为被广泛熟知的OAISIM,可以提供完整物理层和无线电信道仿真,执行完整的协议,可以模拟出使用硬件外设的效果,并能虚拟出若干eNB和UE。OAISIM既可以只仿真eNB+UE(OAISIM without S1),也能仿真EPC+eNB+UE(OAISIM with S1)的完整LTE网络。应该注意,OAISIM是openairinterface5g通过相应的编译选项生成的仿真版本,只包括eNB和UE,若要搭建OAISIM with S1,还需单独下载openair-cn工程去搭建EPC,EPC和eNB之间通过S1接口连接,这也是我选择的仿真方式。
    (3)L2 nFAPI仿真:该模拟器允许使用nFAPI接口测试L2及以上的层。
    (4)物理层仿真:可以测试空中接口上各种物理信道的性能。

1 预备工作

1.1 安装ubuntu14.04.1

  • ubuntu14.04.1默认核心是3.19.0-25-generic,可满足某些依赖软件的要求,不需要切换核心。
  • 官网教程上作者好像是在VM虚拟机上搭建的,我是安装了Win10+Ubuntu14.04.01双系统。
  • 本教程的OAISIM仿真,EPC+OAISIM部署在一台电脑上,不需要用到SDR射频模块,因此一台Intel i5处理器的笔记本就可以搞定。

1.2 切换软件源

  • 可以使用阿里源或中科大源,下载速度比较快。
  • 不熟悉命令的,可以在“设置——>软件和更新”里面选择软件源,比较方便。

1.3 安装右键终端

sudo apt-get install nautilus-open-terminal  
#安装后注销再登录即可

1.4 安装搜狗拼音输入法

sudo gedit /etc/apt/sources.list.d/ubuntukylin.list
--------------------------------------------------
#添加ubuntu kylin的apt源
deb http://archive.ubuntukylin.com:10006/ubuntukylin trusty main 
--------------------------------------------------
sudo apt-get update  
sudo apt-get install sogoupinyin 
#安装后重启即可

1.5 安装git、unrar

sudo apt-get install git unrar

1.6 一些依赖软件下载思路

  • 搭建OAI仿真平台时总是需要执行“AutoBuildScripts -i”去下载和安装一些依赖的软件,有些软件是下载速度非常慢,甚至等了半个小时后就失败了。
  • 因此,遇到远程下载软件包失败时,我的解决方法是:
    (1)在“AutoBuildScripts”中查看软件包下载网址并将下载软件包的语句注释掉,然后在Windows上想办法下载好;
    (2)在Ubuntu上将软件包放到“AutoBuildScripts”中指明的文件路径中;
    (3)最后再执行“AutoBuildScripts -i”即可。

1.7 配置FQDN【必须】

FQDN(Fully Qualified Domain Name,全限定域名):

  • 同时带有主机名和域名的 URL,通过符号“.”连接。通过FQDN可以看出主机在域名树中的位置,从逻辑上准确的指出主机在什么地方。
  • FQDN 总是以主机名开始且以顶级域名结束,例如,www.symantec.com 是完全限定域名,其中 www 是主机,symantec 是二级域,.com 是顶级域。
  • DNS(域名系统)可以将FQDN解析为IP地址。

配置过程

#cty是我的姓名简拼,可以修改成任意其他字符串,但是后面再出现“cty”时一定要对应修改。
#1 修改主机名
sudo gedit /etc/hostname
--------------------------------------------------
cty
--------------------------------------------------
#2 修改FQDN
sudo gedit /etc/hosts
--------------------------------------------------
127.0.0.1 localhost
127.0.1.1 cty.openair4G.eur cty
--------------------------------------------------
#修改好FQDN后最好重启一下
hostname  #查看主机名
hostname -f  #查看FQDN

2 安装开发软件

说明:运行“OAI的自动编译脚本的安装依赖软件选项”时也可以安装以下软件,不过我建议自己先手动安装好。

2.1 mysql-server

关系梳理

  • mysql-server:数据库服务器
  • mysql-devel:开发用到的库以及包含文件
  • mysql:客户端

安装过程

sudo apt-get install mysql-server
#注意要设置密码(建议设为"linux"),不要设置空密码!

2.2 apache2

Apache(Apache HTTP Server的简称):

  • Apache软件基金会的一个开放源码的网页服务器。
  • 它可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。
  • 它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。

安装过程

sudo apt-get install apache2
#测试apache2:
浏览器访问 localhost(或127.0.0.1) 会出现apache2主页 (注:不可开VPN,否则不会出现)

2.3 php

PHP(PHP: Hypertext Preprocessor,超文本预处理器):

  • 一种主要适用于Web开发领域的通用开源脚本语言。
  • PHP混合了C、Java、Perl以及PHP自创的语法,利于学习,使用广泛。
  • PHP可以更加快速地执行动态网页。它是将程序嵌入到HTML(超文本标记语言)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

安装过程

sudo apt-get install python-software-properties
sudo apt-get update
sudo apt-get install php5
php5 -v    #查看 php版本
sudo service apache2 restart
#测试php:
sudo gedit /var/www/html/info.php
--------------------------------------------------
<?php
echo "<P>Hello World!</P> "?>
--------------------------------------------------
保存退出,然后浏览器访问 localhost/info.php,浏览器会显示hello world页面(不可挂VPN!)

2.4 mysql

安装过程

sudo apt-get install mysql-server mysql-client
#测试mysql:
mysql -u root -p  #输入安装mysql时设置的root密码,会出现mysql操作界面
exit  #退出mysql

2.5 phpmyadmin

phpMyAdmin

  • phpMyAdmin 是一个以PHP、Web为基础的架构在网站主机上的MySQL的数据库管理工具,可以让用户在网页上管理MySQL数据库。
  • 通过网页管理,简化了输入SQL语法的繁杂过程,尤其在处理大量资料的汇入及汇出更为方便。
  • 一个更大的优势在于可以远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。

安装过程

#安装过程中要输入上文设置的mysql密码,好像要输入三次
sudo apt-get install phpmyadmin
sudo ln -s /usr/share/phpmyadmin /var/www/html
#测试phpmyadmin:
浏览器访问 localhost/phpmyadmin(或 127.0.0.1/phpmyadmin)会显示数据库登录页面

#如果报错:mbstringextension is missing.Please check your PHP configuration. 
#解决办法如下:
sudo gedit /etc/php/7.0/mods-available/json.ini
#把文件里第二行的分号去掉,保存退出,重启网络:
sudo service apache2 restart

3 下载openair-cn和openairinterface5g

3.1 使用git下载

  • 官方给的方法,需要注册gitlab账号,而且不科学上网的话下载速度非常慢。
cd ~  #下载到home/username路径下
#下载openair-cn
git clone https://gitlab.eurecom.fr/oai/openair-cn.git
#下载openairinterface5g
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git

3.2 我的下载方法

4 构建EPC模块

4.1 切换分支和安装依赖软件包

cd ~

#官网教程上没有下面这条命令,我在后面编译MME时执行“~/openair-cn/SCRIPTS/build_epc -c -l”命令后出现了“mme_gw compilation failed”的错误,查看编译日志文档“~/openair-cn/BUILD/LOG/mme_gw.txt”看到“权限不够”的字样,是由于部分文件缺少权限导致的,因此在这里给openair-cn工程下的所有文件都添加全部权限,MME就编译成功了。
sudo chmod -R 777 openair-cn    #为所有文件添加全部属性

cd ~/openair-cn    
git checkout v0.3.2    #使用的是旧版本的openair-cn

source oaienv    #在当前shell中添加OAI环境变量
cd SCRIPTS
#安装依赖的软件包,安装过程中若出现紫色选择界面,回车使用默认选项即可
./build_epc -i    #安装搭建MME、SGW、PGW网元的依赖软件包
./build_hss -i    #安装搭建HSS网元的依赖软件包

安装依赖软件时可能出现的问题——软件包freediameter1.2.0下载失败

  • 该软件是从外网下载,下载该速度会非常慢,有时等了很久会侥幸下载成功,有时等了很久还是下载失败。
  • build_epc和build_hss安装依赖软件时都会下载freediameter,在“./build_epc -i ”中如果已经下载了freediameter成功了,那么在“./build_hss -i”又遇到下载freediameter时可以选择“n”。
  • 解决思路见1.6,以下为详细解决步骤:
S1:安装依赖软件包其实是通过调用~/openair-cn/BUILD/TOOLS/build_helper脚本文件中的函数来实现的,执行下面命令打开build_helper:
sudo gedit ~/openair-cn/BUILD/TOOLS/build_helper
S2:搜索“Downloading 1.2.0 freeDiameter archive”,并注释掉下面两行
    #$SUDO rm -rf /tmp/1.2.0.tar.gz* /tmp/freeDiameter-1.2.0 /tmp/freediameter
    #git clone https://gitlab.eurecom.fr/oai/freediameter.git -b eurecom-1.2.0  
S3:科学上网,浏览器打开“https://gitlab.eurecom.fr/oai/freediameter”,选择1.2.0分支的freediameter;无论下载.zip、tar.gz或其他格式的压缩包,解压后把目录名“freediameter-1.2.0”修改为“freediameter”并放到“/tmp”路径下
S4:最后再执行“./build_epc -i ”就可以节省大量的下载等待时间了

4.2 配置、搭建和运行HSS

4.2.1 配置HSS
  • 修改以下配置,以使执行“build_hss”时自动将oai_db数据库导入到我们的本地mysql数据库中。
sudo gedit ~/openair-cn/BUILD/HSS/hss.conf.in
--------------------------------------------------
HSS :
{
# MySQL mandatory options
MYSQL_server = "127.0.0.1";
MYSQL_user = "root";
MYSQL_pass = "linux";    #或你自己设置的密码
MYSQL_db = "oai_db";

## HSS options
OPERATOR_key = "1006020f0a478bf6b699f15c062e42b3";
...
}
--------------------------------------------------

补充说明

  • OPERATOR_key即OP密钥,一般一家电信运营商只有一个OP密钥。为了避免所有卡片预置同一个OP所带来的安全风险,目前很多运营商均采用在USIM卡中预置OPc,OPc是由OP和KI(或key)经过一系列运算后得到的,这样就确保了不同卡片预置不同的OPC,且无法通过一张卡片的OPc反算出运营商的OP。可见OP和OPc是用户鉴权的重要参数。
  • 电信运营商可以自定义自家OPc的计算方法,但是很多运营商其实还是采用了标准的OPC计算方法:OPc=AES128(Ki,OP) XOR OP,即OPc是由OP和KI经过AES加密和异或运算后得到的。
4.2.2 搭建HSS(即生成HSS可运行程序)

(1)HSS搭建命令如下:

cd ~/openair-cn/SCRIPTS
./build_hss -c -l

(2) HSS搭建流程如下图所示:

  • 以下整个搭建流程都是不需要我们参与的,命令都被写在了build_hss脚本里面,大概了解一下即可。
    在这里插入图片描述
  • hss_fd.conf.in、acl.conf.in和hss.conf.in是搭建过程中的“输入配置文件”;
  • hss_fd.conf、acl.conf和hss.conf是搭建过程中的“输出配置文件”,oai_hss是搭建完成后生成的可运行文件,生成文件原目录在:~/openair-cn/BUILD/HSS/BUILD/,它们又被拷贝到了
    /usr/local/etc/oai/hss.conf
    /usr/etc/freeDiameter/hss_fd.conf
    /usr/etc/freeDiameter/acl.conf
    /usr/local/bin/oai_hss
    这也是我们实际运行HSS时用到的配置文件和执行文件。
  • hss.conf中主要包含我们上面在hss.conf.in中配置的参数,hss_fd.conf主要设置了与MME连接的S6A接口参数。

(3)HSS搭建成功如下图所示:
在这里插入图片描述

4.2.3 运行HSS
~/openair-cn/SCRIPTS/run_hss -g
  • run_hss可选的选项如下:
    在这里插入图片描述
    GDB是一种调试工具,详细介绍和使用见:GDB - 简单易上手的新人教程
  • HSS成功运行如下图所示:
    在这里插入图片描述
    目前,cty.openair4G.eur(即MME)还处于关闭状态。

4.3 配置HSS数据库

4.3.1 概念补充

(1)IMSI

  • (International Mobile Subscriber Identification Number,国际移动用户识别码)
    是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。其总长度不超过15位,同样使用0~9的数字。IMSI=MCC+MNC+MSIN。其中MCC是移动用户所属国家代号,占3位数字,中国的MCC规定为460;MNC是移动网号码,用于识别移动用户所归属的移动通信网,由两位或者三位数字组成,中国移动的移动网络编码(MNC)为00;MSIN是移动用户识别码,用以识别某一移动通信网中的移动用户。

(2)PLMN

  • (Public Land Mobile Network,公共陆地移动网络)
    由政府或它所批准的经营者,为公众提供陆地移动通信业务目的而建立和经营的网络。该网路通常与公众交换电话网(PSTN)互连,形成整个地区或国家规模的通信网。PLMN = MCC + MNC,例如中国移动的PLMN为46000,中国联通的PLMN为46001。

(3)IMEI

  • (International Mobile Equipment Identity,国际移动设备识别码)
    即通常所说的手机序列号、手机“串号”,用于在移动电话网络中识别每一部独立的手机等移动通信设备,相当于移动电话的身份证。序列号共有15~17位数字,前8位(TAC)是型号核准号码(早期为6位),是区分手机品牌和型号的编码。接着2位(FAC)是最后装配号(仅在早期机型中存在),代表最终装配地代码。后6位(SNR)是串号,代表生产顺序号。最后1位(SP)一般为0,是检验码,备用。国际移动设备识别码一般贴于机身背面与外包装上,同时也存在于手机存储器中,通过输入*#06#即可查询。

(4)MSISDN

  • Mobile Subscriber International ISDN/PSTN number,(ISDN即是综合业务数字网,是Integrated Service Digital Network 的简称)。
    MSISDN=CC+NDC+SN
    MSISDN号码其组成包含如下三个部分:
    CC:Country Code,含义为国家码,因为陆地移动网络遍布全球各地,自然需要对不同国家的移动用户进行区分,中国的国家码为86。
    NDC:National Destination Code,表示国内目的地码,也称网络接入号。为保障消费者的利益并允许合理的市场竞争,每个主权国家都可以授权一个或多个网络运营商组建并经营移动网络,例如中国三大移动运营商之中国移动网络接入号为134139、150152、188等,中国联通为130132、185186等,中国电信为133、153、180、189等。
    SN:Subscriber Number,客户号码。
    若在以上号码中将国家码CC去除,就成了移动台的国内身份号码,也就是我们日常所说的"手机号码"。

(5)aqn

  • 序列号,用于网络鉴权,防止用户连接到非法网络。

(6)apn

  • APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。APN实际上就是对一个外部PDN的标识,这些PDN包括企业内部网、Internet、WAP网站、行业内部网等专用网络。网络侧如何知道手机到底做了激活以后要访问哪个网络呢(因为每个网络分配的IP可能都是不一样的,有的是私网,有的是公网IP),这就要靠APN来区分了,当然各个运营商可能名字不一样。
4.3.2 查看oai_db数据库

(1)访问网址:localhost/phpmyadmin 并登录phpmyadmin(账号:root 密码:linux或自己设置的密码),查看一下有没有oai_db数据库,若没有则需要执行下面命令手动导入:

~/openair-cn/SCRIPTS/run_hss -i ~/openair-cn/SRC/OAI_HSS/db/oai_db.sql

(2)登录phpmyadmin并成功导入oai_db数据库后如下图所示:
在这里插入图片描述

4.3.3 设置mmeidentity
  • 可以将mmehost栏下的“yang.openair4G.eur”修改为自己的FQDN,我这里是“cty.openair4G.eur”,也可以自己新建一条记录。记住对应的mmeidetity号,我这里是4。
    在这里插入图片描述
4.3.4 设置users
  • 选择一个imsi号,我选择的是208930000000001,将ms_ps_status选择为NOT_PURGED,将mmeidentity_idmmeidentity修改为上文的对应值4。这里面包含后面我们要配置终端的参数。
  • 可以看到该用户的key(即4.2.1中提到的KI)为“8baf473f2f8fd09487cccbd7097c6862”,OPc初始为8e27…,这里不需要修改,等全部配置好HSS数据库后,再次运行HSS,会自动根据OP和KI计算出新的OPc值。
  • 可以提前说明OP(1006020f0a478bf6b699f15c062e42b3)和KI(8baf473f2f8fd09487cccbd7097c6862)计算出的OPc值一定为“e734f8734007d6c5ce7a0508809e7e9c”,等全部配置好HSS数据库,再次运行HSS后,可以登录phpmyadmin进行验证,用户208930000000001的OPc值是否变为“e734f8734007d6c5ce7a0508809e7e9c”。
    在这里插入图片描述
4.3.5 设置apn
  • 新建一条apn,值如下图所示,记住apn-name为oai.ipv4,pdn-type为IPv4。
    在这里插入图片描述
4.3.6 设置pgw
  • 在终端使用ifconfig命令查看自己的ipv4和ipv6,新建一条或者修改一条pgw记录,记住id,这里是3。
    在这里插入图片描述
4.3.7 设置PDN
  • 找到之前选择的users_imsi为208930000000001的记录,检查apn应为oai.ipv4,pdn_type应为IPv4,pgw_id应为3,这些值皆与上文对应。
    在这里插入图片描述

4.4 配置、搭建和运行MME-GW

  • 这里的MME-GW包括MME、SGW和PGW三个网元。
4.4.1 配置MME-GW
  • 主要依据下图进行配置,注意SGI接口的网卡名和IP地址要设置成自己的,ifconfig查看。
    在这里插入图片描述
  • 配置内容如下:
#按照下面内容修改含有“修改这里”字样的语句,可以解决按照官方教程配置出现的一些问题
sudo gedit ~/openair-cn/BUILD/EPC/epc.conf.in
--------------------------------------------------
...
#1 网络的MCC / MNC
TAI_LIST = (
         #{MCC="208" ; MNC="95"; TAC = "15"; }, #修改这里,注释掉
         #{MCC="208" ; MNC="95"; TAC = "14"; }, #修改这里,注释掉
         #{MCC="208" ; MNC="95"; TAC = "12"; }, #修改这里,注释掉
         #{MCC="208" ; MNC="95"; TAC = "11"; }, #修改这里,注释掉
         #{MCC="208" ; MNC="95"; TAC = "10"; } #修改这里,注释掉
         {MCC="208" ; MNC="93"; TAC = "1"; }     #修改这里,添加这样一条记录
);
...
#2 S1-C接口
 NETWORK_INTERFACES : 
{
        # MME binded interface for S1-C or S1-MME communication (S1AP), can be ethernet interface, virtual ethernet interface, we don't advise wireless interfaces
        MME_INTERFACE_NAME_FOR_S1_MME = "tun2";    #修改这里,设置MME端与eNB连接的S1-C接口为隧道 
        MME_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24";    #修改这里,设置MME端与eNB连接的S1-C接口的IP
        ...
};
...
#3 日志记录
LOGGING :
{
        # OUTPUT choice in { "CONSOLE", "`path to file`", "`IPv4@`:`TCP port num`"} 
        # `path to file` must start with '.' or '/'
        # if TCP stream choice, then you can easily dump the traffic on the remote or local host: nc -l `TCP port num` > received.txt
        #OUTPUT = "127.0.0.1:5656";    #修改这里,注释掉
        OUTPUT = "CONSOLE";    #修改这里,添加一条语句,将日志输出方向修改为控制台,否则会出现“Could not connect to log server 127.0.0.1:5656”的问题
        ...
};
...
#4 S1-U接口
S-GW : 
{
    NETWORK_INTERFACES : 
    {
        ...
        # S-GW binded interface for S1-U communication (GTPV1-U) can be ethernet interface, virtual ethernet interface, we don't advise wireless interfaces
        SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "lo";    # 修改这里,设置S-GW端与eNB连接的S1-U接口网卡为虚拟网卡
        SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP = "127.0.0.1/24";    # 修改这里,设置S-GW端与eNB连接的S1-U接口IP为环回地址
        SGW_IPV4_PORT_FOR_S1U_S12_S4_UP = 2152;    # 修改这里,设置端口
        ...
    };
    ...
}
...
#5 SGI接口
NETWORK_INTERFACES :
{
  PGW_INTERFACE_NAME_FOR_S5_S8 = "none"; 
  PGW_IPV4_ADDRESS_FOR_S5_S8 = "0.0.0.0/24"; 
  PGW_INTERFACE_NAME_FOR_SGI = "eth0";    #修改这里,修改成自己上网网卡,ifconfig查看
  PGW_IPV4_ADDRESS_FOR_SGI = "192.168.43.75/24";    #修改这里,修改成自己上网网卡对应的IP地址,ifconfig查看
  PGW_MASQUERADE_SGI = "yes"; 
};
...
#6 终端IP分配
    IP_ADDRESS_POOL :
    {
        IPV4_LIST = (
                      #"192.188.2.0/24", #修改这里,注释掉
                      #"192.188.8.0/24" #修改这里,注释掉
                      "192.187.0.0/24", #修改这里,添加一条语句
                      "192.187.1.0/24" #修改这里,添加一条语句
                    );
            ...
    };
...
--------------------------------------------------
4.4.2 搭建MME-GW

(1)MME-GW搭建命令如下:

~/openair-cn/SCRIPTS/build_epc -c -l
  • 如果按照4.1中为所有文件添加全部属性,这里应该不会搭建失败。

(2)MME-GW搭建过程如下图所示:

  • 与搭建HSS网元类似,以下整个搭建流程都是不需要我们参与的,命令都被写在了build_epc脚本里面,大概了解一下即可。
    在这里插入图片描述
  • s6a.conf.in和epc.conf.in是搭建过程中的“输入配置文件”;
  • mme_fd.conf和epc.conf是搭建过程中的“输出配置文件”,mme_gw是搭建完成后生成了一个可运行文件,这些生成文件原目录在:~/openair-cn/BUILD/EPC/BUILD/,它们又被拷贝到了
    /usr/local/etc/oai/epc.conf
    /usr/etc/freeDiameter/mme_fd.conf
    /usr/local/bin/mme_gw
    这也是我们实际运行MME-GW时用到的配置文件和可运行文件。
  • epc.conf中主要包含我们上面在epc.conf.in中配置的参数,mme_fd.conf主要设置了与HSS连接的S6A接口参数。

(3)MME-GW搭建成功如下图所示:
在这里插入图片描述

######4.4.3 运行MME-GW

~/openair-cn/SCRIPTS/run_epc -g
  • run_epc可选的选项如下:
    在这里插入图片描述
  • MME成功运行如下图所示:
    在这里插入图片描述
  • 这时运行HSS,等一会儿可以看到HSS与MME连接成功,在运行HSS的终端可以看到cty.openair4G.eur(即MME)处于开启状态并与MME进行收发数据,如下图所示:
    在这里插入图片描述

5 搭建OAISIM

5.1 切换分支和安装依赖软件包

cd ~
sudo chmod -R 777 ~/openairinterface5g
cd ~/openairinterface5g
git checkout v0.6.1    #切换“old oaisim”版本
source oaienv
cd cmake_targets
#以下安装OAISIM运行依赖的软件包
./build_oai -I  

安装依赖软件时可能出现的问题1——软件包ASN1C下载失败

  • 解决详细步骤如下:
S1:安装依赖软件包其实是通过调用~/openairinterface5g/cmake_targets/tools/build_helper脚本文件中的函数来实现的,执行下面命令打开build_helper:
sudo gedit ~/openairinterface5g/cmake_targets/tools/build_helper
S2:搜索“install_asn1c_from_source()”,并注释掉下面两行
    #$SUDO rm -rf /tmp/asn1c
    #GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
S3:科学上网,浏览器打开“https://gitlab.eurecom.fr/oai/asn1c”,选择openair分支的asn1c;无论下载.zip、tar.gz或其他格式的压缩包,解压后把目录名“asn1c-openair”修改为“asn1c”并放到“/tmp”路径下
S4:最后再执行“./build_oai -I”就可以节省大量的下载等待时间了
#若其他软件下载失败可同样解决。

安装依赖软件时可能出现的问题2——fatal: unable to access https://gist.github.com/2190472.git : Failed to connect to gist.github.comport 443: Connection timed out

  • 解决详细步骤如下:
#执行:
sudo gedit openairinterface5g/cmake_targets/tools/build_helper
#打开后 Ctrl+F 搜索找到这一行
$SUDO git clone https://gist.github.com/2190472.git /opt/ssh
#改成如下(来自大神的镜像克隆)
$SUDO git clone https://github.com/JackPaul/ssh.git /opt/ssh

5.2 搭建、配置OAISIM

5.2.1 搭建OAISIM

(1)OAISIM搭建命令如下:

~/openairinterface5g/cmake_targets/build_oai --oaisim

(2)OAISIM搭建成功如下图所示:
在这里插入图片描述

5.2.2 配置OAISIM
  • 主要依据下图进行配置。
    在这里插入图片描述
  • 配置内容如下:
#打开oaisim配置文件,按照下面内容修改含有“修改这里”字样的语句
sudo gedit ~/openairinterface5g/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf
--------------------------------------------------
    ...
    // Tracking area code, 0x0000 and 0xfffe are reserved values
    tracking_area_code = "1";    #修改这里
    mobile_country_code = "208";    #修改这里
    mobile_network_code = "93";    #修改这里
    ...
    // 按照下图配置
    // MME parameters:
    mme_ip_address = ( { ipv4 = "192.188.2.2/24";    #修改这里,设置MME的IP
                              ipv6 = "192:168:30::17";
                              active = "yes";
                              preference = "ipv4";
                            }
                          );
    NETWORK_INTERFACES :
    {
        ENB_INTERFACE_NAME_FOR_S1_MME = "tun2";    #修改这里,设置eNB端与MME连接的S1-C接口的为隧道
        ENB_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24";    #修改这里,设置设置eNB端与MME连接的S1-C接口的IP
        ENB_INTERFACE_NAME_FOR_S1U = "lo";    #修改这里,设置设置eNB端与S-GW连接的S1-U接口的网卡为虚拟网卡
        ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.1/24";    #修改这里,设置设置eNB端与S-GW连接的S1-U接口的IP为环回地址
        ENB_PORT_FOR_S1U = 2153; # Spec 2152    #修改这里,设置端口
    };
   ...
--------------------------------------------------

5.3 修改UE信息

5.3.1 修改UE配置文件
  • 配置内容如下:
打开UE配置文件,按照下面内容修改含有“修改这里”字样的语句
sudo gedit ~/openairinterface5g/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
--------------------------------------------------
# List of known PLMNS
PLMN: {
    ...
#有我们之前在HSS和MME配置文件中设置的PLMN
    PLMN4: {
           FULLNAME="OAI LTEBOX";
           SHORTNAME="OAIALU";
           MNC="93";
           MCC="208";
    };
    ...
};
#默认有一个终端UE0
UE0:
{
    USER: {
        IMEI="35609204079301";    #修改这里,修改成之前在HSS数据库中选择的UE对应的值
        MANUFACTURER="EURECOM";
        MODEL="LTE Android PC";
        PIN="0000";
    };

    SIM: {
        MSIN="0000000001";    #修改这里,修改成之前在HSS数据库中选择的UE对应的值
        USIM_API_K="8baf473f2f8fd09487cccbd7097c6862";    #修改这里,修改成之前在HSS数据库中选择的UE对应的值
        OPC="8e27b6af0e692e750f32667a3b14605d";    #修改这里,修改成之前在HSS数据库中选择的UE对应的值
        MSISDN="33638030001";    #修改这里,修改成之前在HSS数据库中选择的UE对应的值
    };

    # Home PLMN Selector with Access Technology
    HPLMN= "20893";    #修改这里,修改成之前在HSS数据库中选择的UE对应的值
    ...
};
--------------------------------------------------
5.3.2 生成UE信息文件
#通过conf2uedata软件生成UE信息文件
cd ~/openairinterface5g/targets/bin
conf2uedata -c ~/openairinterface5g/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -o ./
#执行上述命令后会产生以下三个信息文件,在运行OAISIM时会自动获取这三个文件中的UE信息
./targets/bin/.usim.nvram0
./targets/bin/.ue_emm.nvram0
./targets/bin/.ue.nvram0

5.4 运行HSS、MME_GW和OAISIM

5.4.1 运行OAISIM及遇到问题
  • 先把HSS和MME打开,它们在等OAISIM运行,以下为OAISIM运行命令:
cd ~/openairinterface5g/cmake_targets/tools 
sudo -E ./run_enb_ue_virt_s1
  • 但我却出现了如下图所示的错误:
    在这里插入图片描述
5.4.2 问题解决——自己搭建隧道

(1)分析问题

  • 从5.4.1中遇到的问题可以看出是S1AP错误,S1AP是eNB与MME之间S1-C接口的协议,显然eNB和MME未成功连接。

(2)发现问题

  • 执行ifconfig发现并没有隧道“tun2”,因此eNB与MME无法连接,我本以为运行OAISIM时会自动生成隧道。
    在这里插入图片描述

(3)解决问题

  • 搭建隧道“tun2”
#1 查看是否有加载ip_gre模块
sudo modprobe ip_gre
lsmod | grep gre
--------------------------------------------------
#说明已加载ip_gre模块
ip_gre 20480 0 
ip_tunnel 28672 1 ip_gre
gre 16384 1 ip_gre
--------------------------------------------------
#2 创建隧道tun2
sudo ip tunnel add tun2 mode gre remote 127.0.2.1 local 127.0.2.1 ttl 255    #远程和本地主机IP都设置为环回地址
sudo ip link set tun2 up
sudo ip addr add 192.188.2.2 peer 192.188.2.2 dev tun2    #隧道两端IP都设置为192.188.2.2
  • ifconfig可以看到出现了隧道“tun2”
    在这里插入图片描述
5.4.3 HSS、MME_GW和OAISIM成功运行展示

(1)HSS、MME_GW和OAISIM运行命令如下:

#打开终端1,运行HSS
~/openair-cn/SCRIPTS/run_hss -g    
#打开终端2,运行MME_GW
~/openair-cn/SCRIPTS/run_epc -g   
#打开终端3,运行OAISIM,-x选项可查看图形界面
cd ~/openairinterface5g/cmake_targets/tools 
sudo -E ./run_enb_ue_virt_s1 -x    

(2)HSS、MME_GW和OAISIM成功运行如下图所示:

  • HHS成功运行图如下:
    在这里插入图片描述

  • MME_GW成功运行图如下:
    在这里插入图片描述

  • OAISIM成功运行图如下:
    补充说明:我第一次运行OAISIM时UE不能像下图一样稳定收发数据,我退出后再次运行OAISIM便可像下图一样稳定收发数据。
    在这里插入图片描述

  • eNB0图形界面
    在这里插入图片描述

  • UE0图形界面
    在这里插入图片描述

6 结语

  • 以上内容为笔者在搭建OAISIM with S1过程中的学习收获和感悟,由于笔者也是初学者,难免有描述不准确甚至错误的地方,欢迎大家交流并指出。
  • 另外,笔者参阅了大量前人的博客、书籍等资料才成功搭建出OAI仿真平台,非常感谢这些前辈们知识的分享和在该领域所做的贡献。
  • 接下来笔者将把主要精力投入到学习更加深入的LTE技术的理论知识中去。

参考资料

[1] HowtorunoaisimwithvirtualMMEonsamemachine
[2] how to run oaisim with multiple ue
[3] HowToConnectCOTSUEwithOAIeNBNew
[4] OAI搭建 EPC(2018-09最新版)
[5] OAI搭建 eNB(2018-09最新版)
[6] OAI搭建 SIM卡(2018-11更新版)
[7] linux下创建GRE隧道

发布了11 篇原创文章 · 获赞 4 · 访问量 1962

猜你喜欢

转载自blog.csdn.net/ChenTianyu666/article/details/90009249