17 aprilie 2026

tetra bluestation ptt erori analiza AI

 

Debugging TETRA BlueStation pe Raspberry Pi — Jurnal tehnic complet

YO3IVA — radiofarafiltru.ro


Introducere

Acest articol documentează procesul complet de depanare a unui mini-EBTS TETRA TMO bazat pe BlueStation (MidnightBlueLabs), rulând pe Raspberry Pi cu un HAT Z32IT V3.0 (SX1255). Acoperă configurarea parametrilor RF, analiza log-urilor în profunzime și rezolvarea problemelor întâlnite, de la prima eroare „please wait" la funcționarea completă a PTT-ului.

 


Configurația hardware și software

  • Raspberry Pi (aarch64, Debian Bookworm, kernel 6.12)
  • HAT RF: Z32IT V3.0 cu SX1255 (clock 38.4 MHz)
  • Software BS: tetra-bluestation v0.5.6-ad5a85e
  • Backhaul: core.tetraflow.ro:9000 (WSS/TLS)
  • Frecvențe: TX 438.025 MHz / RX 433.025 MHz (duplex 5 MHz)
  • Radio terminal: ISSI 2263098 (YO3IVA)
  • Grup: GSSI 226777

Configurația BlueStation (bluestation.toml)

toml
config_version = "0.6"
stack_mode = "Bs"

[phy_io]
backend = "SoapySdr"

[phy_io.soapysdr]
tx_freq = 438025000
rx_freq = 433025000
ppm_err = 0
device = "sxceiver"
tx_gain_dac = 9.0
tx_gain_mixer = 40.0   # default: 30.0 → crescut cu +10 dB
rx_gain_lna = 38.0     # default: 42.0 → redus cu 4 dB
rx_gain_pga = 16.0

[net_info]
mcc = 901
mnc = 9999

[cell_info]
freq_band = 4
main_carrier = 1521
duplex_spacing = 4
freq_offset = 0
reverse_operation = false
location_area = 2
colour_code = 1
subscriber_class = 0xFFFF
registration = true
system_wide_services = true
voice_service = true

[brew]
host = "core.tetraflow.ro"
port = 9000
reconnect_delay_secs = 5
tls = true
username = XXXXXXX
password = "**********"
feature_sds_enabled = true

Problema inițială — „Please Wait" la PTT

Simptom

La apăsarea PTT-ului, radio-ul afișa „Please Wait" și nu intra în emisie.

Diagnosticul din log

Linia cheie din primul log:

INFO [entities/cmce] cc_bs.rs:433:
    CMCE: rejecting U-SETUP from issi=2263098 to gssi=226777 (no listeners)

Radio-ul (ISSI 2263098) trimitea un U-SETUP (cerere de apel de grup) către GSSI 226777, iar BlueStation îl respingea imediat cu motivul no listeners. Motivul: la prima pornire, radio-ul nu se înregistrase încă la grup.

Cauze posibile investigate

  1. GSSI 226777 nu era configurat în BlueStation (exclus — configurația era corectă)
  2. Niciun MS nu era afiliat la GSSI 226777 — cauza reală
  3. Group Attachment Request nu fusese procesată

Rezoluție

Problema a fost cauzată de valorile implicite de gain RF care nu corespundeau distanței dintre radio și antenă. Soluția a venit din ajustarea parametrilor phy_io.soapysdr:

  • tx_gain_mixer: crescut de la 30.0 la 40.0 (+10 dB) — radio-ul nu auzea BS-ul
  • rx_gain_lna: redus de la 42.0 la 38.0 (-4 dB) — semnal prea puternic la recepție (saturation)

Înțelegerea parametrilor de gain SX1255

Lanțul TX (emisie)

Baseband (BlueStation) → DAC → Mixer/Upconverter → Antena TX
                         ↑              ↑
                   tx_gain_dac    tx_gain_mixer
ParametruValoareDefaultEfect
tx_gain_dac9.09.0Amplitudinea semnalului IQ la ieșirea DAC
tx_gain_mixer40.030.0Câștigul etajului de upconversie RF (+10 dB față de default)

Lanțul RX (recepție)

Antena RX → LNA → Mixer → PGA → ADC → BlueStation
              ↑               ↑
         rx_gain_lna      rx_gain_pga
ParametruValoareDefaultEfect
rx_gain_lna38.042.0Câștigul LNA — redus cu 4 dB pentru a evita saturarea
rx_gain_pga16.016.0Câștigul PGA după mixer — nemodificat

Observație importantă: La rx_gain_lna = 40.0 (valoare intermediară testată), PTT-ul dădea „denied". La 42.0 (default) la fel. Concluzie: distanța mică dintre radio și antenă provoca suprasaturare a LNA. Valoarea optimă confirmată: 38.0.


Secvența completă de funcționare (log 2 — apeluri reușite)

Odată ajustate gain-urile, secvența de apel funcționează corect:

U-SETUP (2263098 → GSSI 226777)
  → D-CallProceeding (call_id=5, T10s timeout)
  → D-Connect (Granted, call_ownership=true)
  → D-Setup → GSSI (GrantedToOtherUser, calling_party=2263098)
  → BrewEntity: forwarding local call to TetraPack (uuid=...)
  → [frames audio: 33, 82, 61, 59, 42, 27 frames per apel]
  → U-TX-CEASED (PTT eliberat)
  → Hangtime → D-Release (ExpiryOfTimer)

Analiza completă a warning-urilor și erorilor

Warning 1: Lost samples la startup

WARN soapy_dev.rs:258: Lost -1200 samples, skipping 900 more samples
WARN soapy_dev.rs:355: Too late to produce TX block 0, skipping 6 TX blocks

Origine: Apare imediat după pornire, la inițializarea stream-urilor SoapySDR. Valoarea negativă (-1200) indică un timestamp overflow la init.

Severitate: Scăzută — apare o singură dată, nu afectează funcționarea ulterioară.

Rezolvare: Ignorat, benign.


Warning 2: Failed parsing MacAccess

WARN umac_bs.rs:594: Failed parsing MacAccess: BufferEnded { field: Some("ssi") }
    00000^000000000000000

Origine: Apare în faza de înregistrare, după ce radio-ul trimite primul MacEndHu (half-uplink slot). Parserul UMAC încearcă să interpreteze biții de padding de după payload ca un alt MacAccess.

Severitate: Scăzută — limitare a implementării BlueStation v0.5.6.

Rezolvare: Nu poate fi rezolvat fără patch la sursă. Înregistrarea continuă corect.


Warning 3: Defrag buffer not inactive

WARN bs_defrag.rs:48: defrag_buffer for ts 1 ssi 2263098 in not inactive (state: Active)

Origine: Apare de 4-5 ori în faza de group report. Radio-ul (Motorola) trimite multiple cereri de capacitate (Req2Slots) înainte ca buffer-ul precedent să fie eliberat — comportament agresiv specific terminalelor Motorola.

Severitate: Scăzută — comportament normal.

Rezolvare: Ignorat, benign.


Warning 4: UFacility neimplementat

WARN cmce_bs.rs:66: unimplemented: UFacility

Origine: Radio-ul trimite mesaje U-FACILITY pentru supplementary services TETRA (late entry, ambience listening etc.). BlueStation v0.5.6 nu implementează FACILITY.

Severitate: Scăzută — nu afectează vocea sau PTT-ul.

Rezolvare: Feature lipsă în BlueStation. Ignorat.


Warning 5: LLC exhausted retransmissions (importantă, recurentă)

WARN llc_bs_ms.rs:612: schedule_retransmissions: SSI 2263098 N(S) 0 exhausted retransmissions
WARN llc_bs_ms.rs:612: schedule_retransmissions: SSI 2263098 N(S) 1 exhausted retransmissions

Origine: BS-ul trimite D-CallProceeding în mod Acknowledged (LLC BlAdata cu expects_ack: true) și retransmite de 3 ori la interval de ~5 frame-uri TETRA, dar nu primește ACK în fereastra de timp.

Mecanism detaliat:

BS trimite D-CallProceeding N(S)=0 → attempt 1 → attempt 2 → attempt 3 → WARN exhausted
(apelul merge totuși — radio-ul a primit mesajul dar ACK-ul ajunge prea târziu)

Cauze posibile:

  • Uplink cu marjă mică de SNR la rx_gain_lna = 38.0
  • Timer LLC intern din BlueStation prea scurt față de latența reală a uplink-ului
  • Offset PPM necalibrat pe SX1255
  • Interferențe pe 433 MHz (bandă ISM aglomerată)

Rezolvare propusă:

bash
# Verificare PPM real cu RTL-SDR sau semnal de referință
# Dacă există offset, ajustare în config:
ppm_err = -3  # sau valoarea măsurată

Observație: Apelurile funcționează în ciuda acestui warning — radio-ul primește mesajele dar ACK-urile ajung după expirarea timerului LLC.


Warning 6: MM unsupported fields

WARN mm_bs.rs:618: unimplemented: Unsupported class_of_ms present
WARN mm_bs.rs:627: unimplemented: Unsupported ssi present
WARN mm_bs.rs:630: unimplemented: Unsupported address_extension present

Origine: La al doilea U-LocationUpdateDemand (tip DemandLocationUpdating), radio-ul Motorola trimite câmpuri opționale pe care MM-ul din BlueStation nu le procesează: class_of_ms=1708128, ssi=2263098, address_extension=14771983.

Severitate: Scăzută — BlueStation ignoră câmpurile și continuă înregistrarea corect.


Sesiunea cu utilizatori multipli (log 5) — Erori avansate

Acest log include activitate simultană: ISSI 2263098 (local RF) și ISSI 2263095 (din backhaul TetraPack/TetraFlow). Apar erori noi legate de scenariul multi-utilizator.


Eroarea A: Speaker change race condition

INFO cc_bs.rs:1274: CMCE: network call speaker change gssi=226777
    new_speaker=2263095 (was 2263098)
WARN cc_bs.rs:1289: CMCE: brew_uuid changed during speaker change
WARN cc_bs.rs:736:  need to send CLOSE for call id 9
INFO cc_bs.rs:199:  -> DRelease { call_identifier: 9, disconnect_cause: ExpiryOfTimer }

Ce s-a întâmplat:

  1. 2263098 eliberează PTT (U-TX-CEASED, frames=546)
  2. Imediat, la 18/58/18, BrewWorker primește GROUP_TX de la 2263095 pe același call_id=9
  3. BlueStation încearcă un speaker change în interiorul apelului existent
  4. Apelul vechi expiră (hangtime T5s) înainte ca speaker change-ul să se finalizeze
  5. BS-ul forțează DRelease cu ExpiryOfTimer

Consecință: Radio-ul 2263098 primește deconectare în timp ce 2263095 mai emitea.

Severitate: Ridicată — bug în implementarea speaker change din BlueStation v0.5.6.

Rezolvare: Bug upstream. De raportat la MidnightBlueLabs. Nu poate fi rezolvat fără patch la cc_bs.rs.


Eroarea B: Dropping DL voice on inactive circuit

WARN umac_bs.rs:1245: rx_tmd_prim: dropping DL voice on inactive circuit
    ts=2 src=Brew dltime=19/24/04/2
WARN umac_bs.rs:1245: rx_tmd_prim: dropping DL voice on inactive circuit
    ts=2 src=Brew dltime=19/24/05/2
... (14-15 frame-uri consecutive)

Ce s-a întâmplat: Brew continuă să trimită frames audio de la 2263095 pe ts=2, dar circuitul DL a fost închis de DRelease. BS-ul aruncă toate frame-urile audio (≈1-1.5 secunde de audio pierdut).

Consecință practică: Radio-ul 2263098 nu aude nimic de la 2263095 în această fereastră, iar 2263095 nu primește niciun feedback că transmisia lui este pierdută.

Severitate: Ridicată — consecință directă a Erorii A.


Eroarea C: Network call end for unknown brew_uuid

DEBUG cc_bs.rs:1501: CMCE: network call end for unknown brew_uuid=5e891d71-...

Ce s-a întâmplat: BrewWorker trimite GROUP_IDLE cu uuid-ul apelului vechi după ce CMCE a schimbat deja uuid-ul la speaker change. Inconsistență internă de stare.

Severitate: Medie — consecință indirectă a Erorii A.


Eroarea D: Signaling scheduled for non-MCCH

WARN umac_bs.rs:1206: rx_ul_tma_unitdata_req: signaling scheduled for non-MCCH 3
WARN umac_bs.rs:1206: rx_ul_tma_unitdata_req: signaling scheduled for non-MCCH 3

Ce s-a întâmplat: La start-ul apelului call_id=11 (network-initiated de la 2263095), BS-ul încearcă să programeze semnalizare pe ts=3 în loc de MCCH (ts=1). Aceasta se întâmplă când un apel este inițiat de rețea în timp ce un TCH este activ pe ts=2.

Consecință: Radio-ul 2263098 poate să nu primească corect D-SETUP pentru apelul inițiat de 2263095.

Severitate: Medie — bug la network-initiated calls în condiții de TCH activ.


Eroarea E: dl_drop_all_except_stolen

WARN bs_sched.rs:599: dl_drop_all_except_stolen: discarding scheduled
    RandomAccessAck(TetraAddress { ssi: 2263098 }) on ts 2

Ce s-a întâmplat: Când radio-ul trimite U-TX-DEMAND pe ts=2 în hangtime, BS-ul face FACCH stealing pentru D-TxGranted, eliminând un RandomAccessAck deja schedulat.

Severitate: Scăzută — comportament normal al scheduler-ului FACCH vs MCCH.


Tabel centralizat — toate erorile și rezolvările

#Warning/EroareSeveritateRezolvare
1Lost samples la startupScăzutăIgnorat — apare o dată
2Failed parsing MacAccessScăzutăBug BlueStation — ignorat
3Defrag buffer not inactiveScăzutăNormal Motorola — ignorat
4UFacility unimplementedScăzutăFeature lipsă — ignorat
5LLC exhausted retransmissionsMedieVerificare PPM, investigare interferențe 433 MHz
6MM unsupported fieldsScăzutăNormal — ignorat
ASpeaker change race conditionRidicatăBug BlueStation v0.5.6 — raportare upstream
BDropping DL voice on inactive circuitRidicatăConsecință din A — același bug
CNetwork call end unknown uuidMedieConsecință din A
DSignaling scheduled for non-MCCHMedieBug network-initiated calls
Edl_drop_all_except_stolenScăzutăNormal — ignorat

Configurația optimă confirmată

Aceasta este configurația finală validată după toate testele:

toml
[phy_io.soapysdr]
tx_freq = 438025000
rx_freq = 433025000
ppm_err = 0
device = "sxceiver"
tx_gain_dac = 9.0       # ✓ OPTIM — nemodificat față de default
tx_gain_mixer = 40.0    # ✓ OPTIM — +10 dB față de default (30.0)
rx_gain_lna = 38.0      # ✓ OPTIM — -4 dB față de default (42.0)
rx_gain_pga = 16.0      # ✓ OPTIM — nemodificat față de default

Reguli de ajustare gain:

  • rx_gain_lna = 40.0 → PTT denied (prea mult gain, saturation la U-TX-DEMAND)
  • rx_gain_lna = 42.0 → PTT denied (același motiv, chiar mai rău)
  • rx_gain_lna = 38.0 → funcționare corectă ✓
  • tx_gain_mixer < 40.0 → radio-ul nu aude BS-ul, „no listeners"

TCP Keepalive pentru stabilitate backhaul

Pentru a preveni disconnecturile BrewWorker cauzate de NAT idle timeout:

bash
# Adăugare în /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 3
bash
# Aplicare imediată
sudo sysctl -p

Concluzii

  1. Problema principală (Please Wait / no listeners) a fost cauzată de gain RF necorespunzătortx_gain_mixer prea mic și rx_gain_lna prea mare pentru distanța radio-antenă.
  2. Valorile implicite ale BlueStation nu sunt potrivite pentru toate setup-urile — calibrarea manuală a gain-ului este necesară pentru fiecare instalație.
  3. LLC retransmissions exhausted este un comportament consistent care nu afectează funcționarea apelurilor, dar indică o marjă mică de SNR pe uplink sau un offset PPM necalibrat.
  4. Scenariul multi-utilizator (speaker change în hangtime) are un bug confirmat în BlueStation v0.5.6 care cauzează pierdere de audio și race conditions. De urmărit fix-ul în versiunile viitoare.
  5. Sistemul funcționează stabil pentru utilizare single-user cu radio local, cu parametrii confirmați mai sus.

Referințe


Articol publicat pe radiofarafiltru.ro — YO3IVA Toate testele au fost efectuate în banda de radiofrecvențe amateur (430-440 MHz), în conformitate cu licența de radioamator.

Niciun comentariu:

Trimiteți un comentariu