Multicast
Beschreibung
Mit diesem Modul können Multicast-Alarme verarbeitet werden. Dabei wird eine Alarmnachricht automatisch an mehrere Empfänger (RICs) verteilt.
Funktionsweise
Multicast-Alarme funktionieren in zwei bis drei Phasen:
-
Delimiter-Phase (Optional): Ein spezieller Delimiter-RIC markiert den Start eines neuen Multicast-Blocks und löscht vorherige wartende Tone-RICs. Der Delimiter selbst wird nicht als Alarm ausgegeben (automatische Filterung). Diese Phase ist optional - ohne Delimiter werden alle leeren Nachrichten als Tone-RICs behandelt.
-
Tone-RIC-Phase: Mehrere RICs empfangen (meist) leere Nachrichten. Diese definieren die Empfänger und "registrieren" sich im Modul als Empfänger für die nächste Multicast-Nachricht.
-
Text-RIC: Ein spezieller Message-RIC empfängt die eigentliche Alarmnachricht. Diese wird dann automatisch an alle zuvor gesammelten Tone-RICs verteilt.
Beispiel:
10:31:16 - RIC: 0123456 SubRIC: 1 Message: (leer) → Delimiter-RIC
10:31:16 - RIC: 0234567 SubRIC: 4 Message: (leer) → Empfänger 1
10:31:16 - RIC: 0345678 SubRIC: 3 Message: (leer) → Empfänger 2
10:31:17 - RIC: 0456789 SubRIC: 1 Message: "B3 WOHNHAUS" → Message-RIC
Generierte Alarme:
→ RIC: 0234567 SubRIC: 4 Message: "B3 WOHNHAUS"
→ RIC: 0345678 SubRIC: 3 Message: "B3 WOHNHAUS"
Wichtig: Jeder Empfänger behält seine ursprüngliche SubRIC, da diese oft unterschiedliche Alarmtypen oder Prioritäten repräsentiert.
Das Modul unterstützt:
- Mehrere Startmarker (Delimiter)
- Mehrere Text-RICs
- Netzident-RIC zur Paketfilterung
- Automatische Bereinigung alter Tone-RICs (Fehlerfall: Auto-Clear)
- Active Trigger System zur verlustfreien Paketauslieferung
- Wildcards für spätere Weiterverarbeitung
- Frequenz-basierte Trennung
- Multi-Instanz-Betrieb mit geteiltem Zustand
Hinweis: Der Delimiter-RIC (0123456) wird automatisch gefiltert und nicht ausgegeben.
Wichtig: Die Text-RIC (Message-RIC) wird nicht als separates Paket ausgegeben. Sie dient nur als Nachrichtenträger, der seinen Text an alle gesammelten Tone-RICs verteilt. Falls keine Tone-RICs vorhanden sind, wird die Text-RIC als multicastMode: single ausgegeben.
Unterstützte Alarmtypen
- POCSAG
Resource
multicast
Konfiguration
| Feld | Beschreibung | Default |
|---|---|---|
| autoClearTimeout | Auto-Clear Timeout in Sekunden - Nicht zugestellte Empfänger werden nach dieser Zeit als incomplete ausgegeben | 10 |
| delimiterRics | Komma-getrennte Liste von Startmarkern, die einen Multicast-Block beginnen (leert sofort vorherige Empfänger und werden automatisch gefiltert wenn konfiguriert) | leer |
| textRics | Komma-getrennte Liste von RICs, die den Alarmtext tragen | leer |
| netIdentRics | Komma-getrennte Liste von Netzwerk-Identifikations-RICs (werden automatisch gefiltert wenn konfiguriert) | leer |
| triggerRic | RIC für das Wakeup-Trigger-Paket (optional, bei leer: dynamisch = erste Tone-RIC) | leer |
| triggerHost | IP-Adresse für Loopback-Trigger | 127.0.0.1 |
| triggerPort | Port für Loopback-Trigger | 8080 |
Achtung: Zahlen welche führende Nullen enthalten müssen in Anführungszeichen gesetzt werden, z.B. '0012345'
Konfigurationsbeispiel 1: Automatische Delimiter-Erkennung (oder nicht verfügbar im Netzwerk) (= Minimalkonfiguration)
- type: module
res: multicast
name: Multicast Handler
config:
textRics: '0299001,0310001'
In diesem Modus werden alle leeren Nachrichten als toneRics behandelt (keine delimiterRics angegeben).
Konfigurationsbeispiel 2: Mit Delimiter-Trenner (empfohlen)
- type: module
res: multicast
name: Multicast Handler
config:
autoClearTimeout: 10
delimiterRics: '0988988'
textRics: '0299001,0310001'
In diesem Modus wird 0988988 als Trenner (= Delimiter) behandelt und alle anderen leeren Nachrichten als Empfänger.
Konfigurationsbeispiel 3: Mit expliziter Trigger-RIC
- type: module
res: multicast
name: Multicast Handler
config:
autoClearTimeout: 10
delimiterRics: '0988988'
textRics: '0299001,0310001'
triggerRic: '9999999'
triggerHost: '127.0.0.1'
triggerPort: 8080
Verwendet eine feste RIC (9999999) für das interne Wakeup-Trigger-Paket.
Konfigurationsbeispiel 4: Mit Netzident-Filterung
- type: module
res: multicast
name: Multicast Handler
config:
autoClearTimeout: 10
delimiterRics: '0988988'
textRics: '0299001,0310001'
netIdentRics: '0000001'
Filtert Netzident-Pakete (RIC 0000001) automatisch aus der Weiterverarbeitung.
Integration in Router-Konfiguration
Das Multicast-Modul sollte vor den Plugins platziert werden, damit die generierten Alarme korrekt verarbeitet werden:
- name: Router POCSAG
route:
- type: module
res: filter.modeFilter
name: Filter POCSAG
config:
allowed:
- pocsag
# Multicast-Modul hier einfügen
- type: module
res: multicast
name: Multicast Handler
config:
textRics: '0299001,0310001'
delimiterRics: '0288088'
autoClearTimeout: 10
# Weitere Module und Plugins
- type: plugin
res: mysql
config:
# ...
- type: plugin
res: telegram
config:
# ...
Beispielhafte Verwendung in Router-Konfigurationen
Das Multicast-Modul gibt für jedes RIC ein eigenes Paket aus UND generiert für konsistente Verarbeitung Listenfelder. Dies ermöglicht es, entweder jede RIC einzeln zu verarbeiten oder die Listenfelder für eine gesammelte Ausgabe zu verwenden. Vor der weiteren Verarbeitung in Plugins empfiehlt sich eventuell eine Filterung mittels RegEx-Filter. Die folgenden Beispiele dienen zur Veranschaulichung der Möglichkeiten des Multicast-Modul in Verbindung mit RegEx-Filter.
Beispiel (Zusätzliche Wildcards werden noch später in diesem Readme erklärt):
router:
- name: Router POCSAG
route:
- type: module
res: filter.modeFilter
config:
[...]
- type: module
res: filter.doubleFilter
config:
[...]
- type: module
res: descriptor
config:
[...]
- type: module
res: multicast
name: Multicast
config:
autoClearTimeout: 10
delimiterRics: '0123456' # Start eines Multicast-Alarms
textRics: '9909909' # Text-RIC
- type: router
res: RouterMySQL
- type: router
res: RouterTelegram
- name: RouterMySQL
route:
- type: module
res: filter.regexFilter
name: Filter MySQL
config:
- name: "Multicast Mode complete or single"
checks:
- field: multicastMode
regex: ^(complete|single)$
- type: plugin
res: mysql
config:
[...]
- name: RouterTelegram
route:
- type: module
res: filter.regexFilter
name: Multicast Recipient Index Filter # 1. Paket, da ist alles drin für einen kombinierten Alarm und ist immer vorhanden
config:
- name: "Multicast 1 Paket pro Alarm-Paket"
checks:
- field: multicastRecipientIndex
regex: ^1$
- type: plugin
res: telegram
config:
message_pocsag: |
<b>{CNAME}</b>
{MSG}
Alarmierte Einheiten [{MCAST_COUNT}]: {DESCRIPTION_LIST}
RICs: {RIC_LIST}
{TIME}
[...]
Modul Abhängigkeiten
- keine
Externe Abhängigkeiten
- keine
Paket Modifikationen
Hinzugefügte Felder bei Multicast-Alarmen:
-
multicastMode(string): Beschreibt das Ergebnis der Multicast-Verarbeitung, besitzt einen der Werte:complete: Vollständiges Multicast-Packetincomplete: Unvollständiges Multicast-Packet (meist fehlt die Text-RIC)single: Einzelner, "normaler" Alarm (Tone-RIC = Text-RIC)control: Netzwerk-Ident-RIC oder andere Verwaltung-RICs
-
multicastRole(string): Beschreibt die Rolle dieses Pakets innerhalb des Multicast-Ablaufs, besitzt einen der Werte:delimiter: Startmarker-Paket (wird automatisch gefiltert wenn delimiterRics konfiguriert)recipient: tatsächlicher Empfängersingle: Einzelner, "normaler" Alarm (Tone-RIC = Text-RIC)netident: Netzwerk-Identifikations-Paket (wird automatisch gefiltert wenn netIdentRics konfiguriert)
-
multicastSourceRic(string): RIC des ursprünglichen Message-RICs multicastRecipientCount(string): Anzahl der Empfänger insgesamt-
multicastRecipientIndex(string): Index dieses Empfängers (1-N), folgende Logik:- Empfänger haben den Index 1 bis n.
- Delimiter/Singles haben Index 1 (da sie alleinstehen).
-
<FELD>_list(string): Liste von Werten aus allen Empfänger-RICs für jedes Originalfeld (z.B. ric_list, message_list)
Veränderte Felder bei Multicast-Alarmen:
ric: Wird durch Empfänger-RIC ersetztsubric: Wird durch Empfänger-SubRIC ersetztsubricText: Wird durch Empfänger-SubRIC-Text ersetztmessage: Bei incomplete-Modus leer, sonst Text von Text-RIC
Rückgabewerte:
- False: Paket wurde blockiert (z.B. Delimiter/Netident-Filterung), Router stoppt Verarbeitung
- Liste von Paketen: Multicast-Verteilung, Router verarbeitet jedes Paket einzeln
- None: Normaler Alarm, Router fährt mit unveränderten Paket fort
Zusätzliche Wildcards
Folgende Wildcards stehen in allen nachfolgenden Plugins zur Verfügung:
| Wildcard | Beschreibung | Beispiel |
|---|---|---|
| {MCAST_SOURCE} | RIC des ursprünglichen Message-RICs | 0299001 |
| {MCAST_COUNT} | Gesamtanzahl der Empfänger dieses Multicasts. | 3 |
| {MCAST_INDEX} | Index des Empfängers (1-basiert für Recipients, 0 für Control-Pakete) | 0, 1, 2, 3, ... |
| {MCAST_MODE} | Art der Multicast-Verarbeitung durch das Modul | complete, incomplete, single, control |
| {MCAST_ROLE} | Rolle des Pakets im Multicast-Ablauf | recipient, single, delimiter, netident |
Erweiterung der Listen-Wildcards
Das Modul generiert Wildcards für alle gesammelten Felder (RICs, SubRICs, etc.) in Listenform. Diese sind besonders nützlich, um eine kombinierte Ausgabe (z.B. in Telegram) zu erstellen:
| Wildcard | Beschreibung | Zugrundeliegendes Feld | Beispiel |
|---|---|---|---|
| {RIC_LIST} | Liste aller RICs der Empfänger (durch Komma getrennt). | ric_list | "0299001, 0299002" |
| {SUBRIC_LIST} | Liste aller SubRICs der Empfänger | subric_list | "4, 3" |
| {DESCRIPTION_LIST} | Liste aller (deskriptiven) Namen der Empfänger. | description_list | "FF Musterstadt, BF Beispiel" |
| { |
Liste der Werte für jedes Originalfeld aus dem Paket | {FREQUENCY_LIST}, |
Wichtig: Verwende die originalen Feldnamen (z.B. frequency_list), nicht die Wildcard-Namen (z.B. ~~FREQ_list~~).
Verwendungsbeispiel in Plugins, z.B. Telegram-Plugin:
- type: plugin
res: telegram
config:
message_pocsag: |
{CNAME}
{MSG}
RIC: {RIC} / SubRIC: {SRIC}
Multicast: {MCAST_INDEX}/{MCAST_COUNT} (Quelle: {MCAST_SOURCE})
{TIME}
Funktionsweise im Detail
Active Trigger System (Verlustfreie Paketauslieferung)
Das Modul verwendet ein aktives Trigger-System, um sicherzustellen, dass keine Multicast-Pakete verloren gehen:
-
Deferred Delivery: Bei einem Auto-Clear-Timeout werden die incomplete-Pakete nicht sofort ausgegeben, sondern in einer internen Queue gespeichert.
-
Wakeup-Trigger: Das Modul sendet ein spezielles Trigger-Paket via Loopback-Socket (Standard: 127.0.0.1:8080) zurück an den BOSWatch-Server.
-
Queue-Flush: Beim Empfang des Trigger-Pakets werden alle gespeicherten Pakete aus der Queue ausgegeben.
Trigger-RIC Auswahl (3-stufige Fallback-Kette):
- Explizit: Wenn triggerRic konfiguriert ist, wird diese RIC verwendet
- Dynamisch: Wenn nicht konfiguriert, wird die erste Tone-RIC der aktuellen Gruppe verwendet
- Fallback: Falls keine Tone-RICs vorhanden sind (sollte nicht vorkommen), wird "9999999" verwendet
Beispiel-Ablauf bei Auto-Clear:
10:31:16 - Tone-RIC empfangen (0234567)
10:31:16 - Tone-RIC empfangen (0345678)
10:31:26 - Auto-Clear-Timeout (10s) erreicht
→ Incomplete-Pakete in Queue gespeichert
→ Trigger-Paket via Loopback gesendet (RIC: 0234567)
10:31:26 - Trigger-Paket durch BOSWatch-Server verarbeitet
→ Queue-Flush: Incomplete-Pakete werden ausgegeben
Vorteile: - Keine Pakete gehen verloren, auch bei hoher Systemlast - Saubere Trennung von Verarbeitung und Ausgabe - Ermöglicht zeitlich versetzte Ausgabe ohne Race Conditions
Zeitbasierte Verarbeitung
- Tone-RIC-Sammlung: Tone-RICs (meist leere Nachrichten) werden empfangen und gespeichert
- Auto-Clear: Nach
autoClearTimeoutSekunden ohne Text-RIC werden die Tone-RICs als incomplete ausgegeben (via Trigger-System) - Text-RIC-Verteilung: Sobald ein Text-RIC empfangen wird, erfolgt die sofortige Verteilung an alle gesammelten Tone-RICs
- Hard-Timeout-Cleanup: Nach 3x
autoClearTimeout(oder max. 120s) werden veraltete Pakete aus dem Speicher gelöscht (Failsafe)
Frequenz-Trennung
Das Modul trennt Multicast-Listen nach Frequenzen. Dies verhindert Vermischung von Alarmen verschiedener Sender.
Beispiel:
Frequenz 173.050 MHz: Tone-RICs [0234567, 0345678]
Frequenz 173.075 MHz: Tone-RICs [0456789, 0567890]
→ Werden getrennt verarbeitet, keine Vermischung möglich
SubRIC-Erhaltung
Wichtig: Jeder Empfänger behält seine ursprüngliche SubRIC aus der Tone-RIC-Phase. Dies ist entscheidend, da SubRICs unterschiedliche Bedeutungen haben können, z.B.:
- SubRIC 1 (a): Alarmierung
- SubRIC 2 (b): Information
- SubRIC 3 (c): Probealarm
- SubRIC 4 (d): Sirenenalarm
Beispiel:
Eingehende Tone-RICs:
- RIC: 0234567 SubRIC: 4 (Sirenenalarm)
- RIC: 0345678 SubRIC: 3 (Probealarm)
Text-RIC: RIC: 0456789 SubRIC: 1 Message: "B3 WOHNHAUS"
Ausgegebene Multicast-Pakete:
→ RIC: 0234567 SubRIC: 4 Message: "B3 WOHNHAUS" (behält SubRIC 4!)
→ RIC: 0345678 SubRIC: 3 Message: "B3 WOHNHAUS" (behält SubRIC 3!)
Automatische Filterung
- Delimiter-Pakete: Werden automatisch gefiltert (nicht weitergegeben), wenn
delimiterRicskonfiguriert ist - Netzident-Pakete: Werden automatisch gefiltert (nicht weitergegeben), wenn
netIdentRicskonfiguriert ist - Filterung nach multicastRole: Ermöglicht saubere nachgelagerte Verarbeitung ohne manuelle Filter
Multi-Instanz-Betrieb
Das Modul unterstützt mehrere parallele Instanzen mit geteiltem Zustand:
- Shared State: Alle Instanzen teilen sich den Tone-RIC-Speicher (frequenz-basiert)
- Instance-Specific Timeouts: Jede Instanz kann eigene
autoClearTimeout-Werte haben - Global Cleanup Thread: Ein globaler Thread prüft alle Instanzen auf Timeouts
- Thread-Safe: Alle Operationen sind thread-sicher mit Locks geschützt