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)
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 = trueProblema 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
- GSSI 226777 nu era configurat în BlueStation (exclus — configurația era corectă)
- Niciun MS nu era afiliat la GSSI 226777 — cauza reală
- 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-ulrx_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| Parametru | Valoare | Default | Efect |
|---|---|---|---|
| tx_gain_dac | 9.0 | 9.0 | Amplitudinea semnalului IQ la ieșirea DAC |
| tx_gain_mixer | 40.0 | 30.0 | Câș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| Parametru | Valoare | Default | Efect |
|---|---|---|---|
| rx_gain_lna | 38.0 | 42.0 | Câștigul LNA — redus cu 4 dB pentru a evita saturarea |
| rx_gain_pga | 16.0 | 16.0 | Câș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 blocksOrigine: 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^000000000000000Origine: 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: UFacilityOrigine: 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 retransmissionsOrigine: 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ă:
# 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 presentOrigine: 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:
- 2263098 eliberează PTT (U-TX-CEASED,
frames=546) - Imediat, la
18/58/18, BrewWorker primeșteGROUP_TXde la 2263095 pe acelașicall_id=9 - BlueStation încearcă un speaker change în interiorul apelului existent
- Apelul vechi expiră (hangtime T5s) înainte ca speaker change-ul să se finalizeze
- BS-ul forțează
DReleasecuExpiryOfTimer
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 3Ce 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 2Ce 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/Eroare | Severitate | Rezolvare |
|---|---|---|---|
| 1 | Lost samples la startup | Scăzută | Ignorat — apare o dată |
| 2 | Failed parsing MacAccess | Scăzută | Bug BlueStation — ignorat |
| 3 | Defrag buffer not inactive | Scăzută | Normal Motorola — ignorat |
| 4 | UFacility unimplemented | Scăzută | Feature lipsă — ignorat |
| 5 | LLC exhausted retransmissions | Medie | Verificare PPM, investigare interferențe 433 MHz |
| 6 | MM unsupported fields | Scăzută | Normal — ignorat |
| A | Speaker change race condition | Ridicată | Bug BlueStation v0.5.6 — raportare upstream |
| B | Dropping DL voice on inactive circuit | Ridicată | Consecință din A — același bug |
| C | Network call end unknown uuid | Medie | Consecință din A |
| D | Signaling scheduled for non-MCCH | Medie | Bug network-initiated calls |
| E | dl_drop_all_except_stolen | Scăzută | Normal — ignorat |
Configurația optimă confirmată
Aceasta este configurația finală validată după toate testele:
[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 defaultReguli 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:
# Adăugare în /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 3# Aplicare imediată
sudo sysctl -pConcluzii
- Problema principală (Please Wait / no listeners) a fost cauzată de gain RF necorespunzător —
tx_gain_mixerprea mic șirx_gain_lnaprea mare pentru distanța radio-antenă. - Valorile implicite ale BlueStation nu sunt potrivite pentru toate setup-urile — calibrarea manuală a gain-ului este necesară pentru fiecare instalație.
- 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.
- 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.
- Sistemul funcționează stabil pentru utilizare single-user cu radio local, cu parametrii confirmați mai sus.
Referințe
- BlueStation: github.com/MidnightBlueLabs/tetra-bluestation
- SoapySX / Z32IT V3.0 HAT: driver SX1255 pentru Raspberry Pi
- TetraPack/TetraFlow: backhaul TETRA over IP
- ETSI EN 300 392-2: TETRA V+D Air Interface standard
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