Analysieren Sie die Protokoll-Pager-Nachrichten POCSAG, P2

    Hi, Habr!

    Im ersten Teil wurde das POCSAG-Paging-Protokoll betrachtet. Wurden als digitale Nachrichten betrachtet, wenden wir uns nun den vollständigeren Nachrichten im ASCII-Format zu. Außerdem ist es interessanter, sie zu decodieren, weil Die Ausgabe wird lesbarer Text sein.


    Für diejenigen, die daran interessiert sind, wie es funktioniert, wurde unter dem Schnitt fortgesetzt.

    Signal empfangen


    Zunächst muss das Signal akzeptiert werden, wofür wir denselben rtl-sdr-Receiver und HDSDR-Programm verwenden. Wir wissen bereits aus dem ersten Teil, dass Paging-Nachrichten numerisch sein können (der Inhalt besteht nur aus Ziffern 0-9, der Buchstabe U ist "hässlich", ein Leerzeichen und ein Paar Klammern) und alphanumerisch, der Inhalt ist aus vollständigen ASCII-Zeichen. Natürlich kennen wir die Art der Nachricht nicht im Voraus (es ist immer noch nicht möglich, sie "nach Gehör" zu dekodieren). Daher wählen wir bei der Aufnahme einfach eine längere Nachricht.



    Das Programm zum Konvertieren einer WAV-Datei in einen Bitstrom wurde bereits berücksichtigt. Das Ergebnis wird sofort angezeigt. Die Paging-Nachricht sieht folgendermaßen aus:



    Einige Merkmale sind mit bloßem Auge sofort sichtbar - beispielsweise ist zu sehen, dass die Startsequenz 01010101010101 zweimal wiederholt wird. Ie Diese Nachricht ist nicht nur länger, sondern besteht tatsächlich aus zwei „zusammengeklebten“ Elementen, die jedoch vom Standard nicht verboten werden.

    Dekodierung


    Zu Beginn erinnern wir uns an eine kurze Zusammenfassung des vorherigen Teils . Die Paging-Nachricht beginnt mit einem langen Header 0101010101, gefolgt von einer Folge von "Paketen", im Bild als Batch1..N dargestellt:

    Bild

    Jedes Paket beginnt mit dem Anfangsrahmen des Frame-Sync-Codes (01111100 ...), gefolgt von 32-Bit-Blöcken. Jeder Block kann entweder eine Adresse oder einen Nachrichtentext speichern.

    Das letzte Mal, als wir uns nur digitale Nachrichten angesehen haben, interessieren wir uns jetzt für ASCII-Nachrichten. Zunächst müssen Sie lernen, zwischen ihnen zu unterscheiden. Dazu benötigen wir das Feld "Funktionsbits" - wenn diese 2 Bits gleich 00 sind, ist die Nachricht digital, wenn 11, dann die Textnachricht.

    Wie aus der Figur ersichtlich ist, werden dem Nachrichtenfeld 20 Bits zugewiesen, das idealerweise in 5 4-Bit-BCD-Codes angeordnet ist, wenn die Nachricht digital ist. Wenn es sich bei der Nachricht jedoch um Text handelt, passt der Text in 20 Bit nicht viel, und selbst 20 ist nicht in 7 oder 8 unterteilt. Wir können davon ausgehen, dass die erste Version des Protokolls (und es wurde bereits 1982 erstellt) nur digitale Nachrichten unterstützte ( Ja) und es ist unwahrscheinlich, dass die ersten Pager dieser Jahre auf Nixie-Tubes mehr anzeigen konnten , und erst dann wurde in der nächsten Version Unterstützung für ASCII hinzugefügt. Aber seit Es war nicht mehr möglich, den Formatstandard zu durchbrechen, sie machten es einfacher: Der Bitstrom wird einfach zusammengefügt (20 Bits werden aus jeder Nachricht extrahiert und am Ende des Puffers hinzugefügt), und am Ende wird alles in Zeichen dekodiert.

    Betrachten Sie einen Block einer empfangenen Nachricht (Leerzeichen hinzugefügt zur Klarheit):

       0 0001010011100010111111110010010
       1 00010100000110110011 11100111001
       1 01011010011001110100 01111011100
       1 11010001110110100100 11011000100
       1 11000001101000110100 10011110111
       1 11100000010100011011 11101110000
       1 00110010111011001101 10011011010
       1 00011001011100010110 10011000010
       1 10101100000010010101 10110000101
       1 00010110111011001101 00000011011
       1 10100101000000101000 11001010100
       1 00111101010101101100 11011111010

    In der ersten Zeile zeigt "0" im ersten Bit an, dass es sich um ein Adressfeld handelt, und "11" in den Bits 20-21 zeigt an, dass diese Nachricht symbolisch ist. Dann nehmen Sie einfach 20 Bits aus jeder Zeile und addieren sie zusammen.

    Wir erhalten die folgende Bitfolge:

    00010100000110110011010110100110011101001101000111011010010011000001101000
    11010011100000010100011011001100101110110011010001100101110001011010101100
    000010010101000101101110110011011010010100000010100000111101010101101

    Das POCSAG-Protokoll verwendet 7-Bit-ASCII. Teilen Sie also die Zeichenfolge in Blöcke von 7 Bits auf:

    0001010 0000110 1100110 1011010 0110011 1010011 ...

    Wir versuchen, Zeichencodes zu decodieren (die ASCII-Tabelle wird im Internet leicht gegoogelt), und ... wir bekommen Müll bei der Ausgabe. Öffnen Sie erneut die Dokumentation und suchen Sie nach dem unauffälligen Satz "ASCII-Zeichen werden von links nach rechts (MSB zu LSB) eingefügt. Das LSB sendet zuerst. ” Ie Das niederwertige Bit wird zuerst übertragen und dann das höherwertige Bit. Um ASCII-Codes richtig zu decodieren, müssen die 7-Bit-Strings umgedreht werden.

    Um dies nicht manuell zu tun, schreiben wir den Code in Python:

    def parse_msg(block):
        msgs = ""
        for cw in range(16):
            cws = block[32 * cw:32 * (cw + 1)]
            # Skip the idle word
            if cws.startswith("0111101010"):
                continue
            if cws[0] == "0":
                addr, type = cws[1:19], cws[19:21]
                print("  Addr:" + addr, type)
            else:
                msg = cws[1:21]
                print("  Msg: " + msg)
                msgs += msg
        # Split long string to 7 chars blocks
        bits = [msgs[i:i+7] for i in range(0, len(msgs), 7)]
        # Get the message
        msg = ""
        for b in bits:
            b1 = b[::-1]  # Revert string
            value = int(b1, 2)
            msg += chr(value)
        print("Msg:", msg)
        print()
    

    Als Ergebnis erhalten wir die folgende Reihenfolge (Bits, Zeichencodes und die Zeichen selbst):

    0101000 40 (
    0110000 48 0
    0110011 51 3
    0101101 45 -
    1100110 102 f
    1100101 101 e
    1100010 98 b
    0101101 45 -
    0110010 50 2
    0110000 48 0
    0110001 49 1
    0111001 57 9
    0100000 32
    0110001 49 1
    0110011 51 3
    0111010 58 :
    0110011 51 3
    0110001 49 1
    0111010 58 :
    0110100 52 4
    0110101 53 5
    0100000 32
    0101010 42 *
    0110100 52 4
    0110111 55 7
    0110110 54 6
    0101001 41 )
    0100000 32
    1000001 65 A
    1010111 87 W
    1011010 90 Z
    

    Kombinieren Sie die Zeichen und erhalten Sie die Zeichenfolge: "(03-feb-2019 13:31:45 * 476) AWZ". Wie zu Beginn des Artikels versprochen, ist der Text gut lesbar.

    Ein weiterer interessanter Punkt ist übrigens, dass, wie Sie sehen, das Protokoll 7-Bit-ASCII verwendet. Kyrillische Zeichen passen nicht in diesen Bereich. Daher wurde die Frage, wie die russische Sprache aufgerufen wurde, offen gelassen. Wenn jemand weiß, schreibe in die Kommentare.

    Schlussfolgerungen


    Natürlich wurde das Protokoll nicht vollständig zerlegt, aber der interessanteste Teil ist erledigt, und dann bleibt eine Routine, die nicht mehr so ​​interessant ist. Zumindest gibt es keine Dekodierung der Empfängeradressen (Capcodes), und die Unterstützung des Fehlerkorrekturcodes (BCH Check Bits) ist nicht implementiert - dies würde die Korrektur von bis zu 2 Bits ermöglichen, die während der Übertragung beschädigt wurden. Das Ziel ist jedoch, einen vollwertigen Decoder zu machen, der nicht standhält - solche Decoder sind bereits vorhanden und werden kaum benötigt.

    Wer mit rtl-sdr Nachrichten dekodieren möchte, kann dies mit dem kostenlosen PDW- Programm selbst tun . Es ist keine Installation erforderlich. Nach dem Start muss der HDSDR-Ausgang mithilfe des Virtual-Audiokabel-Programms zum PDW-Eingang umgeleitet und das entsprechende Gerät in den PDW-Audioeinstellungen ausgewählt werden.

    Das Ergebnis des Programms sieht folgendermaßen aus:



    In diesem Thema können Paging-Nachrichten als geschlossen betrachtet werden. Wer sich näher mit dem Thema beschäftigen möchte, kann die Quellcodes des Multimon-ng- Programms studieren , das viele Protokolle einschließlich POCSAG und FLEX entschlüsseln kann.

    Jetzt auch beliebt: