Приветствую всех!
Пожалуй, самой закрытой технологией в пользовательском сегменте является сотовая связь. Очень немногие знают о том, как на самом деле работают телефоны и модемы, отчего им часто приписывают всякие мифические свойства. Как насчёт попробовать запустить полностью открытую реализацию модема стандарта 4G? Именно этим я и предлагаю заняться.

Итак, в сегодняшней статье поговорим о том, как взаимодействовать с мобильной сетью при помощи SDR. Попутно узнаем, какой софт для этого существует, и соберём самый дорогой 4G-модем в истории.
Традиционно будет много интересного.
В начале года я рассматривал запуск домашней сети 4G на базе софта srsRAN и подключал к ней обычные телефоны. Сегодня мы посмотрим на эту задачу с противоположной стороны — создадим устройство, которое будет видеть сеть оператора и получать от неё данные. А заодно и подключим компьютер к мобильному интернету без использования заводского телефона или модема.
Как я уже говорил, открытая реализация 4G не одна. Но по части «пользовательских» устройств всё несколько беднее — есть софт GR-LTE (который, правда, служит для декодирования сигналов LTE, а не для работы с сетью), а также srsUE от всё того же Software Radio Systems (srsRAN). Последний нам и нужен: это полноценная софтовая реализация LTE-модема. Изначально это ПО предназначалось для совместной работы с srsENB, то есть предполагалось, что у вас есть два ПК, на одном из которых запущена БС (eNodeB), а на другом — абонентское устройство (User Equipment). Такая связка позволяет анализировать всю работу сети полностью. Но второго SDR у меня нет, так что поговорим о самом интересном: как подключиться при помощи этого софта к обычной сети и, на этот раз, раздать интернет на компьютер.
Если у вас нет SDR, то можно воспользоваться эмулятором БС, который также описан на сайте srsRAN.
Самое время определиться с оборудованием. Итак, для проведения опытов понадобится примерно следующий набор:
GPS-DO или другой подобный источник стабильной частоты, в отличие от БС, использовать необязательно.

Перво-наперво идёт, конечно, сам SDR — USRP B200mini-i и комплект антенн к нему.

Считыватель.


Такой экземпляр можно встретить в любом месте, где есть какие-то СКЗИ или авторизация по смарт-карте, то есть практически повсеместно. Если под рукой такого нет, его можно легко купить, благо стоит он всего-ничего.


А вот пример тех, которые не подойдут — пин-пады со считывателями карт, а также проприетарные девайсы.
В общем-то, больше ничего примечательного сегодня не потребуется.
По умолчанию srsUE не поддерживает работу со считывателем смарт-карт, поэтому его необходимо пересобрать из исходников. Именно этим мы сейчас и займёмся.
Для начала устанавливаем зависимости:
Для запуска я рекомендую использовать дистрибутив DragonOS. Там уже установлены все необходимые зависимости. В случае использования именно его первую строчку надо пропустить. Второй строчкой устанавливаем библиотеки и софт для работы со смарт-картами.
Теперь клонируем и собираем:
Если у вас уже есть какие-то файлы конфигурации (в частности, по пути /etc/srsran), то перед началом опытов их надо снести. Как обычно, на случай, если у вас вдруг возникнут проблемы при компиляции, ссылку на уже готовый софт я оставлю тут.
Теперь подключаем к компьютеру SDR и делаем тестовый запуск:

Если после этого софт не вылетел, а в консоли появилось «Attaching UE...», значит, мы на правильном пути.
На сайте srsRAN всё описывается просто — запустить ПО с единственным параметром, и в путь. На деле этого недостаточно: если в srsEPC имеются некоторые допущения, то коммерческая сеть ошибок не прощает и криво сконфигурированный UE принимать не будет. Так что перед тем, как приступить к «боевому» запуску, нужно настроить параметры конфигурации. Лежат они по пути /root/.config/srsran/ue.conf.
Открываем этот файл и приводим его к следующему виду:
Разберёмся с параметрами, которые нужно изменить.
srsUE не проходится по всем доступным ему каналам, как это делает телефон. Поэтому для работы необходимо указать EARFCN, на котором работает вышка оператора.

На телефоне открываем Net Monitor и запоминаем номер канала от БС с хорошим сигналом, после чего заносим его в качестве значения параметра. Также надо отрубить запрос ПИНа у симки, либо указать ПИН в соответствующем поле в конфиге.

Далее в телефоне открываем раздел «Точки доступа». Нас интересует APN, логин и пароль, которые тоже необходимо узнать и забить.

В моём случае параметры оказались такие: APN — internet.mts.ru, логин — mts, пароль — mts.

Также эти данные можно найти в интернете, они есть на сайте любого оператора.

Отдельным пунктом стоит упомянуть IMEI. Обычно он прошивается на заводе и не меняется (либо вообще, либо только с помощью специального софта). Но, как нетрудно догадаться, srsUE является этаким «сферическим в вакууме» девайсом, поэтому IMEI нужно задать самому, например, сгенерировать случайный для любой понравившейся модели телефона.

Другим вариантом будет использование IMEI от настоящего телефона. Набираем код *#06#, и на экране появляются заветные цифры. Очень важно: никогда не допускайте одновременной работы srsUE и телефона, IMEI которого вы взяли!
Теперь разберёмся с подключением симки к компьютеру. Для этого понадобится ранее показанный считыватель смарт-карт.

Но есть один нюанс — большинство из них предназначены для полноразмерных карт, отчего потребуется специальный переходник, чтобы вставить в него симку. Если его нет, то берём новую симку и засовываем её вместе с пластмассовой картой.
Теперь подключаем считыватель к компу и выполняем следующую команду:
Если софт для работы со смарт-картами установлен правильно, а симка установлена в считыватель, то на экране отобразится примерно следующее:

Двигаемся дальше. Убедимся, что симка работает корректно и читается, для чего переходим в папку с собранным srsRAN и выполняем команды:

В консоли можно будет увидеть обмен данных с симкой.
Ну что, самое время пробовать. На компьютере отрубаем Wi-Fi и LAN, после чего подключаем SDR и запускаем софт:

Начнётся стандартная процедуза загрузки прошивки в оперативную память SDR.

После этого srsUE перейдёт в рабочий режим. И, если всё было сделано правильно, через несколько секунд софт найдёт сеть, а компьютер получит IP-адрес. При этом ОС выдаст уведомление о новом подключении.

При подключении может возникнуть проблема, что при попытке подключения сеть отваливается. Мне неведомо, с чем это связано, в некоторых источниках удалось выяснить, что причина этому — нехватка пропускной способности SDR. В таком случае нужно попробовать другую вышку или другого оператора (по закону подлости МТС, с которого я только звоню, у меня подключался стабильно, а Теле2, симка которого у меня с пакетом гигабайт, только через раз).

Если в консоли сыпется бесконечное «Found cell...», значит, не проходит аутентификация. В моём случае это было вызвано специально — для проверки я вставил в считыватель дохлую симку.

Теперь, когда подключение работает, можно выйти в сеть.

Ping работает успешно.

Да и страницы тоже открываются отлично.

А вот и Speedtest, показывающий, что оператор у меня Tele2, а не домашняя «Интерсвязь».

Для проверки стабильности связи я, как и в случае с БС, открыл на компе YouTube и запустил часовое видео в хорошем качестве. Как оказалось, даже на Tele2 при успешном подключении сеть ловится весьма приемлемо.
Как и ожидалось, подключить компьютер к интернету при помощи обычного SDR оказалось даже проще, чем поднять сеть. Коммерческие БС имеют хороший сигнал, поэтому сеть нормально ловится даже с не слишком хорошими антеннами. Впрочем, как оказалось, некоторые нюансы (увы, не зависящие от нас) всё равно есть, так что в идеале запастись симками сразу нескольких операторов: хоть один точно заработает. В остальном же это полностью рабочая реализация сотового модема, которую не составляет труда запустить при наличии оборудования.
Такие дела.
Возможно, захочется почитать и это:
Пожалуй, самой закрытой технологией в пользовательском сегменте является сотовая связь. Очень немногие знают о том, как на самом деле работают телефоны и модемы, отчего им часто приписывают всякие мифические свойства. Как насчёт попробовать запустить полностью открытую реализацию модема стандарта 4G? Именно этим я и предлагаю заняться.

Итак, в сегодняшней статье поговорим о том, как взаимодействовать с мобильной сетью при помощи SDR. Попутно узнаем, какой софт для этого существует, и соберём самый дорогой 4G-модем в истории.
Традиционно будет много интересного.
❯ Суть такова
В начале года я рассматривал запуск домашней сети 4G на базе софта srsRAN и подключал к ней обычные телефоны. Сегодня мы посмотрим на эту задачу с противоположной стороны — создадим устройство, которое будет видеть сеть оператора и получать от неё данные. А заодно и подключим компьютер к мобильному интернету без использования заводского телефона или модема.
❯ Что за софт мы будем использовать?
Как я уже говорил, открытая реализация 4G не одна. Но по части «пользовательских» устройств всё несколько беднее — есть софт GR-LTE (который, правда, служит для декодирования сигналов LTE, а не для работы с сетью), а также srsUE от всё того же Software Radio Systems (srsRAN). Последний нам и нужен: это полноценная софтовая реализация LTE-модема. Изначально это ПО предназначалось для совместной работы с srsENB, то есть предполагалось, что у вас есть два ПК, на одном из которых запущена БС (eNodeB), а на другом — абонентское устройство (User Equipment). Такая связка позволяет анализировать всю работу сети полностью. Но второго SDR у меня нет, так что поговорим о самом интересном: как подключиться при помощи этого софта к обычной сети и, на этот раз, раздать интернет на компьютер.
Если у вас нет SDR, то можно воспользоваться эмулятором БС, который также описан на сайте srsRAN.
Внимание!
В данной статье описывается взаимодействие с коммерческими сотовыми сетями. Правильно настроенный софт никак не мешает их работе, но вы в любом случае должны иметь представление о том, что собираетесь сделать.
❯ Что нужно, чтобы запустить эмулятор модема?
Самое время определиться с оборудованием. Итак, для проведения опытов понадобится примерно следующий набор:
- Компьютер с Linux. Как и в прошлых опытах, машина должна быть достаточно мощной, чтобы обрабатывать данные с SDR. Также обязателен порт USB 3.0.
- SDR. Именно из-за него статья имеет класс «Сложный», так как подобные устройства весьма дороги и есть не у всех. Подойдут всё те же модели, что годятся для eNodeB: USRP, BladeRF или любой другой, совместимый с драйвером SoapySDR. Также srsRAN можно пересобрать под LimeSDR, но ввиду того, что такого девайса у меня нет, я не интересовался, как это сделать.
- Антенны для SDR. В идеале — те, которые специально рассчитаны на использование в сетях 3G/4G.
- Симка. Лучше, если их будет несколько, разных операторов, так как с какими-то работает стабильно, а с какими-то — не очень. Само собой, карта должна быть живая и с ненулевым балансом.
- Считыватель смарт-карт. Обязательно совместимый со стандартом PC/SC, иначе работать не будет. Всякие китайские «SIM card reader» с проприетарным софтом не подойдут.
- Телефон. Непосредственно в запуске он участия принимать не будет, но для подготовки понадобится.
GPS-DO или другой подобный источник стабильной частоты, в отличие от БС, использовать необязательно.
❯ Обзор оборудования

Перво-наперво идёт, конечно, сам SDR — USRP B200mini-i и комплект антенн к нему.

Считыватель.


Такой экземпляр можно встретить в любом месте, где есть какие-то СКЗИ или авторизация по смарт-карте, то есть практически повсеместно. Если под рукой такого нет, его можно легко купить, благо стоит он всего-ничего.


А вот пример тех, которые не подойдут — пин-пады со считывателями карт, а также проприетарные девайсы.
В общем-то, больше ничего примечательного сегодня не потребуется.
❯ Ставим софт
По умолчанию srsUE не поддерживает работу со считывателем смарт-карт, поэтому его необходимо пересобрать из исходников. Именно этим мы сейчас и займёмся.
Для начала устанавливаем зависимости:
sudo apt-get install build-essential cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libconfig++-dev libsctp-dev
sudo apt-get install libpcsclite-dev pcscd pcsc-tools
Для запуска я рекомендую использовать дистрибутив DragonOS. Там уже установлены все необходимые зависимости. В случае использования именно его первую строчку надо пропустить. Второй строчкой устанавливаем библиотеки и софт для работы со смарт-картами.
Теперь клонируем и собираем:
git clone https://github.com/srsRAN/srsRAN_4G.git
cd srsRAN_4G
mkdir build
cd build
cmake ../
make
sudo make install
srsran_install_configs.sh user
Если у вас уже есть какие-то файлы конфигурации (в частности, по пути /etc/srsran), то перед началом опытов их надо снести. Как обычно, на случай, если у вас вдруг возникнут проблемы при компиляции, ссылку на уже готовый софт я оставлю тут.
Теперь подключаем к компьютеру SDR и делаем тестовый запуск:
cd srsue/src
sudo ./srsue

Если после этого софт не вылетел, а в консоли появилось «Attaching UE...», значит, мы на правильном пути.
❯ Конфигурация
На сайте srsRAN всё описывается просто — запустить ПО с единственным параметром, и в путь. На деле этого недостаточно: если в srsEPC имеются некоторые допущения, то коммерческая сеть ошибок не прощает и криво сконфигурированный UE принимать не будет. Так что перед тем, как приступить к «боевому» запуску, нужно настроить параметры конфигурации. Лежат они по пути /root/.config/srsran/ue.conf.
Открываем этот файл и приводим его к следующему виду:
ue.conf
#####################################################################
# srsUE configuration file
#####################################################################
#####################################################################
# RF configuration
#
# freq_offset: Uplink and Downlink optional frequency offset (in Hz)
# tx_gain: Transmit gain (dB).
# rx_gain: Optional receive gain (dB). If disabled, AGC if enabled
# srate: Optional fixed sampling rate (Hz), corresponding to cell bandwidth. Must be set for 5G-SA.
#
# nof_antennas: Number of antennas per carrier (all carriers have the same number of antennas)
# device_name: Device driver family. Supported options: "auto" (uses first found), "UHD" or "bladeRF"
# device_args: Arguments for the device driver. Options are "auto" or any string.
# Default for UHD: "recv_frame_size=9232,send_frame_size=9232"
# Default for bladeRF: ""
# device_args_2: Arguments for the RF device driver 2.
# device_args_3: Arguments for the RF device driver 3.
# time_adv_nsamples: Transmission time advance (in number of samples) to compensate for RF delay
# from antenna to timestamp insertion.
# Default "auto". B210 USRP: 100 samples, bladeRF: 27.
# continuous_tx: Transmit samples continuously to the radio or on bursts (auto/yes/no).
# Default is auto (yes for UHD, no for rest)
#####################################################################
[rf]
freq_offset = 0
tx_gain = 80
rx_gain = 40
srate = 23.04e6
#nof_antennas = 1
# For best performance in 2x2 MIMO and >= 15 MHz use the following device_args settings:
# USRP B210: num_recv_frames=64,num_send_frames=64
# For best performance when BW<5 MHz (25 PRB), use the following device_args settings:
# USRP B210: send_frame_size=512,recv_frame_size=512
#device_args = auto
#time_adv_nsamples = auto
#continuous_tx = auto
# Example for ZMQ-based operation with TCP transport for I/Q samples
#device_name = zmq
#device_args = tx_port=tcp://*:2001,rx_port=tcp://localhost:2000,id=ue,base_srate=23.04e6
#####################################################################
# EUTRA RAT configuration
#
# dl_earfcn: Downlink EARFCN list.
#
# Optional parameters:
# dl_freq: Override DL frequency corresponding to dl_earfcn
# ul_freq: Override UL frequency corresponding to dl_earfcn
# nof_carriers: Number of carriers
#####################################################################
[rat.eutra]
dl_earfcn = 3250
#nof_carriers = 1
#####################################################################
# NR RAT configuration
#
# Optional parameters:
# bands: List of support NR bands seperated by a comma (default 78)
# nof_carriers: Number of NR carriers (must be at least 1 for NR support)
#####################################################################
[rat.nr]
# bands = 78
# nof_carriers = 0
#####################################################################
# Packet capture configuration
#
# Packet capture is supported at the MAC, MAC_NR, and NAS layer.
# MAC-layer packets are captured to file a the compact format decoded
# by the Wireshark. For decoding, use the UDP dissector and the UDP
# heuristic dissection. Edit the preferences (Edit > Preferences >
# Protocols > DLT_USER) for DLT_USER to add an entry for DLT=149 with
# Protocol=udp. Further, enable the heuristic dissection in UDP under:
# Analyze > Enabled Protocols > MAC-LTE > mac_lte_udp and MAC-NR > mac_nr_udp
# For more information see: https://wiki.wireshark.org/MAC-LTE
# Using the same filename for mac_filename and mac_nr_filename writes both
# MAC-LTE and MAC-NR to the same file allowing a better analysis.
# NAS-layer packets are dissected with DLT=148, and Protocol = nas-eps.
#
# enable: Enable packet captures of layers (mac/mac_nr/nas/none) multiple option list
# mac_filename: File path to use for MAC packet capture
# mac_nr_filename: File path to use for MAC NR packet capture
# nas_filename: File path to use for NAS packet capture
#####################################################################
[pcap]
enable = none
mac_filename = /tmp/ue_mac.pcap
mac_nr_filename = /tmp/ue_mac_nr.pcap
nas_filename = /tmp/ue_nas.pcap
#####################################################################
# Log configuration
#
# Log levels can be set for individual layers. "all_level" sets log
# level for all layers unless otherwise configured.
# Format: e.g. phy_level = info
#
# In the same way, packet hex dumps can be limited for each level.
# "all_hex_limit" sets the hex limit for all layers unless otherwise
# configured.
# Format: e.g. phy_hex_limit = 32
#
# Logging layers: rf, phy, mac, rlc, pdcp, rrc, nas, gw, usim, stack, all
# Logging levels: debug, info, warning, error, none
#
# filename: File path to use for log output. Can be set to stdout
# to print logs to standard output
# file_max_size: Maximum file size (in kilobytes). When passed, multiple files are created.
# If set to negative, a single log file will be created.
#####################################################################
[log]
all_level = warning
phy_lib_level = none
all_hex_limit = 32
filename = /tmp/ue.log
file_max_size = -1
#####################################################################
# USIM configuration
#
# mode: USIM mode (soft/pcsc)
# algo: Authentication algorithm (xor/milenage)
# op/opc: 128-bit Operator Variant Algorithm Configuration Field (hex)
# - Specify either op or opc (only used in milenage)
# k: 128-bit subscriber key (hex)
# imsi: 15 digit International Mobile Subscriber Identity
# imei: 15 digit International Mobile Station Equipment Identity
# pin: PIN in case real SIM card is used
# reader: Specify card reader by it's name as listed by 'pcsc_scan'. If empty, try all available readers.
#####################################################################
[usim]
mode = pcsc
#reader =
pin = 0000
imei = 352406718839858
#####################################################################
# RRC configuration
#
# ue_category: Sets UE category (range 1-5). Default: 4
# release: UE Release (8 to 15)
# feature_group: Hex value of the featureGroupIndicators field in the
# UECapabilityInformation message. Default 0xe6041000
# mbms_service_id: MBMS service id for autostarting MBMS reception
# (default -1 means disabled)
# mbms_service_port: Port of the MBMS service
# nr_measurement_pci: NR PCI for the simulated NR measurement. Default: 500
# nr_short_sn_support: Announce PDCP short SN support. Default: true
#####################################################################
[rrc]
ue_category = 1
#release = 8
#feature_group = 0xe6041000
#mbms_service_id = -1
#mbms_service_port = 4321
#####################################################################
# NAS configuration
#
# apn: Set Access Point Name (APN)
# apn_protocol: Set APN protocol (IPv4, IPv6 or IPv4v6.)
# user: Username for CHAP authentication
# pass: Password for CHAP authentication
# force_imsi_attach: Whether to always perform an IMSI attach
# eia: List of integrity algorithms included in UE capabilities
# Supported: 1 - Snow3G, 2 - AES, 3 - ZUC
# eea: List of ciphering algorithms included in UE capabilities
# Supported: 0 - NULL, 1 - Snow3G, 2 - AES, 3 - ZUC
#####################################################################
[nas]
apn = internet.mts.ru
apn_protocol = ipv4
user = mts
pass = mts
#force_imsi_attach = false
#eia = 1,2,3
#eea = 0,1,2,3
#####################################################################
# Slice configuration
#
# enable: Enable a specific slice
# nssai-sst: Specfic Slice Type
# nssai-sd: Slice diffentiator
#####################################################################
[slicing]
#enable = false
#nssai-sst = 1
#nssai-sd = 1
#####################################################################
# GW configuration
#
# netns: Network namespace to create TUN device. Default: empty
# ip_devname: Name of the tun_srsue device. Default: tun_srsue
# ip_netmask: Netmask of the tun_srsue device. Default: 255.255.255.0
#####################################################################
[gw]
#netns =
#ip_devname = tun_srsue
#ip_netmask = 255.255.255.0
#####################################################################
# GUI configuration
#
# Simple GUI displaying PDSCH constellation and channel freq response.
# (Requires building with srsGUI)
# enable: Enable the graphical interface (true/false)
#####################################################################
[gui]
enable = false
#####################################################################
# Channel emulator options:
# enable: Enable/Disable internal Downlink/Uplink channel emulator
#
# -- AWGN Generator
# awgn.enable: Enable/disable AWGN generator
# awgn.snr: SNR in dB
# awgn.signal_power: Received signal power in decibels full scale (dBfs)
#
# -- Fading emulator
# fading.enable: Enable/disable fading simulator
# fading.model: Fading model + maximum doppler (E.g. none, epa5, eva70, etu300, etc)
#
# -- Delay Emulator delay(t) = delay_min + (delay_max - delay_min) * (1 + sin(2pi*t/period)) / 2
# Maximum speed [m/s]: (delay_max - delay_min) * pi * 300 / period
# delay.enable: Enable/disable delay simulator
# delay.period_s: Delay period in seconds.
# delay.init_time_s: Delay initial time in seconds.
# delay.maximum_us: Maximum delay in microseconds
# delay.minumum_us: Minimum delay in microseconds
#
# -- Radio-Link Failure (RLF) Emulator
# rlf.enable: Enable/disable RLF simulator
# rlf.t_on_ms: Time for On state of the channel (ms)
# rlf.t_off_ms: Time for Off state of the channel (ms)
#
# -- High Speed Train Doppler model simulator
# hst.enable: Enable/Disable HST simulator
# hst.period_s: HST simulation period in seconds
# hst.fd_hz: Doppler frequency in Hz
# hst.init_time_s: Initial time in seconds
#####################################################################
[channel.dl]
#enable = false
[channel.dl.awgn]
#enable = false
#snr = 30
[channel.dl.fading]
#enable = false
#model = none
[channel.dl.delay]
#enable = false
#period_s = 3600
#init_time_s = 0
#maximum_us = 100
#minimum_us = 10
[channel.dl.rlf]
#enable = false
#t_on_ms = 10000
#t_off_ms = 2000
[channel.dl.hst]
#enable = false
#period_s = 7.2
#fd_hz = 750.0
#init_time_s = 0.0
[channel.ul]
#enable = false
[channel.ul.awgn]
#enable = false
#n0 = -30
[channel.ul.fading]
#enable = false
#model = none
[channel.ul.delay]
#enable = false
#period_s = 3600
#init_time_s = 0
#maximum_us = 100
#minimum_us = 10
[channel.ul.rlf]
#enable = false
#t_on_ms = 10000
#t_off_ms = 2000
[channel.ul.hst]
#enable = false
#period_s = 7.2
#fd_hz = -750.0
#init_time_s = 0.0
#####################################################################
# PHY configuration options
#
# rx_gain_offset: RX Gain offset to add to rx_gain to calibrate RSRP readings
# prach_gain: PRACH gain (dB). If defined, forces a gain for the tranmsission of PRACH only.,
# Default is to use tx_gain in [rf] section.
# cqi_max: Upper bound on the maximum CQI to be reported. Default 15.
# cqi_fixed: Fixes the reported CQI to a constant value. Default disabled.
# snr_ema_coeff: Sets the SNR exponential moving average coefficient (Default 0.1)
# snr_estim_alg: Sets the noise estimation algorithm. (Default refs)
# Options: pss: use difference between received and known pss signal,
# refs: use difference between noise references and noiseless (after filtering)
# empty: use empty subcarriers in the boarder of pss/sss signal
# pdsch_max_its: Maximum number of turbo decoder iterations (Default 4)
# pdsch_meas_evm: Measure PDSCH EVM, increases CPU load (default false)
# nof_phy_threads: Selects the number of PHY threads (maximum 4, minimum 1, default 3)
# equalizer_mode: Selects equalizer mode. Valid modes are: "mmse", "zf" or any
# non-negative real number to indicate a regularized zf coefficient.
# Default is MMSE.
# correct_sync_error: Channel estimator measures and pre-compensates time synchronization error. Increases CPU usage,
# improves PDSCH decoding in high SFO and high speed UE scenarios.
# sfo_ema: EMA coefficient to average sample offsets used to compute SFO
# sfo_correct_period: Period in ms to correct sample time to adjust for SFO
# sss_algorithm: Selects the SSS estimation algorithm. Can choose between
# {full, partial, diff}.
# estimator_fil_auto: The channel estimator smooths the channel estimate with an adaptative filter.
# estimator_fil_stddev: Sets the channel estimator smooth gaussian filter standard deviation.
# estimator_fil_order: Sets the channel estimator smooth gaussian filter order (even values perform better).
# The taps are [w, 1-2w, w]
#
# snr_to_cqi_offset: Sets an offset in the SNR to CQI table. This is used to adjust the reported CQI.
#
# interpolate_subframe_enabled: Interpolates in the time domain the channel estimates within 1 subframe. Default is to average.
#
# pdsch_csi_enabled: Stores the Channel State Information and uses it for weightening the softbits. It is only
# used in TM1. It is True by default.
#
# pdsch_8bit_decoder: Use 8-bit for LLR representation and turbo decoder trellis computation (Experimental)
# force_ul_amplitude: Forces the peak amplitude in the PUCCH, PUSCH and SRS (set 0.0 to 1.0, set to 0 or negative for disabling)
#
# in_sync_rsrp_dbm_th: RSRP threshold (in dBm) above which the UE considers to be in-sync
# in_sync_snr_db_th: SNR threshold (in dB) above which the UE considers to be in-sync
# nof_in_sync_events: Number of PHY in-sync events before sending an in-sync event to RRC
# nof_out_of_sync_events: Number of PHY out-sync events before sending an out-sync event to RRC
#
# force_N_id_2: Force using a specific PSS (set to -1 to allow all PSSs).
# force_N_id_1: Force using a specific SSS (set to -1 to allow all SSSs).
#
#####################################################################
[phy]
#rx_gain_offset = 62
#prach_gain = 30
#cqi_max = 15
#cqi_fixed = 10
#snr_ema_coeff = 0.1
#snr_estim_alg = refs
#pdsch_max_its = 8 # These are half iterations
#pdsch_meas_evm = false
#nof_phy_threads = 3
#equalizer_mode = mmse
#correct_sync_error = false
#sfo_ema = 0.1
#sfo_correct_period = 10
#sss_algorithm = full
#estimator_fil_auto = false
#estimator_fil_stddev = 1.0
#estimator_fil_order = 4
#snr_to_cqi_offset = 0.0
#interpolate_subframe_enabled = false
#pdsch_csi_enabled = true
#pdsch_8bit_decoder = false
#force_ul_amplitude = 0
#detect_cp = false
#in_sync_rsrp_dbm_th = -130.0
#in_sync_snr_db_th = 3.0
#nof_in_sync_events = 10
#nof_out_of_sync_events = 20
#force_N_id_2 = 1
#force_N_id_1 = 10
#####################################################################
# PHY NR specific configuration options
#
# store_pdsch_ko: Dumps the PDSCH baseband samples into a file on KO reception
#
#####################################################################
[phy.nr]
#store_pdsch_ko = false
#####################################################################
# CFR configuration options
#
# The CFR module provides crest factor reduction for the transmitted signal.
#
# enable: Enable or disable the CFR. Default: disabled
#
# mode: manual: CFR threshold is set by cfr_manual_thres (default).
# auto_ema: CFR threshold is adaptive based on the signal PAPR. Power avg. with Exponential Moving Average.
# The time constant of the averaging can be tweaked with the ema_alpha parameter.
# auto_cma: CFR threshold is adaptive based on the signal PAPR. Power avg. with Cumulative Moving Average.
# Use with care, as CMA's increasingly slow response may be unsuitable for most use cases.
#
# strength: Ratio between amplitude-limited vs unprocessed signal (0 to 1). Default: 1
# manual_thres: Fixed manual clipping threshold for CFR manual mode. Default: 2
# auto_target_papr: Signal PAPR target (in dB) in CFR auto modes. output PAPR can be higher due to peak smoothing. Default: 7
# ema_alpha: Alpha coefficient for the power average in auto_ema mode. Default: 1/7
#
#####################################################################
[cfr]
#enable = false
#mode = manual
#manual_thres = 2.0
#strength = 1.0
#auto_target_papr = 7.0
#ema_alpha = 0.0143
#####################################################################
# Simulation configuration options
#
# The UE simulation supports turning on and off airplane mode in the UE.
# The actions are carried periodically until the UE is stopped.
#
# airplane_t_on_ms: Time to leave airplane mode turned on (in ms)
#
# airplane_t_off_ms: Time to leave airplane mode turned off (in ms)
#
#####################################################################
[sim]
#airplane_t_on_ms = -1
#airplane_t_off_ms = -1
#####################################################################
# General configuration options
#
# metrics_csv_enable: Write UE metrics to CSV file.
#
# metrics_period_secs: Sets the period at which metrics are requested from the UE.
#
# metrics_csv_filename: File path to use for CSV metrics.
#
# tracing_enable: Write source code tracing information to a file.
#
# tracing_filename: File path to use for tracing information.
#
# tracing_buffcapacity: Maximum capacity in bytes the tracing framework can store.
#
# have_tti_time_stats: Calculate TTI execution statistics using system clock
#
# metrics_json_enable: Write UE metrics to JSON file.
#
# metrics_json_filename: File path to use for JSON metrics.
#
#####################################################################
[general]
#metrics_csv_enable = false
#metrics_period_secs = 1
#metrics_csv_filename = /tmp/ue_metrics.csv
#have_tti_time_stats = true
#tracing_enable = true
#tracing_filename = /tmp/ue_tracing.log
#tracing_buffcapacity = 1000000
#metrics_json_enable = false
#metrics_json_filename = /tmp/ue_metrics.json
Разберёмся с параметрами, которые нужно изменить.
- srate — частота дискретизации SDR. Ставим максимальную поддерживаемую для вашего устройства.
- dl_earfcn — номер канала, на котором UE будет искать вышку.
- mode — тип SIM-карты (soft — виртуальная, pcsc — настоящая). Устанавливаем pcsc.
- reader — считыватель. Если значение пусто, то будут проверены все имеющиеся.
- pin — PIN симки.
- imei — IMEI, которым будет представляться UE.
- apn — APN вашей точки доступа.
- login — логин.
- pass — пароль.
srsUE не проходится по всем доступным ему каналам, как это делает телефон. Поэтому для работы необходимо указать EARFCN, на котором работает вышка оператора.

На телефоне открываем Net Monitor и запоминаем номер канала от БС с хорошим сигналом, после чего заносим его в качестве значения параметра. Также надо отрубить запрос ПИНа у симки, либо указать ПИН в соответствующем поле в конфиге.

Далее в телефоне открываем раздел «Точки доступа». Нас интересует APN, логин и пароль, которые тоже необходимо узнать и забить.

В моём случае параметры оказались такие: APN — internet.mts.ru, логин — mts, пароль — mts.

Также эти данные можно найти в интернете, они есть на сайте любого оператора.

Отдельным пунктом стоит упомянуть IMEI. Обычно он прошивается на заводе и не меняется (либо вообще, либо только с помощью специального софта). Но, как нетрудно догадаться, srsUE является этаким «сферическим в вакууме» девайсом, поэтому IMEI нужно задать самому, например, сгенерировать случайный для любой понравившейся модели телефона.

Другим вариантом будет использование IMEI от настоящего телефона. Набираем код *#06#, и на экране появляются заветные цифры. Очень важно: никогда не допускайте одновременной работы srsUE и телефона, IMEI которого вы взяли!
❯ Считыватель
Теперь разберёмся с подключением симки к компьютеру. Для этого понадобится ранее показанный считыватель смарт-карт.

Но есть один нюанс — большинство из них предназначены для полноразмерных карт, отчего потребуется специальный переходник, чтобы вставить в него симку. Если его нет, то берём новую симку и засовываем её вместе с пластмассовой картой.
Теперь подключаем считыватель к компу и выполняем следующую команду:
pcsc_scan
Если софт для работы со смарт-картами установлен правильно, а симка установлена в считыватель, то на экране отобразится примерно следующее:

Двигаемся дальше. Убедимся, что симка работает корректно и читается, для чего переходим в папку с собранным srsRAN и выполняем команды:
cd srsue/src/stack/upper/test
./pcsc_usim_test

В консоли можно будет увидеть обмен данных с симкой.
❯ Запускаем
Ну что, самое время пробовать. На компьютере отрубаем Wi-Fi и LAN, после чего подключаем SDR и запускаем софт:
cd srsue/src
sudo ./srsue

Начнётся стандартная процедуза загрузки прошивки в оперативную память SDR.

После этого srsUE перейдёт в рабочий режим. И, если всё было сделано правильно, через несколько секунд софт найдёт сеть, а компьютер получит IP-адрес. При этом ОС выдаст уведомление о новом подключении.

При подключении может возникнуть проблема, что при попытке подключения сеть отваливается. Мне неведомо, с чем это связано, в некоторых источниках удалось выяснить, что причина этому — нехватка пропускной способности SDR. В таком случае нужно попробовать другую вышку или другого оператора (по закону подлости МТС, с которого я только звоню, у меня подключался стабильно, а Теле2, симка которого у меня с пакетом гигабайт, только через раз).

Если в консоли сыпется бесконечное «Found cell...», значит, не проходит аутентификация. В моём случае это было вызвано специально — для проверки я вставил в считыватель дохлую симку.
❯ Доступ в интернет

Теперь, когда подключение работает, можно выйти в сеть.

Ping работает успешно.

Да и страницы тоже открываются отлично.

А вот и Speedtest, показывающий, что оператор у меня Tele2, а не домашняя «Интерсвязь».

Для проверки стабильности связи я, как и в случае с БС, открыл на компе YouTube и запустил часовое видео в хорошем качестве. Как оказалось, даже на Tele2 при успешном подключении сеть ловится весьма приемлемо.
❯ Вот как-то так
Как и ожидалось, подключить компьютер к интернету при помощи обычного SDR оказалось даже проще, чем поднять сеть. Коммерческие БС имеют хороший сигнал, поэтому сеть нормально ловится даже с не слишком хорошими антеннами. Впрочем, как оказалось, некоторые нюансы (увы, не зависящие от нас) всё равно есть, так что в идеале запастись симками сразу нескольких операторов: хоть один точно заработает. В остальном же это полностью рабочая реализация сотового модема, которую не составляет труда запустить при наличии оборудования.
Такие дела.