Как собрать LTE-модем на базе SDR

Приветствую всех!

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

Как собрать LTE-модем на базе SDR

Итак, в сегодняшней статье поговорим о том, как взаимодействовать с мобильной сетью при помощи 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 или другой подобный источник стабильной частоты, в отличие от БС, использовать необязательно.

❯ Обзор оборудования

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR
Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR
Как собрать LTE-модем на базе SDR

А вот пример тех, которые не подойдут — пин-пады со считывателями карт, а также проприетарные девайсы.

В общем-то, больше ничего примечательного сегодня не потребуется.

❯ Ставим софт

По умолчанию 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
Как собрать LTE-модем на базе SDR

Если после этого софт не вылетел, а в консоли появилось «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, на котором работает вышка оператора.

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

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

Теперь разберёмся с подключением симки к компьютеру. Для этого понадобится ранее показанный считыватель смарт-карт.

Как собрать LTE-модем на базе SDR

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

Теперь подключаем считыватель к компу и выполняем следующую команду:

pcsc_scan

Если софт для работы со смарт-картами установлен правильно, а симка установлена в считыватель, то на экране отобразится примерно следующее:

Как собрать LTE-модем на базе SDR

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

cd srsue/src/stack/upper/test ./pcsc_usim_test
Как собрать LTE-модем на базе SDR

В консоли можно будет увидеть обмен данных с симкой.

❯ Запускаем

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

cd srsue/src sudo ./srsue
Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

❯ Доступ в интернет

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

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

Как собрать LTE-модем на базе SDR

Для проверки стабильности связи я, как и в случае с БС, открыл на компе YouTube и запустил часовое видео в хорошем качестве. Как оказалось, даже на Tele2 при успешном подключении сеть ловится весьма приемлемо.

❯ Вот как-то так

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

Такие дела.

Автор текста: MaFrance351

Больше интересных статей в нашем блоге на Хабре.

Хочешь стать автором (или уже состоявшийся автор) и есть, чем интересным поделиться в рамках наших блогов — пиши сюда.

5353
17 комментариев
9
Ответить

✅ Проверил пост на наличие картинки

Ответить

Чувак, просто купи 4г модем

5
Ответить

Понял всё до слов "суть такова". Поставил сердечко, сохраню на случай Апокалипсиса и Армагеддона.

2
Ответить

Очень познавательно. Мое почтение автору и его пытливому уму:)))

2
Ответить

Зачем и нахуя?

1
Ответить

Запарно, но прикольно

1
Ответить