【OAI】UERANSIM容器与OAI核心网分立部署及测试

说明

内容:
在服务器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   ueransim:/ueransim/bin

在这里插入图片描述
核心网侧启动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()

猜你喜欢

转载自blog.csdn.net/qq_41224270/article/details/130398571