Добрый день, уважаемые хабровчане!
Сегодня и в последующие дни я сделаю перевод статей о развертывании архитектуры сетей 5G для дальнейшего ее изучения. Цель этой статьи - показать, что самые передовые технологии доступны всем и каждому, и что будущее можно создавать своими руками и не ждать. Я верю, что инженерный состав в нашей стране, это талантливые люди, которые могут нивелировать технологическое отставание, которое мы упустили за прошедшие 30 лет.
Напутствие
В этом посте я расскажу о развертывании базовой сети 5G с помощью Open5GS, которая представляет собой реализацию базовой мобильной сети 5G с открытым исходным кодом. Для тестирования функций базовой сети 5G я использовал UERANSIM, симулятор 5G UE и RAN (gNodeB) с открытым исходным кодом. Все исходные коды/развертывания, связанные с этим постом, доступны на gitlab. Пожалуйста, клонируйте репозиторий. В этом посте я установил Open5GS как службу демона Linux. В следующем посте я расскажу об установке Open5GS с Kubernets и Helm Charts.
Архитектура 5G
Мобильная сеть 5-го поколения (5G) — это новый глобальный стандарт беспроводной связи после сетей 1G, 2G, 3G и 4G. 5G обеспечивает новый тип сети, предназначенный для соединения практически всех и всего, включая машины, объекты и устройства. Беспроводная технология 5G предназначена для обеспечения более высокой пиковой скорости передачи данных в несколько Гбит/с, сверхнизкой задержки, большей надежности, большой пропускной способности сети, повышенной доступности и более единообразного пользовательского интерфейса для большего числа пользователей. Более высокая производительность и повышенная эффективность расширяют возможности пользователей и объединяют новые отрасли.
Партнерский проект 3GPP определяет стандарты для 5G. 3GPP — это общий термин для ряда организаций по стандартизации, разрабатывающих протоколы для мобильной связи. Согласно 3GPP система 5G (5GS) будет состоять из трех основных компонентов
Пользовательское оборудование (UE)
Сеть радиодоступа 5G (5G-RAN)
Базовая сеть 5G (5GC)
UE — это устройства с поддержкой 5G (пользовательское оборудование). 5G-RAN (также известный как gNB) — это тип сетевой инфраструктуры, обычно используемый для мобильных сетей, состоящих из базовых радиостанций с большими антеннами. RAN беспроводным способом подключает пользовательское оборудование к базовой сети. Базовая сеть 5G упрощает различные сетевые функции, такие как управление сеансами, аутентификация, контроль политик, хранение данных и т. д. Доступно несколько реализаций базовой сети 5G с открытым исходным кодом. Free5GC, Open5GS — две самые популярные реализации базовой сети 5G.
Архитектура 5G Core
В отличие от предыдущих сотовых сетей, архитектура базовой сети 5G разработана с использованием виртуализации сетевых функций и программно-определяемой сети. В основном базовая сеть 5G разработана с использованием шаблона проектирования на основе микросервисов. Различные службы данных и требования 5GC (также называемые сетевыми функциями) реализованы в виде микросервисов. Эти микросервисы (сетевые функции) будут развернуты как собственные облачные приложения. Базовая система 5G состоит из следующих сетевых функций (NF). Эти функции разделены на две основные плоскости: плоскость управления и плоскость пользователя:
User plane Function (UPF)
Data network (DN), e.g. operator services, Internet access or 3rd party services
Core Access and Mobility Management Function (AMF)
Authentication Server Function (AUSF)
Session Management Function (SMF)
Network Slice Selection Function (NSSF)
Network Exposure Function (NEF)
NF Repository Function (NRF)
Policy Control function (PCF)
Unified Data Management (UDM)
Application Function (AF)
Взаимодействие этих сервисов (с UE и 5G-RAN) и их соответствующие интерфейсы описаны на следующем рисунке. При развертывании базовой сети 5G мы в основном развертываем все эти сервисы в облаке как собственное облачное приложение.
Open5GS
Open5GS — это реализация базовой мобильной сети 5G с открытым исходным кодом. Конечной целью этого проекта является реализация базовой сети 5G, определенной в выпуске 3GPP. В настоящее время он поддерживает выпуск 16 3GPP с предоставлением ядра 5G (AMF, SMF+PGW-c, UPF+PGW-u, PCF, UDR, UDM, сетевые функции AUSF, NRF) и сетевые функции Evolved Packet Core (MME, SGW-c, SGW-u, HSS и PCRF).
UERANSIM
UERANSIM — это реализация 5G UE и 5G RAN (gNodeB) с открытым исходным кодом. В общих чертах его можно рассматривать как мобильный телефон 5G и базовую станцию. С точки зрения UE/RAN существует 3 основных интерфейса:
интерфейс управления (между RAN и AMF)
пользовательский интерфейс (между RAN и UPF)
радиоинтерфейс (между UE и RAN)
UERANSIM поддерживает работу с базовыми сетями Open5GS и Free5GC 5G. Мы можем подключить UERANSIM к одной из этих сетей 5G Core и протестировать функциональность.
Развертывание ядра 5G
В этом сценарии я развернул базовую сеть 5G с Open5GS и смоделировал gNB/UE с помощью UERANSIM. Open5GS развернут на одном сервере (IP 172.31.13.16), а UERANSIM развернут на другом сервере (IP 172.31.13.37). Архитектура развертывания описана на следующем рисунке.
Ниже приведены основные шаги, которые необходимо выполнить при развертывании. Если вы настраиваете эту среду в облаке (например, AWS, gGloud), обязательно откройте все порты TCP и SCTP между серверами в локальной сети (связь gNB и AMF происходит через SCTP).
1. Install Open5GS
Open5GS может быть установлен как собственный сервис демона Linux. Также его можно развернуть с помощью Docker, Kubernetes и Helm Charts. Я развернул его как собственное сервисное приложение демона Linux. При его запуске сеть 5G работает как службы демона Linux. Ниже приведен способ установки Open5GS на server1.
# install open5gs as daemon service
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:open5gs/latest
sudo apt update
sudo apt install open5gs
2. Setup Open5GS
Я развертываю 5G Core и gNB на отдельных серверах. Поэтому мне нужно настроить адрес привязки NGAP для AMF (IP-адрес работающего ядра 5G) и адрес привязки GTPU для UPF (IP-адрес работающего ядра 5G). Тогда только gNB и UE смогут подключиться к базовой сети 5G. Если вы используете стек gNB и 5G Core на одном сервере, вам не нужно вносить эти изменения. Ниже приведены конфигурации, которые я сделал. После выполнения этих настроек я перезапустил службы AMF и UPF.
# amf config file locates in /etc/open5gs/amf.yaml
# ngap addr configured to 5g core server ip
amf:
sbi:
- addr: 127.0.0.5
port: 7777
ngap:
- addr: 172.31.10.16
---
# restart amf services
sudo systemctl restart open5gs-amfd
---
# amf logs can be found in /var/log/open5gs/amf.log
sudo tail -f /var/log/open5gs/amf.log
11/07 04:17:26.737: [amf] INFO: [Removed] Number of AMF-UEs is now 0 (../src/amf/context.c:1268)
11/07 04:17:26.738: [sctp] INFO: AMF terminate...done (../src/amf/app.c:42)
Open5GS daemon v2.3.6
11/07 04:17:26.762: [app] INFO: Configuration: '/etc/open5gs/amf.yaml' (../lib/app/ogs-init.c:129)
11/07 04:17:26.762: [app] INFO: File Logging: '/var/log/open5gs/amf.log' (../lib/app/ogs-init.c:132)
11/07 04:17:26.764: [sbi] INFO: nghttp2_server() [127.0.0.5]:7777 (../lib/sbi/nghttp2-server.c:144)
11/07 04:17:26.764: [amf] INFO: ngap_server() [172.31.10.16]:38412 (../src/amf/ngap-sctp.c:53)
11/07 04:17:26.764: [sctp] INFO: AMF initialize...done (../src/amf/app.c:33)
11/07 04:17:26.766: [amf] INFO: [9d83b430-3f81-41ec-9db3-4f03c19e0a68] NF registred [Heartbeat:10s] (../src/amf/nf-sm.c:198)
# upf config file locates in /etc/open5gs/upf.yaml
# gtpu addr configured to 5g core server ip
upf:
pfcp:
- addr: 127.0.0.7
gtpu:
- addr: 172.31.10.16
subnet:
- addr: 10.45.0.1/16
- addr: 2001:230:cafe::1/48
---
# restart upf services
sudo systemctl restart open5gs-upfd
---
# upf logs can be found in /var/log/open5gs/upf.log
sudo tail -f /var/log/open5gs/upf.log
11/07 04:18:19.224: [app] INFO: SIGTERM received (../src/main.c:53)
11/07 04:18:19.224: [app] INFO: Open5GS daemon terminating... (../src/main.c:212)
11/07 04:18:19.225: [upf] INFO: PFCP de-associated (../src/upf/pfcp-sm.c:178)
11/07 04:18:19.225: [upf] INFO: [Removed] Number of UPF-sessions is now 0 (../src/upf/context.c:190)
11/07 04:18:19.226: [app] INFO: UPF terminate...done (../src/upf/app.c:39)
Open5GS daemon v2.3.6
11/07 04:18:19.243: [app] INFO: Configuration: '/etc/open5gs/upf.yaml' (../lib/app/ogs-init.c:129)
11/07 04:18:19.243: [app] INFO: File Logging: '/var/log/open5gs/upf.log' (../lib/app/ogs-init.c:132)
11/07 04:18:19.256: [pfcp] INFO: pfcp_server() [127.0.0.7]:8805 (../lib/pfcp/path.c:30)
11/07 04:18:19.256: [gtp] INFO: gtp_server() [172.31.10.16]:2152 (../lib/gtp/path.c:30)
11/07 04:18:19.257: [app] INFO: UPF initialize...done (../src/upf/app.c:31)
11/07 04:18:22.553: [pfcp] INFO: ogs_pfcp_connect() [127.0.0.4]:8805 (../lib/pfcp/path.c:59)
11/07 04:18:22.553: [upf] WARNING: cannot handle PFCP message type[1] (../src/upf/pfcp-sm.c:139)
11/07 04:18:25.054: [pfcp] WARNING: [5341] REMOTE Request Duplicated. Discard! for step 1 type 1 peer [127.0.0.4]:8805 (../lib/pfcp/xact.c:403)
11/07 04:18:27.557: [pfcp] WARNING: [5341] REMOTE Request Duplicated. Discard! for step 1 type 1 peer [127.0.0.4]:8805 (../lib/pfcp/xact.c:403)
11/07 04:18:30.060: [upf] INFO: PFCP associated (../src/upf/pfcp-sm.c:173)
3. NAT Port Forwarding
Чтобы создать мост между 5G Core UPF и WAN (Интернет), мне нужно включить переадресацию IP и добавить правило NAT в таблицы IP. Ниже приведены перенаправления портов NAT, которые я сделал. Без этого порта переадресация подключения от 5G Core к Интернету не работала бы.
# nat port forwarding
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
sudo systemctl stop ufw
sudo iptables -I FORWARD 1 -j ACCEPT
# if above setup not works try to manually create tun interface and do nat forwarding
sudo ip tuntap add name ogstun mode tun
sudo ip addr add 10.45.0.1/16 dev ogstun
sudo ip addr add 2001:230:cafe::1/48 dev ogstun
sudo ip link set ogstun up
4. Register UE Device
Далее мне нужно зарегистрировать устройство UE на 5G Core. Open5GS предоставляет приложение WebUI. Я могу зарегистрировать устройство UE через подключение к WebUI. Ниже приведен способ как сделать это.
# install nodejs
sudo apt update
sudo apt install curl
curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt install nodejs
# clone webui
git clone https://github.com/open5gs/open5gs.git
# run webui with npm
cd webui
npm run dev --host 0.0.0.0
# the web interface will start on
http://localhost:3000
# webui login credentials
username - admin
password - 1423
# add new subscriber
# the default device information can be found in open5gs config on UERANSIM
IMSI: 901700000000001
Subscriber Key: 465B5CE8B199B49FAA5F0A2EE238A6BC
USIM Type: OPc
Operator Key: E8ED289DEBA952E4283B54E88E6183CA
WebUI запускается на порту 3000 на server1. Подключитесь к WebUI и войдите в систему с учетными данными admin/1423. Затем добавьте нового абонента с IMSI: 901700000000001 и другой информацией по умолчанию.
5. Install UERANSIM
Затем я установил UERANSIM на server2. Установка выполняется с помощью файла, доступного в репозитории URANSIM. Ниже приведен способ установки UERANSIM.
# install cmake
# UERANSIM does not work with the apt version of cmake, that's why we need to install snap and the snap version of cmake:
sudo apt update
sudo apt upgrade
sudo apt install make g++ libsctp-dev lksctp-tools
iproute2 sudo snap install cmake --classic
# install ueransim
git clone https://github.com/aligungr/UERANSIM
cd UERANSIM
make
6. Setup gNB
UERANSIM состоит из двух частей gNB и UE. Файлы конфигурации gNB, относящиеся к Open5GS, находятся в URANSIM/config/open5gs-gnb.yaml. Мне нужно настроить linkIp, ngapIp, gtpIp и amfConfigs: адрес в файле конфигурации. linkIp, ngapIp, gtpIp настроены с IP-адресом server2 (IP-адрес работающего сервера UERANSIM). amfConfigs: адрес — это IP-адрес server1 (IP-адрес работающего сервера Open5GC). gNB можно запустить с помощью сценария UERANSIM/build/nr-gnb, используя файл конфигурации UERANSIM/config/open5gs-gnb.yaml.
# configure with server1 IP
linkIp: 172.31.13.37 # gNB's local IP address for Radio Link Simulation (Usually same with local IP)
ngapIp: 172.31.13.37 # gNB's local IP address for N2 Interface (Usually same with local IP)
gtpIp: 172.31.13.37 # gNB's local IP address for N3 Interface (Usually same with local IP)
# list of AMF address information
# configure with server2 IP
amfConfigs:
- address: 172.31.10.16
port: 38412
---
# start gnb with open5gc-gnb.yaml config file
./build/nr-gnb -c config/open5gs-gnb.yaml
# output
UERANSIM v3.2.4
[2021-11-07 04:39:11.240] [sctp] [info] Trying to establish SCTP connection... (172.31.10.16:38412)
[2021-11-07 04:39:11.243] [sctp] [info] SCTP connection established (172.31.10.16:38412)
[2021-11-07 04:39:11.244] [sctp] [debug] SCTP association setup ascId[4]
[2021-11-07 04:39:11.244] [ngap] [debug] Sending NG Setup Request
[2021-11-07 04:39:11.245] [ngap] [debug] NG Setup Response received
[2021-11-07 04:39:11.245] [ngap] [info] NG Setup procedure is successful
7. Setup UE
Файлы конфигурации UERANSIM UE, относящиеся к Open5GS, находятся в UERANSIM/config/open5gs-ue.yaml. Мне нужно настроить gnbSearchList с IP-адресом server2 (IP-адрес работающего сервера UERANSIM). UE можно запустить с помощью сценария UERANSIM/build/nr-ue, используя файл конфигурации UERANSIM/config/open5gs-ue.yaml. Еще одна вещь, на которую следует обратить внимание, это то, что open5gs-ue.yaml определяет конфигурации устройств UE. Мы использовали эти конфигурации при регистрации подписчика в ядре Open5GC 5G через WebUI.
# ue device config
# IMSI number of the UE. IMSI = [MCC|MNC|MSISDN] (In total 15 digits)
supi: 'imsi-901700000000001'
# Mobile Country Code value of HPLMN
mcc: '901'
# Mobile Network Code value of HPLMN (2 or 3 digits)
mnc: '70'
# Permanent subscription key
key: '465B5CE8B199B49FAA5F0A2EE238A6BC'
# Operator code (OP or OPC) of the UE
op: 'E8ED289DEBA952E4283B54E88E6183CA'
# This value specifies the OP type and it can be either 'OP' or 'OPC'
opType: 'OPC'
# Authentication Management Field (AMF) value
amf: '8000'
# IMEI number of the device. It is used if no SUPI is provided
imei: '356938035643803'
# IMEISV number of the device. It is used if no SUPI and IMEI is provided
imeiSv: '4370816125816151'
# IMEISV number of the device. It is used if no SUPI and IMEI is provided
imeiSv: '4370816125816151'
---
# List of gNB IP addresses for Radio Link Simulation
# configure with server2 IP
gnbSearchList:
- 172.31.13.37
---
# start gnb with open5gc-ue.yaml config file
sudo ./build/nr-ue -c config/open5gs-ue.yaml
# output
UERANSIM v3.2.4
[2021-11-07 04:50:08.323] [nas] [info] UE switches to state [MM-DEREGISTERED/PLMN-SEARCH]
[2021-11-07 04:50:08.323] [rrc] [debug] New signal detected for cell[1], total [1] cells in coverage
[2021-11-07 04:50:08.323] [nas] [info] Selected plmn[901/70]
[2021-11-07 04:50:08.323] [rrc] [info] Selected cell plmn[901/70] tac[1] category[SUITABLE]
[2021-11-07 04:50:08.323] [nas] [info] UE switches to state [MM-DEREGISTERED/PS]
[2021-11-07 04:50:08.323] [nas] [info] UE switches to state [MM-DEREGISTERED/NORMAL-SERVICE]
[2021-11-07 04:50:08.323] [nas] [debug] Initial registration required due to [MM-DEREG-NORMAL-SERVICE]
[2021-11-07 04:50:08.324] [nas] [debug] UAC access attempt is allowed for identity[0], category[MO_sig]
[2021-11-07 04:50:08.324] [nas] [debug] Sending Initial Registration
[2021-11-07 04:50:08.324] [nas] [info] UE switches to state [MM-REGISTER-INITIATED]
[2021-11-07 04:50:08.324] [rrc] [debug] Sending RRC Setup Request
[2021-11-07 04:50:08.325] [rrc] [info] RRC connection established
[2021-11-07 04:50:08.325] [rrc] [info] UE switches to state [RRC-CONNECTED]
[2021-11-07 04:50:08.325] [nas] [info] UE switches to state [CM-CONNECTED]
[2021-11-07 04:50:08.330] [nas] [debug] Authentication Request received
[2021-11-07 04:50:08.333] [nas] [debug] Security Mode Command received
[2021-11-07 04:50:08.333] [nas] [debug] Selected integrity[2] ciphering[0]
[2021-11-07 04:50:08.339] [nas] [debug] Registration accept received
[2021-11-07 04:50:08.339] [nas] [info] UE switches to state [MM-REGISTERED/NORMAL-SERVICE]
[2021-11-07 04:50:08.339] [nas] [debug] Sending Registration Complete
[2021-11-07 04:50:08.339] [nas] [info] Initial Registration is successful
[2021-11-07 04:50:08.339] [nas] [debug] Sending PDU Session Establishment Request
[2021-11-07 04:50:08.339] [nas] [debug] UAC access attempt is allowed for identity[0], category[MO_sig]
[2021-11-07 04:50:08.542] [nas] [debug] Configuration Update Command received
[2021-11-07 04:50:08.551] [nas] [debug] PDU Session Establishment Accept received
[2021-11-07 04:50:08.551] [nas] [info] PDU Session establishment is successful PSI[1]
[2021-11-07 04:50:08.560] [app] [info] Connection setup for PDU session[1] is successful, TUN interface[uesimtun0, 10.45.0.5] is up.
8. Test 5G Network
При запуске UERANSIM UE он создает сеанс PDU и сетевой интерфейс TUN uesimtun0. Вы можете найти IP-адрес сеанса PDU и адрес TUN в журналах UE (интерфейс TUN [uesimtun0, 10.45.0.3]). Мы можем использовать интернет-соединение UE из другого приложения через этот интерфейс TUN. Например, если мы используем простую команду curl с интерфейсом uesimtun0 (например, curl --interface uesimtun0 "https://httpbin.org/get"), она направит пакет в Интернет через базовую сеть Open5GC 5G, как показано на следующей диаграмме.
Кроме того, UERANSIM предоставляет инструмент UERANSIM/build/nr-binder для привязки внешних приложений к интерфейсу TUN. Мы можем привязать интерфейс uesimtun0 практически к любому приложению, используя UERANSIM/build/nr-binder. Ниже приведен способ использования UERANSIM/build/nr-binder с различными приложениями. Я тестировал его с приложениями ping, curl, docker, python.
# ping command bind direcly to uesimtun0
ping -I uesimtun0 google.com
# curl command bind direcly to uesimtun0
curl \
--interface uesimtun0 \
-X GET "https://httpbin.org/get"
---
# bind curl command via nr-binder
# nr-binder use pdu session ip
./nr-binder 10.45.0.3 curl -X GET "https://httpbin.org/get"
---
# run docker container via nr-binder
./nr-binder 10.45.0.3 docker run -d -p 9091:80 kennethreitz/httpbin
---
# bind python application via nr-binder
# request.pyt is simple python program which send http GET request
./nr-binder 10.45.0.3 python3 request.py
---
# bind shell scrip via nr-binder
# httpbin.sh is simple shell script which runs httpbin as docker container
./nr-binder 10.45.0.3 ./httpbin.sh
9. Image Streaming via 5G Core
В приведенной выше настройке интерфейс UERANSIM UE TUN (uesimtun0) может быть доступен только через работающую машину UERANSIM. Это означает, что мы можем подключиться к базовой сети 5G только с работающей машины UERANSIM. В моем сценарии я хотел передавать изображения на TCP-сервер (который находится в общедоступном Интернете) от внешнего клиента (который находится за пределами сервера URANSIM) через базовую сеть 5G. Примером сценария может быть потоковая передача изображений с устройства виртуальной реальности на сервер потоковой передачи через базовую сеть 5G. Чтобы добиться этой настройки, я применил обходной путь, используя прокси-сервер TCP. Ниже приведена архитектура установки.
Служба UERANSIM работает на сервере с публичным IP 3.237.100.204. Служба потоковой передачи изображений работает на сервере с общедоступным IP-адресом 100.27.44.103. Я запустил прокси-сервер TCP на порту 7654 внутри сервера 3.237.100.204. Служба потоковой передачи изображений работает на порту 7654 на сервере 100.27.44.103. Прокси-сервер TCP перенаправляет входящие пакеты с 3.237.100.204:7654 на 100.27.44.103:7654. Я использовал следующую команду docker для запуска прокси-сервера TCP.
# tcp proxy server forward the incoming traffic of port 7654 to 100.27.44.103:7654
docker run -d -it --rm -p 7654:7654 hpello/tcp-proxy 100.27.44.103 7654
Эта команда докера добавляется в сценарий оболочки с именем tcp-proxy.sh и запускается с помощью nr-binder. Затем весь трафик прокси-сервиса TCP проходит через базовую сеть 5G.
# run tcp proxy server with nr-biner
# all traffic of tcp proxy server will goes through the 5g core
sudo ./nr-binder 10.45.0.13 ./tcp-proxy.sh
Ниже приведен простой сервер потоковой передачи изображений, написанный на Python. Он прослушивает порт 7654 и входящие изображения, сохраненные в вызываемом каталоге. Я запустил потоковый сервер с помощью команды python3 stream-server.py.
import socket
import time
s = socket.socket()
host = socket.gethostname()
port = 7654
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print('Got connection from', addr)
# create image file
n = 'out/' + str(int(time.time())) + '.png'
f = open(n,'wb')
# recive image
l = c.recv(1024)
while (l):
f.write(l)
l = c.recv(1024)
f.close()
print('Done Receiving')
c.close()
Ниже приведено клиентское приложение потоковой передачи изображений, написанное с помощью Python. Он считывает образ с диска и отправляет потоки на прокси-сервер TCP, который работает на сервере 3.237.100.204:7654. Затем прокси-сервер перенаправляет потоки изображений на сервер потоковой передачи изображений 100.27.44.103:7654 через базовую сеть 5G. Я запустил клиент потоковой передачи с помощью команды python3 stream-client.py.
import socket
# client socker
s = socket.socket()
host = '3.237.100.204'
port = 7654
s.connect((host, port))
print('Connected to server')
# send image
f = open('hak.png','rb')
l = f.read(1024)
while (l):
s.send(l)
l = f.read(1024)
print('Sent image')
# image sent close connection
f.close()
s.close
Reference
Комментарии (2)
d1024
01.01.2023 18:38+1Я так понимаю, что самая главная часть - 5G трансивер в виде железки - недоступна и будет доступна энтузиастам нескоро. В чем может быть практический интерес в ковырянии некого стека? Что с этим можно сделать?
RranAmaru
Очень интересно, но
ничего не понялнужен ликбез по 5G, в том числе обзор по железу. А еще про базовые станции. И как поднять свою точку и т.п.