保姆级教程:在Ubuntu 18.04上用USRP B210和商用手机(红米K40s)搭建OAI 5G私网
从零构建5G实验网络基于USRP B210与商用手机的OAI实战指南引言为什么需要可落地的5G私网实验方案在5G技术研究领域学术界与工业界之间存在一道明显的鸿沟——大多数开源项目难以直接适配商用终端而商业设备又缺乏足够的透明度供开发者深入探索。OpenAirInterfaceOAI作为少数能够桥接这一鸿沟的开源平台其价值在于提供了从核心网到接入网的完整5G协议栈实现。但官方文档往往聚焦于理想化环境当开发者尝试用实际设备如USRP软件无线电和商用手机搭建可工作的系统时总会遭遇各种最后一公里问题。这正是本文要解决的核心痛点。我们将以红米K40s手机USRP B210硬件组合为测试平台在单台Ubuntu 18.04物理机上部署完整的OAI 5G网络。与常见教程不同本文特别强调商用终端适配揭秘为何某些手机型号即使采用相同高通芯片无法连接配置陷阱预防提前标注那些会导致有信号无数据的关键参数端到端验证确保从SIM卡烧写到手机上网的全流程可验证1. 实验环境准备硬件选型与系统配置1.1 关键硬件选择标准射频前端选择USRP B210的性价比优势约$1200使其成为个人开发者的首选需确认固件版本≥4.0可通过uhd_find_devices命令验证推荐使用外部时钟源或GPSDO模块改善频率稳定性手机兼容性清单型号芯片组测试结果关键发现红米K40sSnapdragon 870✔️需关闭SA/NSA自适应OPPO Reno6Dimensity 900✖️基带固件限制NR接入vivo X60Exynos 1080✖️IMS注册失败提示建议优先选择搭载骁龙X55/X60基带的设备这些型号对实验性网络支持较好1.2 系统环境配置# 基础依赖安装 sudo apt-get install -y git build-essential libboost-all-dev \ libusb-1.0-0-dev python3-pip docker.io docker-compose # UHD驱动安装 git clone https://github.com/EttusResearch/uhd.git cd uhd/host mkdir build cd build cmake .. make -j$(nproc) sudo make install sudo ldconfig必须调整的内核参数# 增加网络栈缓冲区大小 echo net.core.rmem_max2097152 | sudo tee -a /etc/sysctl.conf echo net.core.wmem_max2097152 | sudo tee -a /etc/sysctl.conf sudo sysctl -p2. OAI核心网部署容器化方案深度定制2.1 非标准NRF模式部署采用mini-nonrf模式可节省约40%的内存占用适合单机部署# docker-compose-mini-nonrf.yaml关键修改 services: mysql: volumes: - ./database/oai_db1.sql:/docker-entrypoint-initdb.d/oai_db1.sql oai-amf: environment: - TZUTC - MCC001 - MNC01数据库初始化关键点-- oai_db1.sql示例片段 INSERT INTO users VALUES ( 001010000000001, -- IMSI 380561234567, -- MSISDN 862723064164746, -- IMEI NULL, PURGED, 50, -- QCI 40000000, -- UL限速 100000000, -- DL限速 47, 0000000000, 1, 0x0C0A34601D4F07677303652C0462535B, -- K 0, 0, 0x40, ebd07771ace8677a, 0x63bfa50ee6523365ff14c1f45f88737d -- OPC );2.2 DNN配置陷阱规避原始配置中oai作为默认DNN常导致鉴权失败建议修改为# smf.conf关键参数 dnn_list: - dnn: ims ipv4: 12.1.1.0/24 ipv6: 2001:db8::/64注意必须同步修改手机APN设置保持DNN名称与核心网配置完全一致3. gNB基站配置射频参数优化实战3.1 USRP专用编译流程# 独立编译USRP驱动 mkdir USRP_Drive_OAI cd USRP_Drive_OAI git clone --branch develop https://gitlab.eurecom.fr/oai/openairinterface5g.git cd openairinterface5g source oaienv ./build_oai -I -w USRP关键编译参数对比参数选项典型值作用域影响范围-IN/A系统级安装全部依赖-wUSRP硬件特定生成UHD兼容二进制-cDebug/Release代码级影响执行效率与调试信息3.2 发射功率与频段配置# 启动gNB示例band n78 sudo ./nr-softmodem -O ../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf配置文件关键修改# 频段配置 dl_absoluteFrequencyPointA 632628 dl_carrierBandwidth 106 ul_absoluteFrequencyPointA 632628 # 功率调整 maxUplinkTxPower 26 # 默认20dBm可能导致手机无法稳定连接 pMax 23 # 手机最大发射功率限制4. 终端侧配置从SIM卡到数据业务4.1 白卡烧写技术细节写卡器连接检查lsusb | grep -i smart card # 应显示类似Bus 003 Device 007: Gemalto PC Twin ReaderEF文件映射关系文件ID内容类型示例值6F07ICCID89 01 23 45 67 89 01 23 45 676F20IMSI08 01 01 00 00 00 00 016F08SMSP省略...6F10KI0C 0A 34 60 1D 4F 07 67警告不同烧卡软件对5G参数的支持差异较大建议使用最新版PySIM4.2 手机端神秘配置在拨号界面输入*#*#4636#*#*进入测试模式后选择手机信息设置首选网络类型为NR only手动触发PLMN搜索避免自动连接商用网络新建APN时确保名称OAI_TestAPNims承载类型NR信号质量诊断技巧RSRP -85dBm时可稳定连接SINR 5时需调整天线位置若出现IMS注册失败尝试关闭VoLTE功能5. 系统联调与故障排除5.1 启动顺序黄金法则核心网组件严格顺序docker-compose -f docker-compose-mini-nonrf.yaml up mysql docker-compose -f docker-compose-mini-nonrf.yaml up oai-amf docker-compose -f docker-compose-mini-nonrf.yaml up oai-smf基站侧sudo ./nr-softmodem -E --sa -O gnb.conf终端侧开启飞行模式等待30秒关闭飞行模式立即检查信号图标5.2 常见问题速查表现象可能原因排查工具有信号无数据DNN不匹配Wireshark过滤HTTP/ICMP频繁掉线时钟不同步uhd_fft -a clockexternal手机显示5G但无法注册PLMN配置错误AMF日志检查S1AP消息上行速率异常低功率限制过严uhd_usrp_probe查看增益6. 进阶优化从能用到好用6.1 性能调优参数gNB线程绑定配置# gnb.conf executionName gnb cpuAffinity [ { execName L1-PHY, cpu 2 } { execName L2-MAC, cpu 3 } { execName RRC, cpu 4 } ]USRP缓冲区优化sudo sysctl -w net.core.rmem_max2097152 sudo sysctl -w net.core.wmem_max20971526.2 真实业务测试方案iperf3服务器配置docker run -p 5201:5201 -it networkstatic/iperf3 -s手机端测试命令# 需提前安装Termux iperf3 -c 192.168.12.1 -t 30 -i 1 -R # 测试下载 iperf3 -c 192.168.12.1 -t 30 -i 1 # 测试上传典型性能预期B21020MHz带宽单用户下行~65Mbps单用户上行~28Mbps端到端时延15ms