当前位置: 首页 > article >正文

【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修改了:

项目原始名字修改名字
服务名称ueransim1ueransim2
容器名称 container_nameueransim1ueransim2
NCI0x0000000100x000000020

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()

http://www.kler.cn/a/15560.html

相关文章:

  • 【不写for循环】玩玩行列
  • shell脚本_永久环境变量和字符串操作
  • JS的学习与使用
  • SpringBoot配置相关的内容
  • mac上使用docker搭建gitlab
  • 从建立TRUST到实现FAIR:可持续海洋经济的数据管理
  • 力扣第343场周赛
  • 【Git 入门教程】第七节、Git 远程仓库(Github)
  • MongoDB 聚合管道的输出结果到集合($out)及合并结果到集合($merge)
  • 什么是redis发布订阅模式,并用java代码实现小demo
  • 我们要被淘汰了?从科技变革看"ChatGPT"与"无代码开发"
  • 【数据库数据恢复】ORACLE常见数据灾难的数据恢复可能性分析
  • 【学习笔记】CF607E Cross Sum
  • 前端开发技术——对象
  • apple pencil有买的必要吗?便宜的平替电容笔推荐
  • [学习笔记] [机器学习] 3. KNN( K-近邻算法)及练习案例
  • Springboot +Flowable,详细解释啥叫流程实例(二)
  • 跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测)
  • QFIELD-GIS工具版如何编辑数据
  • 入职华为外包一个月后,我离职向“北上广深”流浪了...
  • Ubuntu22.04部署Pytorch2.0深度学习环境
  • SQL性能调优简介
  • EPIT定时器实验(一)
  • 区块链学习一(FISCO BCOS部署控制台部署第一个HelloWorld)
  • 射频电路设计常见问题以及经验总结
  • 【MATLAB图像处理实用案例详解(12)】——利用BP神经网络实现图像压缩