Skip to content

Fix POCSAG decoding crash caused by invalid subric parsing - #139

Closed
KoenigMjr wants to merge 6 commits into
BOSWatch:developfrom
KoenigMjr:bugfix/pocsagDecoder
Closed

KoenigMjr wants to merge 6 commits into
BOSWatch:developfrom
KoenigMjr:bugfix/pocsagDecoder

Conversation

@KoenigMjr

@KoenigMjr KoenigMjr commented Oct 21, 2025 •

Copy link
Copy Markdown
Contributor

Errorcode führte zu Programmexit:

12.10.2025 02:20:39,918 - inputThread sdrInput _runThread [ERROR] error in sdr input routine
Traceback (most recent call last):
File "/opt/boswatch3/boswatch/inputSource/sdrInput.py", line 65, in _runThread
self.addToQueue(line)
...
ValueError: invalid literal for int() with base 10: ' '

Ursache:
Die Funktion _getBitrateRicSubric() in pocsagDecoder.py griff fest auf data[40] zu, um den SubRIC-Wert zu ermitteln. Bei Fehlerhaften Datensätzen von multimon-ng kann sich die Position jedoch verschieben, wodurch an dieser Stelle ein Leerzeichen (' ') statt einer Ziffer stand. Dies führte zu einem ValueError und damit zum Abbruch des gesamten SDR-Threads.

Änderung:
Die Funktion wurde auf robuste Regex-Analyse umgestellt (analog fmsDecoder.py und pocsagDecoder.py):

  • Bitrate, Address (RIC) und Function (SubRIC) werden nun mit regulären Ausdrücken extrahiert.
  • Die ursprüngliche Logik (subric = int(Function) + 1) bleibt vollständig erhalten.
  • Enthält die Zeile keine gültige Function, wird eine Warnung geloggt ("Invalid POCSAG function (not 0–3)")
  • Zusätzliche Fehlerabsicherung durch try/except.

Ergebnis:
Der Decoder ist nun tolerant gegenüber Formatabweichungen und verhindert Abstürze bei fehlerhaften oder unvollständigen multimon-ng-Zeilen.

commit 8b220c1
Author: KoenigMjr <135820716+KoenigMjr@users.noreply.github.com>
Date:   Wed Jul 30 13:00:51 2025 +0200

    enh: CSV + Regex für descriptor-Modul

    - Füge CSV-Import über csvPath-Konfiguration hinzu
    - Implementiere Regex-Matching mit isRegex-Flag (YAML & CSV)
    - Erstelle unified cache für YAML- und CSV-Einträge
    - Wildcard-Replacement mit dynamische Beschreibungen
    - Erweitere Logging für bessere Debugging-Möglichkeiten

    Neue Features:
    * CSV-Dateien können parallel zu YAML-Beschreibungen verwendet werden
    * Regex-Unterstützung ermöglicht Pattern-basiertes Matching
    * Wildcards wie {TONE} werden in Beschreibungen ("add"-Werte) ersetzt
    * Vollständige Abwärtskompatibilität zu bestehenden Konfigurationen

    Technische Verbesserungen:
    * Unified cache-System für bessere Performance
    * Korrekte Iteration über Config-Objekte mit default-Parametern
    * Robuste Fehlerbehandlung für CSV-Import
    * continue statt break bei fehlenden scanFields

    Einschränkungen / known limitations:
    * Keine explizite Behandlung von Duplikaten
    * Standardverhalten ist „last one wins“, d. h. das zuletzt passende Descriptor-Objekt überschreibt den Wert
    * Wenn mehrere CSV/YAML denselben Schlüssel liefern, hängt das Ergebnis von Lade- bzw. Listen-Reihenfolge ab
commit 523329a
Author: KoenigMjr <135820716+KoenigMjr@users.noreply.github.com>
Date:   Tue Jun 10 14:08:31 2025 +0200

    Doku-Ergänzung

    update zur neuen Telegram Version

    *in Konfiguration hinzugefügt:*
    Startup_message
    max_retries
    initial_delay
    max_delay

    *gelöscht:*
    queue

    *im Beispiel:*
    Startup_message hinzugefügt

commit 6a0a59c
Author: KoenigMjr <135820716+KoenigMjr@users.noreply.github.com>
Date:   Fri Jul 11 22:24:39 2025 +0200

    Telegram mit Warteschlange

    Durch Einbau einer Warteschlange kein Datenverlust bei belegter API (Sendelimit ca. 30 Nachrichten/min, gibt aber Soft-Limit)

    Exponentielles Backoff mit Maximalgrenze
    Retry-Zähler mit Abbruch bei zu vielen Fehlversuchen
    Kein Wiederholen bei permanenten Fehlern (400/401)
    dynamische Zeitanpassung bei 429 Fehlern

    Fehlerrobustheit verbessert hinsichtlich Connection Error

    neues Plugin ohne telegram-bot

    * Timeout (timeout=10),
    * HTTP-Fehlerprüfung (raise_for_status()),
    * Retry-Logik (3 Versuche mit wachsender Wartezeit),
    * Sauberem Logging mit logger statt print).

    send_location aus altem Skript übernommen und angepasst
commit cd21f07
Author: KoenigMjr <135820716+KoenigMjr@users.noreply.github.com>
Date:   Wed Jun 11 10:56:41 2025 +0200

    feat: Interaktives Installationsskript mit Mehrsprachigkeit, argparse und Logging

    - Neues CLI-Interface via argparse für flexible Steuerung
    - Unterstützt Dry-Run-Modus zur sicheren Vorschau
    - Sprachumschaltung via --lang (de/en)
    - Internationalisierung aller Ausgaben via `t()` und `TEXT`-Dict (Deutsch/Englisch)
    - Logging mit farbiger Terminalausgabe und Logdatei (log/install/)
    - YAML-Validierung und Service-Typ-Erkennung (client/server)
    - Interaktive Benutzerführung für (De)Installation von Services
    - Verbesserte Fehlerbehandlung und Nutzerabfragen mit Fallback
    - DOKU:
    - Install.md (Installation von BW3) ergänzt
    - Service.md (für Install as a Service-Skript) zweisprachig (Deutsch/Englisch) ergänzt
    - mkdocs um Seiten Install/Service/Usage.md ergänzt
@KoenigMjr
KoenigMjr force-pushed the bugfix/pocsagDecoder branch 4 times, most recently from 1dbfa2c to eedb56d Compare October 21, 2025 11:04
@KoenigMjr
KoenigMjr marked this pull request as draft October 21, 2025 11:17
@KoenigMjr

Copy link
Copy Markdown
Contributor Author

Nach Flake-Prüfung hab ich nochmals den Code geändert, scheint jetzt fehlerfrei durch die Prüfung zu kommen, allerdings muss ich nochmal vollumfänglich mit "freiem" Kopf den Code selbst reviewen.

Ihr dürft aber in der Zwischenzeit dennoch gerne auch drüber schauen, ob euch Unfug auffällt.
Fürs Erste mal wieder kurzzeitig im Draft...

@KoenigMjr
KoenigMjr force-pushed the bugfix/pocsagDecoder branch from eedb56d to 2e7390d Compare October 21, 2025 13:28
Errorcode führte zu Programmexit:

12.10.2025 02:20:39,918 - inputThread sdrInput _runThread [ERROR] error in sdr input routine
Traceback (most recent call last):
File "/opt/boswatch3/boswatch/inputSource/sdrInput.py", line 65, in _runThread
self.addToQueue(line)
...
ValueError: invalid literal for int() with base 10: ' '

Ursache:
Die Funktion _getBitrateRicSubric() in pocsagDecoder.py griff fest auf data[40] zu, um den SubRIC-Wert zu ermitteln. Bei Fehlerhaften Datensätzen von multimon-ng kann sich die Position jedoch verschieben, wodurch an dieser Stelle ein Leerzeichen (' ') statt einer Ziffer stand. Dies führte zu einem ValueError und damit zum Abbruch des gesamten SDR-Threads.

Änderung:
Die Funktion wurde auf robuste Regex-Analyse umgestellt (analog fmsDecoder.py und pocsagDecoder.py):

Bitrate, Address (RIC) und Function (SubRIC) werden nun mit regulären Ausdrücken extrahiert.
Die ursprüngliche Logik (subric = int(Function) + 1) bleibt vollständig erhalten.
Enthält die Zeile keine gültige Funktion, wird eine Warnung geloggt ("Invalid POCSAG function (not 0–3)")
Zusätzliche Fehlerabsicherung durch try/except.

Ergebnis:
Der Decoder ist nun tolerant gegenüber Formatabweichungen und verhindert Abstürze bei fehlerhaften oder unvollständigen multimon-ng-Zeilen.
@KoenigMjr
KoenigMjr force-pushed the bugfix/pocsagDecoder branch from 2e7390d to a3338ea Compare October 21, 2025 13:33
Errorcode führte zu Programmexit:

12.10.2025 02:20:39,918 - inputThread sdrInput _runThread [ERROR] error in sdr input routine
Traceback (most recent call last):
File "/opt/boswatch3/boswatch/inputSource/sdrInput.py", line 65, in _runThread
self.addToQueue(line)
...
ValueError: invalid literal for int() with base 10: ' '

Ursache:
Die Funktion _getBitrateRicSubric() in pocsagDecoder.py griff fest auf data[40] zu, um den SubRIC-Wert zu ermitteln. Bei Fehlerhaften Datensätzen von multimon-ng kann sich die Position jedoch verschieben, wodurch an dieser Stelle ein Leerzeichen (' ') statt einer Ziffer stand. Dies führte zu einem ValueError und damit zum Abbruch des gesamten SDR-Threads.

Änderung:
Die Funktion wurde auf robuste Regex-Analyse umgestellt (analog fmsDecoder.py und pocsagDecoder.py):

Bitrate, Address (RIC) und Function (SubRIC) werden nun mit regulären Ausdrücken extrahiert.
Die ursprüngliche Logik (subric = int(Function) + 1) bleibt vollständig erhalten.
Enthält die Zeile keine gültige Funktion, wird eine Warnung geloggt ("Invalid POCSAG function (not 0–3)")
Zusätzliche Fehlerabsicherung durch try/except.

Ergebnis:
Der Decoder ist nun tolerant gegenüber Formatabweichungen und verhindert Abstürze bei fehlerhaften oder unvollständigen multimon-ng-Zeilen.
@KoenigMjr KoenigMjr closed this Oct 21, 2025
@KoenigMjr
KoenigMjr deleted the bugfix/pocsagDecoder branch October 21, 2025 13:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant