【OAI】UERANSIM容器与OAI核心网分立部署及测试
- 说明
- 启动核心网:
- 启动基站:
- 功能测试
- ueransim测试1:通过12.1.1.x ping192.168.70.1
- ueransim测试2: 通过nr-binder绑定自定义TCP程序传数据到核心网
- ueransim测试3:多ueransim启动
- 结论
- 附录
- 基站配置文件:
- TCP通信程序代码
说明
内容:
在服务器A运行OAI核心网,版本v1.5.0,启动的yaml文件为:docker-compose-basic-vpp-nrf.yaml
在主机B运行容器版ueransim,image版本为ueransim:latest,使ueranism接入核心网,创建uesimtun接口,并使用该接口成功传输数据
前提:
服务器A与主机B通过·一根网线连接,在linux虚拟机Ubuntu(18.04.6)上配置好网络使两端可以·互相ping通,服务器A上安装并测试成功运行OAI核心网,主机B上下载安装并成功测试本机ueransim接入本机核心网
详情参照:
DEPLOY_SA5G_WITH_UERANSIM
启动核心网:
sudo sysctl net.ipv4.conf.all.forwarding=1
sudo iptables -P FORWARD ACCEPT
docker-compose -f docker-compose-basic-vpp-nrf.yaml up -d
启动基站:
#添加路由
gNB-host$: sudo ip route add 192.168.70.0/24 via 192.168.12.3 dev ens40
gNB-host$: sudo ip route add 192.168.72.0/24 via 192.168.12.3 dev ens40
#启动基站
lab@lab-virtual-machine:~/oai-cn5g-fed/docker-compose/ueransim yz$ docker-compose -f docker-compose-ueransim-vpp1.yaml up
#进入容器内部
lab@lab-virtual-machine:~/oai-cn5g-fed/docker-compose/ueransim yz$ docker exec -it ae6df94b7b3d /bin/bash
功能测试
ueransim测试1:通过12.1.1.x ping192.168.70.1
root@lab-virtual-machine:/ueransim/bin# ping -I 12.1.1.2 192.168.70.1
ueransim测试2: 通过nr-binder绑定自定义TCP程序传数据到核心网
## 在容器内部安装运行所需软件
root@lab-virtual-machine:/ueransim/bin# apt-get update
root@lab-virtual-machine:/ueransim/bin# apt-get install python3
#将TCPclient代码复制到容器内部
lab@lab-virtual-machine:~/oai-cn5g-fed/docker-compose/ueransim yz$ sudo docker cp TCPclient.py
核心网侧启动TCPsever代码
lab@lab-virtual-machine:~/oai-cn5g-fed/docker-compose$ python3 TCPserve.py
基站侧ueransim容器内部启动TCPclient代码
#修改nr-binder可执行权限
root@lab-virtual-machine:/ueransim/bin# chmod 777 nr-binder
root@lab-virtual-machine:/ueransim/bin# ./nr-binder 12.1.1.2 python3 TCPclient.py
成功进行TCP通信
ueransim测试3:多ueransim启动
#启动第二个ueransim
lab@lab-virtual-machine:~/oai-cn5g-fed/docker-compose/ueransim yz$ docker-compose -f docker-compose-ueransim-vpp2.yaml up
启动了成功建立PDU session ,但在分配uesimtun0时出错
不过可以看见生成了接口:
OAI核心网看见接入了两个ue:
测试第二个接口是否可用:
发现第二个接口在使用上存在问题
结论
部署完成,可以实现单ueransim容器分立部署接入OAI核心网,并测试传输数据
存在问题:多ueransim在uesimtun接口的创建与数据传输不能正常进行,需要解决
解决思路:修改ueransim配置文件
1.对于多基站接入,不同基站配置不同网口进行数据传输,其中NGAP_IP和GTP_IP修改为对应的网口地址:
附录
基站配置文件:
相比于官方原始ueransim配置文件,将网络模式由external修改为host
基站1:
version: '3.8'
services:
ueransim1:
container_name: ueransim1
image: ueransim:latest
privileged: true
environment:
# GNB Congig Parameters
- MCC=208
- MNC=95
- NCI=0x000000010
- TAC=0xa000
- LINK_IP=127.0.0.1
- NGAP_IP=192.168.12.33
- GTP_IP=192.168.12.33
- NGAP_PEER_IP=192.168.70.132
- SST=222
- SD=123
- IGNORE_STREAM_IDS=true
# UE Config Parameters
- NUMBER_OF_UE=1
- IMSI=208950000000031
- KEY=0C0A34601D4F07677303652C0462535B
- OP=63bfa50ee6523365ff14c1f45f88737d
- OP_TYPE=OPC
- AMF_VALUE=8000
- IMEI=356938035643803
- IMEI_SV=0035609204079514
- GNB_IP_ADDRESS=127.0.0.1
- PDU_TYPE=IPv4
- APN=default
- SST_0=222
- SD_0=123
- SST_C=222
- SD_C=123
- SST_D=222
- SD_D=123
network_mode: "host"
healthcheck:
test: /bin/bash -c "ifconfig uesimtun0"
interval: 10s
timeout: 5s
retries: 5
#networks:
# hostnet:
# external: true
# name: host
基站2:
相对基站1修改了:
项目 | 原始名字 | 修改名字 |
---|---|---|
服务名称 | ueransim1 | ueransim2 |
容器名称 container_name | ueransim1 | ueransim2 |
NCI | 0x000000010 | 0x000000020 |
NCI标识了不同基站代码,通过此项在核心网侧可以看见多基站接入:
version: '3.8'
services:
ueransim2:
container_name: ueransim2
image: ueransim:latest
privileged: true
environment:
# GNB Congig Parameters
- MCC=208
- MNC=95
- NCI=0x000000020
- TAC=0xa000
- LINK_IP=127.0.0.1
- NGAP_IP=192.168.12.33
- GTP_IP=192.168.12.33
- NGAP_PEER_IP=192.168.70.132
- SST=222
- SD=123
- IGNORE_STREAM_IDS=true
# UE Config Parameters
- NUMBER_OF_UE=1
- IMSI=208950000000041
- KEY=0C0A34601D4F07677303652C0462535B
- OP=63bfa50ee6523365ff14c1f45f88737d
- OP_TYPE=OPC
- AMF_VALUE=8000
- IMEI=356938035643803
- IMEI_SV=0035609204079514
- GNB_IP_ADDRESS=127.0.0.1
- PDU_TYPE=IPv4
- APN=default
- SST_0=222
- SD_0=123
- SST_C=222
- SD_C=123
- SST_D=222
- SD_D=123
network_mode: "host"
healthcheck:
test: /bin/bash -c "ifconfig uesimtun0"
interval: 10s
timeout: 5s
retries: 5
#networks:
# hostnet:
# external: true
# name: host
TCP通信程序代码
核心网侧TCPsever.py
import socket
from threading import Thread
def new_client_connect(new_client_socket, client_ip_port):
while True:
# 收发数据
recv_data = new_client_socket.recv(1024)
if len(recv_data) != 0:
recv_text = recv_data.decode("gb2312")
print("接收到[%s]的信息:%s" % (str(client_ip_port), recv_text))
else:
print("客户端断开连接")
break
# # 关闭连接
# new_client_socket.close() # 表示断开与当前的客户端的通信
def main():
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口和ip
tcp_server_socket.bind(("192.168.70.1", 8088))
# 设置套接字为被动监听模式,不能主动发送数据,128为允许接收的最大连接数
tcp_server_socket.listen(128)
while True:
# 接收客户端连接
new_client_socket, client_ip_port = tcp_server_socket.accept()
t1 = Thread(target=new_client_connect, args=(new_client_socket, client_ip_port))
t1.start()
# tcp_server_socket.close() # 表示不再接受新客户端的连接,已经连接的可以继续服务
if __name__ == '__main__':
main()
基站侧TCPclient.py代码:
import socket
import time
# 创建套接字
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Waitting for connecting...")
# 建立连接
tcp_client_socket.connect(("192.168.70.1", 8088))
print("Connected!")
# 发送数据
print("Sending message...")
while 1:
tcp_client_socket.send("你好".encode("gb2312"))
time.sleep(5)
# 接收数据
recv_data = tcp_client_socket.recv(1024).decode("gb2312")
print(recv_data)
# 关闭套接字
tcp_client_socket.close()