Four:C Flex — Manual

← Tillbaka till inloggning

Om projektet

Four:C Flex är en privat BREW SwMI (Switching and Management Infrastructure) för att koppla ihop TETRA-basstationer i ett eget nätverk. Systemet hanterar registrering, talgrupper, gruppsamtal, individanrop (CBR), röst (PTT), position (LIP), täckningskarta, SDS, status, callout, remote control, ADAM digital I/O, TTS (talsyntes), SIP-telefonpatch och dispatcher/mobil via webbläsare.

Telefoni via SIP/PBX (SDP, G.711) finns — inkommande samtal till talgrupp och utringning från radio. Se SIP. TETRA-paketdata är inte implementerat. Se även README.md för installation och drift.

Arkitektur

[Fourc Flex / Pi] ──BREW (port 3003)──► [Four:C Flex SwMI] ▲ │ HTTPS / WSS (port 3443) [Admin] [Dispatcher] [Mobil] │ [ADAM-6066] ──Modbus TCP───┘

Servern tar emot BREW-anslutningar från basstationer, håller nätverksöversikt (prenumeranter, affiliieringar, aktiva samtal) och vidarekopplar röst mellan celler. Webbklienter ansluter via säker WebSocket till dispatcher-hubben. ADAM-moduler styrs via Modbus TCP; TTS spelas som gruppsamtal från system-ISSI.

Tjänst Port Beskrivning
HTTPS3443Webb, admin, dispatcher, mobil (TLS)
BREW / app3003Basstationer och Android-app (HTTP, utan TLS)
SIP5070Inkommande SIP (UDP) + RTP från 40000

Inloggning och roller

Startsidan (/) är gemensam inloggning. Efter lyckad inloggning dirigeras du automatiskt till rätt gränssnitt utifrån din roll.

Roll URL Behörighet
admin /admin Full konfiguration, övervakning, loggar, användarhantering, ADAM I/O, TTS, SIP
dispatcher /dispatcher PTT, karta, täckning, telefon (SIP), meddelanden, TTS, ADAM I/O, DGNA, talgrupper — flikar kan begränsas per konto
mobile /mobile Webbmobil: talgrupp, PTT, GPS. Samma konto används i Android-appen

Användare lagras i users.json (ej i git). Minst en admin krävs. Inloggningar loggas i data/login-log.jsonl.

Administration

Adminpanelen nås efter inloggning som admin. Överst visas live-räknare för basstationer, Radio ISSI och talgrupper (klicka för att hoppa till rätt flik).

Flikar

Översikt, Användare, ISSI, Dispatchers, Talgrupper, Basstationer, ADAM I/O, TTS, SIP, Trafik och Loggar.

System-ISSI

Systemets egna ISSI (flik Användare) används när servern skickar LIP, status och SDS till radionätet. Måste matcha konfigurationen i radioenheterna.

Användare

Fliken Användare hanterar admin-konton i users.json. Mobil-inloggning skapas under fliken ISSI, dispatcher under fliken Dispatchers. Minst en admin krävs.

ISSI (Radio ISSI)

Masterlista för ISSI-whitelist på fliken ISSI. Synkas till TETRA-baserna via BREW (Subscriber.json). Här hanteras fältradio och mobil. Lägg till/ta bort ISSI manuellt — nya radior läggs inte in automatiskt. Kolumnen Bas visar vilken basstation ISSI:n är inloggad på (live i accentfärg, annars senast sedd). TEI (låst) binder ISSI till en specifik radio: tom = endast ISSI-kontroll; ifylld = TEI måste matcha. Sedd TEI fylls när basen rapporterar U-TEI-PROVIDE (Motorola skickar det ofta inte — läs då 15 hex i radion och klistra in). Dispatchers finns under egen flik.

Dispatchers

Webbinloggning, SIP-anknytning och kryssrutor för flikar i dispatcher-UI. Krysset Täckning ger täckningsmätning (GPS + signal). Saknas kryss / alla ikryssade = full åtkomst. Sparas i Subscriber.json.

Talgrupper

Fliken Talgrupper. GSSI och namn måste stämma med programmeringen i radioenheterna. Gruppsamtal routas mellan alla anslutna basstationer.

Grupp kombinering

Samma flik som talgrupper. Kopplar ihop flera talgrupper så att radios på olika GSSI hör varandra. Varje GSSI får bara ingå i en kombinering.

Basstationer (BREW)

Fliken Basstationer. Varje fysisk basstation behöver unikt numeriskt användarnamn och lösenord (brewUsers i config). Dessa credentials anges i basstationens BREW-konfiguration. TETRA↔DMR-interop ligger också här — se TETRA ↔ DMR.

Live-översikter

Uppdatera Fourc Flex (OTA)

I tabellen Anslutna basstationer (flik Översikt) finns knappen Uppdatera per TETRA-bas. Den hämtar senaste Fourc Flex och startar om tjänsten på Pi:n själv — du ska inte starta om Raspberry Pi manuellt.

Android PTT-app

På fliken Android finns nedladdning av APK och en delbar installationslänk (/install-ptt). Se Android PTT-app.

Trafik och tidsluckor

Visar MCCH/trafikkanaler (TS1–TS4) per basstation, live-tidslinje (senaste 5 min), historik från data/slot-timeline.jsonl och händelselogg i data/traffic-log.jsonl. Talgruppsstatistik (aktivitet, rösttid, ramar).

Inloggningslogg

Senaste webbinloggningar med resultat, kanal, roll och IP.

Meddelandelogg

Alla SDS, status och callout som passerar servern — filtrerbart per typ.

Händelselogg

Intern serverlogg (registrering, affiliiering, anslutningar m.m.).

ADAM I/O, TTS och SIP konfigureras i egna sektioner i admin — se ADAM I/O, TTS och SIP.

ISSI och TEI

ISSI är radions nummer i nätet (Individual Short Subscriber Identity). TEI är hårdvaru-ID (TETRA Equipment Identity), 60 bitar skrivet som 15 hexadecimala tecken. Listan under Admin → ISSI är whitelist som synkas till Fourc Flex-baserna via BREW. ISSI som inte finns i listan får inte registrera sig.

System-ISSI (flik Användare) är serverns eget nummer för LIP, status och SDS — det är inte en fältradio. Dispatcher-konton ligger under fliken Dispatchers, inte i Radio ISSI-tabellen.

ADAM I/O

Four:C Flex styr Advantech ADAM-6066 (och liknande ADAM-6000) via Modbus TCP. Konfiguration sker under Admin → ADAM I/O. Flera moduler kan användas parallellt (varsin IP).

Moduler

Regler

I Dispatchern under fliken ADAM I/O kan operatören manuellt köra status→DO-regler (t.ex. Dörr1) och spela DI→TTS, samt se live HIGH/LOW på konfigurerade ingångar.

TTS — talsyntes

TTS läser upp text som gruppsamtal från system-ISSI på vald talgrupp (GSSI). Motor: Edge neural (om tillgänglig) med fallback till Windows SAPI. Meddelanden och regler konfigureras under Admin → TTS.

SIP — telefon till talgrupp

Four:C Flex kan svara på inkommande SIP-samtal (anknytning) och koppla luren till en TETRA-talgrupp. Codec: G.711 PCMU/PCMA (8 kHz). Konfigureras under Admin → SIP.

Inkommande SIP-samtal kopplas till talgrupp (telefonpatch). Utringning från radio till SIP-nummer finns när utringning är påslagen i Admin → SIP. Media förhandlas med SDP (G.711 PCMU/PCMA).

Dispatcher

Dispatcher är huvudgränssnittet för operatörer. Efter inloggning ansluts webbläsaren till SwMI via WebSocket. Mikrofon och högtalare aktiveras vid första anslutning.

PTT och talgrupp

Karta

Täckning

Fliken Täckning bygger en geografisk täckningskarta: var mottagningen var dålig eller bra. Varje mätning lämnar ett runt fält (ca 10 m) på den plats där radion stod. Fältet flyttar sig inte med radion.

Samtal (CBR)

Fliken Samtal visar inkommande Call Back Request från radioer. Se detaljer under Samtal (CBR).

Telefon (flik)

Softphone med knappsats. Utgående samtal går via dispatcherns SIP-anknytning (anges i Admin → Dispatchers). Inkommande till anknytningen ringer här — inte på talgruppen. Samtalet är full duplex; PTT pausas under samtal. Se SIP.

Status

Lista inkommande och utgående statusmeddelanden. Skicka status till valfri ISSI. Fördefinierade koder (CBR, Logon/Logoff, Kvittera m.m.) finns i status-codes.json. Status 0 = larm. Se tabellen under Samtal (CBR).

SDS

Short Data Service — korta textmeddelanden (max 140 tecken) till enskild ISSI. Leveransstatus visas (väntar / levererat / misslyckades).

Callout

Skicka callout-meddelanden (test, alert, info, clear) till grupp eller individ med valfri severity och text.

TTS (flik)

Spela fördefinierade TTS-meddelanden eller fri text på en talgrupp. Meddelanden skapas i Admin → TTS. Se TTS.

ADAM I/O (flik)

Operatörsvy för digital I/O: knappar för konfigurerade status→DO-regler (t.ex. dörröppning), live-status på DI, och Spela TTS för DI→TTS-regler. Regler skapas i Admin → ADAM I/O. Se ADAM I/O.

Remote Control

Fjärrkommandon till radio via AT-liknande kommandon:

Användare (flik)

Översikt över alla kända ISSI med online/offline, senast uppdaterad, talgrupp, position och senaste status. Sortering på namn, ISSI och status. Se avsnittet Närvaro nedan.

Talgrupper (flik)

Dispatcher kan redigera talgrupper utan omstart. Ändringar gäller direkt för alla anslutna klienter och basstationer. Samma lista som Admin → Talgrupper.

Grupp kombinering (flik)

Koppla ihop talgrupper så att radios på olika GSSI hör varandra. Varje GSSI får bara ingå i en kombinering. Samma regler som i Admin.

Flikbehörighet

Vilka dispatcher-flikar en operatör ser styrs i Admin → Dispatchers (kryssrutor per konto, bland annat Täckning). Tom lista / alla ikryssade = full åtkomst.

Nödlarm-banner

Vid detekterat nödlarm visas en röd banner överst. Klicka Kvittera för att dölja den i aktuell session. Se Nödlarm.

Fullskärm

Knappen Fullskärm i header döljer webbläsarens krom för operatörsarbete.

Samtal (CBR — Call Back Request)

När en radio skickar status 39401 (CBR Ind) eller 39402 (CBR Grp) öppnas fliken Samtal automatiskt och en ny rad visas. En röd badge på fliken visar antal öppna (ohanterade) förfrågningar.

Återanrop

Statuskoder (urval)

Kod Namn Användning
0LarmNödlarm
39401CBR IndCall Back Request — begär individanrop
39402CBR GrpCall Back Request — begär gruppanrop
39201LogoffRadio utloggad (närvaro offline)
39202LogonRadio inloggad (närvaro online)
39203UpptagenRadio upptagen
39301KvitteraKvittering
39302FrammeFramme på plats
39310LämnarLämnar plats
39311KlarKlar / tillgänglig

Etiketter redigeras i status-codes.json och laddas om vid serverstart.

Mobilklient (webb)

Förenklad webbsida /mobile för fältpersonal. Kontot skapas under Admin → ISSI med roll Mobil (webb-användarnamn och lösen).

Android PTT-app

Four:C Flex PTT är en Android-app (APK) för PTT mot samma mobilkonto som webbklienten. Den installeras sideloadat (inte från Play Store).

Installation

  1. I Admin → Android: ladda ner APK eller öppna installationssidan /install-ptt i telefonens webbläsare.
  2. Tillåt installation från okänd källa om Android frågar.
  3. I appen: serveradress http://<Flex-IP>:3003 (HTTP på BREW-porten — använd inte HTTPS 3443, självsignerat cert fungerar dåligt i appen).
  4. Logga in med mobil-kontot från fliken ISSI (samma användarnamn/lösen som /mobile).

Appen ger talgrupp och PTT mot SwMI. Skapa ISSI och webbkonto först, annars nekas inloggning.

Nödlarm

Nödlarm detekteras automatiskt utan att basen behöver särskild forward_to_brew-konfiguration (den kan vara ett komplement). Triggers:

Dispatcher visar banner och kan kvittera. Nytt larm efter kvittering visas igen.

Närvaro och användarlista

Närvaro (online/offline) fungerar olika beroende på enhetstyp:

Typ Online när Offline när
Dispatcher / mobil Inloggad och WebSocket aktiv Utloggad eller frånkopplad
Fältradio Registrerad i nätet (REGISTER/AFFILIATE) eller status 39202 (Logon) DEREGISTER, status 39201 (Logoff), eller ingen aktivitet på 5 timmar

Senast uppdateras direkt vid in-/utloggning. Talgrupp visar alla affiliieringar för fältradio (inkl. scanning); dispatcher visar vald TG + LarmTG (+ ev. gruppkombinering).

Meddelanden — översikt

Typ Riktning Användning
SDSIndividKort text till en ISSI
StatusIndividFördefinierad statuskod (t.ex. kvittera, framme)
CalloutIndivid/gruppVarningar och information till terminal
Remote ControlIndividAT-kommandon (talgrupp, GPS, signal)
LIPIndivid → systemGPS-position till karta
TTSGruppTalsyntes på talgrupp (Admin, Dispatcher, ADAM DI, status)
ADAM I/OLokaltModbus DI/DO kopplat till status och TTS

DGNA — dynamisk grupptilldelning

I dispatcher under fliken DGNA kan operatören tilldela en talgrupp till en eller flera radior över luften (Dynamic Group Number Assignment):

  1. Välj befintlig talgrupp eller skapa tillfällig grupp (nytt GSSI + namn)
  2. Markera radior i listan och/eller ange extra ISSI (kommaseparerat)
  3. Klicka Tilldela grupp

Aktiva tilldelningar visas i tabellen och kan tas bort. DGNA skickas via BREW till Fourc Flex-baserna.

TETRA ↔ DMR (interop)

Four:C Flex kan koppla en TETRA-talgrupp till en DMR-bas via BREW. DMR-sidan körs på en separat Raspberry Pi med MMDVM och dmr-brew-bridge.py — samma enhet kan inte köra TETRA Fourc Flex och DMR samtidigt.

Arkitektur

Konfiguration i admin

Under TETRA ↔ DMR (interop) skapas en brygga per talgrupp:

Online-status visas när bryggan är ansluten till BREW-porten (3003).

Installation på Pi

  1. Skapa BREW-användare för DMR-basen i config.json / admin
  2. Kör scripts/pi/install-dmr-brew-bridge.sh på Pi
  3. Redigera /etc/dmr-brew-bridge.json (mall: dmr-brew-bridge.json.example)
  4. Starta MMDVM-stacken och systemctl start dmr-brew-bridge

Viktiga fält i bryggans JSON:

Röst och signalering

DMR GPS (Motorola LRRP)

Bryggan kan ta emot privat data / LRRP från Motorola-radioer (ok-dmrlib), avkoda position och skicka till Four:C Flex som BREW Service 0x41 (DMR-GPS). Positionerna visas på dispatcher-kartan som övrig LIP. Radioerna måste vara programmerade att skicka GPS till gpsDestId.

Begränsningar

Konfigurationsfiler

Fil Innehåll
config.jsonPortar, TLS, brewUsers, talkgroups, systemIssi, groupCombines, interopBridges, adamIo, tts, sip
users.jsonWebbinloggning (admin/dispatcher/mobile)
Subscriber.jsonISSI-whitelist, namn, roll och webbinloggning
status-codes.jsonStatuskoder och etiketter
/etc/dmr-brew-bridge.jsonDMR-brygga på Pi (server, GSSI, TG, GPS-dest)
data/affiliations.jsonBeständig affiliiering (överlever omstart)
data/lip-latest.jsonSenaste kända positioner (LIP / DMR-GPS)
data/coverage-cells.jsonTäckningskarta (GPS + signal per mätpunkt)
data/dmr-positions.jsonSenaste DMR-GPS-positioner
data/login-log.jsonlInloggningshistorik
certs/TLS-certifikat (skapas automatiskt)

Basstation (BREW)

Exempel på BREW-konfiguration i Fourc Flex (peka på SwMI-servern):

[brew] host = "192.168.0.XXX" port = 3003 tls = false username = 1000001 password = "..." reconnect_delay_secs = 15 feature_sds_enabled = true

På Raspberry Pi kan scripts/pi/basestation-control.py användas som systemd-tjänst för att hålla BREW-anslutningen.

Mjukvaran på basen uppdateras från Admin med knappen Uppdatera — se Uppdatera Fourc Flex (OTA). Tjänsten startar om själv när filen är klar.

Codec: För dispatcher-ljud krävs ETSI ACELP-binärer — kör scripts/install-codec.ps1 på servern.

Felsökning

Problem Åtgärd
Basstation ansluter inte Kontrollera IP, port 3003, tls = false, brewUsers-uppgifter, brandvägg
401 Unauthorized (BREW) Fel användarnamn/lösenord i basens config jämfört med config.json
Certifikatfel i webbläsare Godkänn självsignerat cert i lokalt nät, eller installera certs/server.crt
Inget ljud i dispatcher Tillåt mikrofon, kör codec-installation, kontrollera PTT och talgrupp
ADAM offline / ingen I/O Pinga IP, kontrollera Modbus-port 502, Unit ID, DI/DO-basadresser. Online-status syns i Admin → ADAM I/O.
TTS spelas inte Aktivera TTS i Admin, kontrollera att meddelande och GSSI finns, att basstation är ansluten, och att system-ISSI är korrekt.
SIP-samtal kopplas inte / ingen PTT Aktivera SIP, öppna UDP 5070/RTP, kontrollera anknytning→GSSI, ISSI i Radio ISSI, VOX-tröskel och att PBX skickar PCMU/PCMA.
Radio avvisas / TEI-fel Kontrollera att ISSI finns i whitelist. Om TEI är låst måste den matcha radions 15 hex. Tom låst TEI = endast ISSI. Se händelselogg för TEI-avvisad.
Android-appen loggar inte in Använd http://IP:3003 (inte 3443). Kontot måste vara roll Mobil under ISSI med webb-användarnamn och lösen. Tillåt okänd källa vid APK-install.
OTA startar inte / status försvinner Basen måste vara ansluten. Före v0.5.4 krävs webbadress till dashboard (port 8080). Status efter klick på Uppdatera ligger kvar vid F5 (sparad i webbläsaren).
Ingen röst mellan celler Kontrollera att radios är registrerade och affilierade till samma GSSI
Användarlistan uppdateras inte Ladda om med Ctrl+F5; kontrollera att basen är ansluten till SwMI
Nödlarm visas inte Kontrollera LarmTG (alarm: true) i config och radioaffiliiering
DMR-brygga offline Kontrollera dmr-brew-bridge, BREW-login, interopBridges och att Pi når port 3003
Ingen DMR-GPS på kartan Kontrollera gpsDestId, att radio skickar till rätt ID, och att ok-dmrlib är installerat på Pi
PTT syns men inget DMR-ljud Förväntat utan AMBE-transkodning — signalering fungerar, röst kräver AMBE på Pi
Inga färgfält på täckningskartan Starta mätning under fliken Täckning. Radion måste svara på GPS och CSQ. Kryssa i lagret Täckning på kartan. Fliken måste vara tillåten i Admin → Dispatchers.