Kurznachrichten auf die komplizierte Art

Leider unterstützen viele Telefone nicht die komfortable Art der Übergabe von Textnachrichten im Textmodus, also als Klartext (was man, nebenbei bemerkt, mittels at+cmgf=? abfragen kann). Als praktischen Ersatz für Klartext dafür haben die Erfinder des mobilen Telefonierens den PDU-Modus geschaffen. Der sieht so aus:

at+cmgs=28
> 079194712272303325000C91947112325476000008D4F29C4E2FE3E9
+CMGS: 37
OK

Der Vorteil des Textmode wäre: man kanns lesen.
Der Vorteil des PDU-Mode ist: man hat volle Kontrolle darüber, was passiert und was nicht. Und wie das geht, das sehen wir jetzt.

Wem das alles deutlich zu kompliziert ist und dafür seinen PC verwenden möchte, dem sei PDUspy ans Herz gelegt. Gibts auf der Downloadseite.

Zum generellen Verständnis einiger Merkwürdigkeiten sollte man eines immer im Hinterkopf behalten:
Die Bitanordnung der Hexadezimaldarstellung ist wie gewohnt von Bit 7 bis Bit 0 (b7 b6 b5 b4 b3 b2 b1 b0).
Die Bits werden aber im Netz beginnend mit Bit 0 übertragen, also quasi von hinten nach vorne.
Dies führt an einigen wesentlichen Stellen, namentlich der Darstellung der Rufnummern und der Textdaten, zu recht ungewohnten Betrachtungsweisen.


Aufbau der PDU zum Nachrichtenversand

Die an das Telefon zu übergebende PDU zum Versand einer Kurznachricht besteht aus 2 wesentlichen Teilen:
  • der Adresse des zu verwendenden SMSC, diese ist optional
  • der eigentlichen SMS-SUBMIT-PDU, wie sie auch im Netz übertragen wird
die sich wie folgt zusammensetzen:
07 91947122723033 25 00 0C 91947112325476 00 00 0B D4F29C4E2FE3E9BA4D19
oder, ohne SMSC-Adresse:
00 25 00 0C 91947112325476 00 00 0B D4F29C4E2FE3E9BA4D19

Zur Erläuterung der einzelnen PDU-Elemente:
  • SMSC-Addresse nach TS GSM 04.11
    07 91947122723033
    im ersten Byte dieses Informationselements steht die Länge der gelieferten Adressdaten (also die Länge der SMSC-Adresse) in Bytes, in diesem Beispiel also 7 Bytes: 0x07.
    Im zweiten Byte steht der TOA (Type of address) der SMSC-Adresse, der sich wie folgt zusammensetzt:
    • Bit 7: Immer 1
    • Bit 6,5,4: TON (type of number) entweder 001 ('international number', Nummer beginnt mit der Landesvorwahl) oder 000 (unknown, alles andere)
    • Bit 3,2,1,0: NPI (numbering plan identifier), immer 0001 (E.164/E.163)
    was also genau 2 Möglichkeiten gibt: 0x91 für Nummern im internationalen Format oder 0x81 für Nummern im nationalen Format mit Ortsvorwahl oder Nummern ohne Vorwahl. Andere Werte können natürlich verwendet werden, führen aber zu nicht vorhersehbaren Ergebnissen.
    Die restlichen Bytes enthalten die Nummer des SMSC das verwendet werden soll um die Nachricht zu verarbeiten, und zwar BCD-kodiert, also je 4 Bit ergeben eine Ziffer der Nummer. Die Nummer beginnt im zweiten Halbbyte des ersten Bytes, ein eventuell nicht benutztes Halbbyte an der letzten Stelle muß unter 0xF enthalten.
    1 Byte
    7 6 5 4 3 2 1 0
    zweite Ziffer erste Ziffer
    vierte Ziffer dritte Ziffer
    sechste Ziffer fünfte Ziffer
    ... ...
    1 1 1 1 letzte Ziffer
    Die +49172123456 würde also so dargestellt:07919471123254F6, die 1212 so: 03812121
    00
    Wichtig: Wenn im Telefon bereits eine SMSC-Nummer konfiguriert ist und diese verwendet werden soll, dann kann die Angabe der SMSC-Adresse entfallen. Hierzu wird einfach als Längenbyte 0x00 übergeben.
     
  • Message Flags:
    25
    effizienterweise sind hier in einem Byte gleich 6 Parameter untergebracht:
    0x25  
    0 0 1 00 1 01  
                TP-MTI Message Type Indication: 01 für 'SMS-SUBMIT MS to SMSC'
                TP-RD Reject Duplicates: 0 für 'aus', 1 für 'ein'
                TP-VPF Validity Period: 00 für kein VP-Feld vorhanden
                TP-SRR Status Report Request: 0 für 'aus', 1 für 'ein'
                TP-UDHI User Data Header Ind.: 0 für 'no UDH'
                TP-RP Reply Path: 0 für 'aus', 1 für 'ein'

     
  • Message Reference Number:
    00
    eine lokal verwendete Referenznummer für die zu verschickende Kurznachricht. Zustellbestätigungen oder Fehlermeldungen enthalten diese Referenznummer und können damit der ursächlichen Nachricht zugeordnet werden. Das Telefon vergibt selbständig eine eigene Referenznummer, falls keine angegeben wird, deshalb hier 0x00
     
  • Destination Address nach TS GSM 03.40:
    0C91947112325476
    das erste Byte dieses Informationselements gibt die Anzahl Ziffern der Zieladresse an. Der Rest der Nummer wird wie bei 'SMSC-Address' kodiert wobei hier der TON nicht im Längenbyte mitgezählt wird.
     
  • Protocol Identifier:
    00
    gibt an, welches Protokoll den verschickten Daten zugrunde liegt. Ein simples 0x00 genügt im Allgemeinen hier, was lt. GSM 03.40 den Defaultwert darstellt.
     
  • Data Coding Scheme:
    00
    dieses Byte signalisiert dem empfangenden Telefon, wie die Daten der Kurznachricht zu decodieren sind. Ein simples 0x00 genügt auch hier den meisten Erfordernissen:
    • Bits 7-4: 0000xxxx enthalten die 'coding group' und geben damit Aufschluss darüber, wie die Bits 3 bis 0 zu verstehen sind.
    • Bit 3-0: xxxx0000 enthalten in diesem Fall lediglich den Hinweis, dass der genormte 7-Bit Zeichensatz nach TS GSM 03.38 zu verwenden sei. Man kann den hier nachlesen

     
  • User Data:
    0B D4F29C4E2FE3E9BA4D19
    und wieder ein Längenbyte: das erste Byte gibt an, wie viele Zeichen Nutzdaten folgen, und zwar nach dem decodieren der Nachricht. Man sollte hierbei beachten, daß ein Zeichen nur 7Bit lang ist, zur Übertragung 8*7Bit jedoch in 7 Byte verpackt werden. Die folgenden Bytes enthalten dann die Nachricht. Wers gerne testen möchte: die o.a. Nachricht sollte 'Testtext:€' ergeben. Dazu muss man die 3GPP TS 23.038 aber wirklich verstanden haben...;-)
    Die 8-nach-7-Bit-Wandlung funktioniert nach folgendem Prinzip:
    Originaldaten:   Bit7 abschneiden:   7 Bit packen:
             
    76543210
    76543210
    76543210
    76543210
    76543210
    76543210
    76543210
    76543210
     
    6543210
    6543210
    6543210
    6543210
    6543210
    6543210
    6543210
    6543210
     
    06543210
    10654321
    21065432
    32106543
    43210654
    54321065
    65432106
    Nicht benutzte Bits im letzten Byte sollten auf '0' gesetzt werden.
     
  • Der verwendete Zeichensatz für die verwendeten 7bit-Zeichen sieht so aus:
    0x000x100x200x300x400x500x600x70
    0x00@Δ 0¡P¿p
    0x01£_!1AQaq
    0x02$Φ"2BRbr
    0x03¥Γ#3CScs
    0x04èΛ¤4DTdt
    0x05éΩ%5EUeu
    0x06ùΠ&6FVfv
    0x07ìΨ'7GWgw
    0x08òΣ(8HXhx
    0x09ÇΘ)9IYiy
    0x0A¹Ξ*:JZjz
    0x0Bس+;KÄkä
    0x0CøÆ,<LÖlö
    0x0D²æ-=MÑmñ
    0x0EÅß.>NÜnü
    0x0FåÉ/?O§oà
    ¹: ist ein Zeilenvorschub (LF, Linefeed)
    ²: ist ein Wagenrücklauf (CR, Carriage Return)
    ³: ist ein ESC. Dieses Zeichen zeigt an daß als nächstes ein Zeichen einer Zeichensatzerweiterung folgt. Es existieren Zeichensatztabellen für Türkisch, Spanisch, Portugiesisch sowie die Standarderweiterung:
    0x000x100x200x300x400x500x600x70
    0x00|
    0x01
    0x02
    0x03
    0x04ˆ
    0x05
    0x06
    0x07
    0x08{
    0x09}
    0x0A¹
    0x0B²
    0x0C[
    0x0D˜
    0x0E]
    0x0F\
    ¹: ist ein Seitenumbruch (Page Break)
    ²: ist ein ESC. Dieses Zeichen zeigt an daß als nächstes ein Zeichen eines erweiterten Zeichensatzes folgt.