Login
0180 1111 128

SMS an einen bestimmten Port senden

In letzter Zeit erhalten wir zunehmend Supportanfragen, ob wir den Versand von SMS-Textnachrichten an einen bestimmten Port an einem Telefon unterstützen.  Die kurze Antwort lautet ja, aber dies ist als ein Thema für Fortgeschrittene anzusehen, das die meisten Benutzer nicht betrifft und bei dem es sich um einen weitgehend manuellen Vorgang handelt. Wenn Sie also die Ärmel hochkrempeln und hier eintauchen möchten, lesen Sie bitte weiter, aber machen Sie sich auf einen kleinen Vorspann gefasst, bevor wir zu den harten Fakten kommen. Außerdem gehen wir davon aus, dass Sie wissen, wie man einen Web Service nutzt oder HTTP Post-Abfragen bei einer Webseite durchführt.

Eine kurze Einführung in SMPP und PDUs

Die meisten unserer Verbindungen mit Netzbetreibern erfolgen über das SMPP-Protokoll (vgl. smsforum.net zum Download der Spezifikation).  Um eine SMS an einen bestimmten Port zu senden, sind zumindest rudimentäre Kenntnisse über die Konzepte dieses Protokolls, insbesondere über die SubmitSM Protocol Data Unit (oder PDU genannt), erforderlich.  Ganz locker gesprochen funktioniert das SMPP über Abfrage- und Antwort-PDUs.  Um eine Nachricht zu senden, senden wir eine SubmitSM-PDU an den Netzbetreiber, der dann eine Antwort-PDU sendet, um mitzuteilen, dass sie akzeptiert wurde.

Eine SubmitSM-PDU enthält alles, was der Netzbetreiber braucht, um eine einzige Textnachricht zu senden: die Ursprungs- (originator) und Ziel- (destination) Mobilfunknummern (in den Quell- und Ziel-Adressparametern), den zu sendenden Nachrichtentext (im Abschnitt Benutzerdaten (user data)) und eine Reihe anderer Parameter, die wir setzen müssen, um den Inhalt der Nachricht zu beschreiben.

Die beiden wichtigsten dieser Parameter sind das Data Coding Scheme und die ESM Class (ESM-Klasse).  Das Data Coding Scheme (oder DCS genannt) beschreibt, wie die Bytes im Abschnitt "user data" der PDU kodiert werden.  Die ESM Class beschreibt spezielle Attribute, die auf die Nachricht angewandt werden (hierzu später mehr).

Wichtig: Es gibt keine Parameter in einer SubmitSM-PDU, welche direkt die Quell- und Ziel-Ports der Anwendung auf dem Zieltelefon ansprechen.

Wie geben wir also Port-Werte in der PDU an, wenn es keine Parameter für diese gibt?  Wir legen einen Header auf den Bereich "user data" (Benutzerdaten).

Einführung in User Data Header (UDH)

Ein UDH ist eine Reihe von Bytes im "user data"-Abschnitt einer SubmitSM-PDU.  Eine Standard-Textnachricht enthält keinen UDH, wird also wie eine normale Textnachricht am Telefon behandelt und wird an den Standard-Posteingang ausgeliefert.  Ein UDH kann Port- und Verkettungsinformationen enthalten, die dem Telefon mitteilen, wohin die Nachricht gesendet werden soll und ob es weitere Teile der Nachricht gibt, auf die es warten muss.

Für die Zwecke dieses Beispiels interessieren wir uns hier nur für die Port-Informationen im UDH.

Unten sehen Sie einen Strom von Bytes (hex-kodiert), der sich im Abschnitt "user data" der PDU für eine WAP-Push-Nachricht befindet (da eine WAP-Push-Nachricht Port-Informationen enthalten muss):

0605040B8423F025060A03AE81EAAF828DADB48401056A0045C60C0364657670726F6A32302E626C6F6773706F742 E636F6D2F000801034D7920426C6F67000101

Der Header dieser Nachricht lautet:

0605040B8423F0

Die ersten drei Bytes hier (060504) beschreiben verschiedene Längen im Header.  Die Port-Informationen sind in den nächsten vier Bytes enthalten (0B8423F0).  Zusammengefasst lässt sich die komplette Nachricht aufschlüsseln in:

060504: Längenindikatoren
0B84: Ziel-Port (2948) 
23F0: Ursprungs-Port (9200)
25060.... : die eigentlichen Nachrichten-Bytes, die die URL beschreiben sowie ein Stück Text.

Daher ist eine WAP-Push-Nachricht eine Reihe von Bytes mit einem UDH, der den Ziel-Port 2948 und Quell-Port 9200 angibt.  Da Header aber optional auf einem "user data"-Abschnitt sitzen, woher weiß das Telefon, dass ein Header vorhanden ist?  Wir zeigen dies im "ESM Class"-Parameter der PDU an.

UDH-Indikator und Datenkodierung

Der "ESM Class"-Parameter spielt eine sehr mächtige Rolle dabei, wie die Nachricht interpretiert und auf dem Telefon angezeigt wird, und er besteht aus nur einem Byte.  Kombinationen einzelner Bits innerhalb dieses Bytes zeigen unterschiedliche Anforderungen an, aber das eine, an dem wir interessiert sind, befindet sich im UDH Indikator.  Wenn Sie diese Bits setzen (und Sie brauchen keine anderen zu setzen), lautet der Wert des "ESM Class"-Byte 64 (0x40), und dies zeigt an, dass ein UDH im "user data"-Abschnitt vorhanden ist.

Der DCS-Parameter kommt hier ins Spiel, indem er anzeigt, wie die Bytes nach dem Header (sofern einer vorhanden ist) dekodiert werden müssen.  In einer normalen Nachricht ohne Header ist dieser Parameter auf 0 gesetzt, was darauf verweist, dass das Standard-Alphabet vom Netzbetreiber verwendet wird.  In einer WAP-Push-Nachricht ist dieser auf 4 gestellt, um 8-bit-binär anzuzeigen.

Wie sende ich also eine Nachricht an einen Port?

Nun, wo Sie mit den Konzepten vertraut sind, kann ich Ihnen erzählen, worum es in diesem Artikel eigentlich geht.  Wir setzen einen Advanced Send Service als Web Service sowie eine HTTP Post-Schnittstelle ein.  Wenn Sie sich einen davon ansehen, sehen Sie ESMClass- und DataCodingScheme-Parameter (vgl.: Ich hatte bereits erwähnt, dass sie wichtig sind; wenn Sie also erst hier angefangen haben zu lesen und nicht wissen, worüber ich spreche, gehen Sie bitte zurück und lesen Sie alles nach).

Hier ein Beispiel:  Angenommen, Sie müssen eine Textnachricht mit dem Inhalt "ab" (ohne Anführungsstriche) an Port 5000 senden (für die echten Port-Werte müssen Sie in der Dokumentation der Anwendung nachschlagen, an die Sie senden). 

1. Bauen Sie den Header auf

Sie müssen den Header aufbauen und den Text an dessen Ende kodieren.

In diesem Beispiel lautet der Header:

06050413880000

Weil:

060504: Längenindikatoren
1388: Ziel-Port (5000)
0000: Ursprungs-Port (nullen Sie ihn aus, wenn Sie keinen spezifischen Port benötigen)

2. Kodieren Sie Ihren Text

Kodieren Sie Ihren Text in ASCII und hängen Sie ihn an den Header an.  Der Text "ab" lautet 0x6162, daher lautet Ihre komplette Nachricht mit Header:

060504138800006162

3. Übertragen Sie die Nachricht

In diesem Fall ist der Wert für die ESMClass-Parameter 64, und das DataCodingScheme sollte auf 0 gesetzt sein.  Geben Sie die Zeichenkette 060504138800006162 als "body"-Parameter ein; geben Sie Werte für die restlichen Parameter (Ursprung, Ziel usw.) ein und initiieren Sie die Übertragung.

Und das war's.  Solange Ihr Header korrekt ist und Sie den Text korrekt kodiert haben, sollte die Nachricht an die gewünschte Anwendung auf dem Zieltelefon ausgeliefert werden.

Wichtige Hinweise

Einige Dinge, die Sie bei dieser Art des Versendens von Nachrichten beachten sollten

  • Wenn das Telefon, an das Sie senden, die Nachricht nicht interpretieren kann, geschieht normalerweise überhaupt nichts.  Sie erhalten eine Empfangsbestätigung für die Nachricht, die besagt, dass sie an das Telefon ausgeliefert wurde, aber Sie sehen nichts auf der Anzeige.  Das macht das Debuggen sehr schwierig.
  • Der "body"-Parameter (in diesem Fall) muss eine hex-kodierte Zeichenkette der Bytes sein, die Sie versenden möchten.  Das bedeutet 2 Hex-Zeichen pro Byte.  Beispiel: 0xA sollte als 0A und nicht nur als A gesendet werden.
  • Die Werte für die ESMClass und DCS sollten aus Dezimalzahlen bestehen
  • Hinsichtlich der Zeichenkodierung haben wir vereinzelte Berichte darüber erhalten, dass einige alphanumerische Zeichen nicht korrekt angezeigt werden, aber wir haben die Ursache hierfür noch nicht finden können.  Wenn Sie Kodierungsprobleme haben, wenden Sie sich bitte an den Hilfestellung.
Kundenmeinungen
quote

Die flexible Schnittstelle und der exzellente technische Support erlaubten uns eine Integration in unser Front Office-System mit minimalem Aufwand. Ein exzellentes Unternehmen.

James Reeve, Pulsestaffing

© Esendex Limited 2012
Company Registration Number: 04217280