Binäre SMS: Senden von Rich Content an Geräte mit SMS

In diesem Artikel wird von einer hohen auf eine niedrigere Ebene erläutert, wie Sie eine einfache SMS-fähige mobile Anwendung schreiben, mit der Sie „Over-the-Air-Installationsnachrichten“ senden können. Nachdem Sie diesen Artikel gelesen haben, können Sie ein kleines J2ME-Applet erstellen, das sich theoretisch mit einer SMS-Nachricht als Zustellmittel an ein anderes Telefon sendet. Aufgrund von Einschränkungen in der Wireless Messaging API in J2ME (JSR 120/205) ist der Port für WAP-Push-Nachrichten aus Sicherheitsgründen „reserviert“. Die Möglichkeit, Inhalte über den weit verbreiteten SMS-Kanal zu senden, kann für Inhaltsanbieter sehr nützlich sein.

SMS-Nachrichten sind eine kleine Anzahl gepackter Bytes, die über die Betreibernetze gesendet werden. Viele von Ihnen haben bereits das Senden von „Textnachrichten“ von Geräten erlebt und viele bezeichnen das Senden von SMS-Nachrichten als „SMS“.

Eine kleine technische Einführung in SMS

Der Umfang dieses Artikels soll praktisch sein, daher werden wir nicht alle technischen und langweiligen Details von Netzwerken durchgehen, aber drei Konzepte sind ziemlich wichtig verstehe über SMS.

  • SMS verwendet das Konzept des „Ports“ genau wie ein Standard-Internet-Socket;
  • SMS-Nachrichten haben ein Limit von 160 Zeichen im Textkörper;
  • Der Textkörper ist nicht das einzige, mit dem Sie in einer SMS spielen können, es gibt auch den Benutzerdaten-Header.

Ports

Wenn Sie in Ihrem Browser auf eine URL wie http://dev.mobi klicken, rufen Sie gemäß Konvention transparent Port 80 eines Webservers auf. Die Verbindung wird auf Port 80 initialisiert und dann auf einen höheren Port umgeschaltet, damit andere Benutzer auf denselben Port des Webservers zugreifen können. Port 80, wie von IANA angegeben, bezieht sich auf das HTTP-Protokoll, Dies bedeutet, dass ein Server, Das ist in der Lage, HTTP-Protokollanforderung zu verstehen, wird geweckt und bereit sein, HTTP-Anfragen zu beantworten und zu verarbeiten. Das gleiche passiert mit SMS-Nachrichten. Sie können eine SMS an einen bestimmten Port eines Telefons senden und einen bestimmten Dienst auf diesem Gerät aktivieren. So wie nicht alle Computer über Standarddienste (z. B. einen Webserver) verfügen, verfügen auch nicht alle Mobilgeräte über Dienste, die Ports abhören. Dies ist ein sehr „herstellerbezogenes“ Material, daher müssen Sie Ihr Telefon überprüfen, was zum Akzeptieren aktiviert ist.

Body und Encoding

Dies könnte ein schwieriges Thema sein, aber wir werden nur sehr grundlegende Informationen beschreiben, die nützlich sein können. Die SMS-Standardcodierung verwendet 7 Bit, um ein Zeichen zu verarbeiten. Dies bedeutet, dass Sie in einer SMS nur die Zeichen schreiben können, die in einer sehr einfachen Zeichentabelle vorhanden sind, ja diese berühmten 127 Zeichen. Wenn Sie kompliziertere Dinge tun und mehr „interessante“ Zeichen senden möchten, wird eine Gruppe von 8 Bit benötigt und die Tabelle der verfügbaren Zeichen wird größer. Der verfügbare Speicherplatz beträgt 1120 Bit pro SMS, nicht mehr und nicht weniger. Sie können 160 Zeichen mit 7 Bit oder 140 Zeichen mit 8 Bit haben

Hinweis: Das Zeichen „É“ ist in der „Basistabelle“ enthalten, während das Zeichen „È“ in den „größeren Tabellen“ enthalten ist. Wenn Sie eine Nachricht mit dem zweiten Zeichen schreiben, steht weniger Speicherplatz in der Nachricht zur Verfügung. Achten Sie also darauf, welche Zeichen Sie beim Senden von SMS verwenden 😉

Benutzerdatenkopf

Der Benutzerdatenkopf (auch als UDH bekannt) ist das, was ein „High-Level-Entwickler“ festlegen kann, während er mehr als eine einfache „Textnachricht“ ausführt. Eine UDH ist sehr nützlich, da Sie „unsichtbare Textnachrichten“ an mobile Anwendungen senden können (wobei „mobile Anwendungen“ beispielsweise auf mobilen Geräten ausgeführt werden) oder einem Gerät mitteilen können, dass die Nachricht spezielle Informationen enthält. Es ist einer XML-Datei sehr ähnlich: sie müssen dem Parser mitteilen, was Sie senden, und den Inhalt nach dem Prolog, der vom Parser selbst verarbeitet wird.

Die UDH wird hauptsächlich verwendet, um anzugeben, an welche Ports unser Client (Telefon) die SMS sendet. Es besteht aus einer Reihe von Hex-Nummern, die beschreiben:

< wie lang die UDH ist> <das Format, das zur Angabe der Portnummern verwendet wird> <die Länge der Portnummer> <Zielportnummer> <Quellportnummer>.

Angenommen, ich möchte als praktisches Beispiel eine UDH erstellen, um einen WAP-Push zu senden, wobei der Standardzielport für WAP-Pushs 2948 ist:

1
06 05 04 0B 84 23 F0

wo:

  • 06 bedeutet „hey die lesen die folgenden 6 bytes“
  • 05 ist die format für zahlen, in diesem fall hexadezimale zahlen
  • 04 wird sagen die UDH, dass jeder port ist vertreten mit 4 charakter
  • 0B84 ist die ziel port, 2948 (dezimal darstellung) oder 0B84 (hexadezimal darstellung)
  • 23F0 ist die quellport, 9200 (Dezimaldarstellung) oder 2300 (Hexadezimaldarstellung).

Hinweis: Verwenden eine einfache rechner zu konvertieren dezimalzahlen zu hex; wählen sie „Dezember“, setzen 2948 in die rechner, dann drücken sie die taste „Hex“. Jeder wissenschaftliche Taschenrechner kann dies tun und viele Betriebssysteme haben irgendwo eine kleine „Calc“ -Anwendung, die dies tun kann.

Binäre SMS

Eine „binäre SMS“ ist eine XML-formatierte Text-SMS, die mit WBXML transformiert wurde. WBXML ist ein „Tag Transformer“, d.h. jedem XML-Tag ist ein Binärbyte zugeordnet. Zum Beispiel wird das Tag <SI> als Binärzeichen konvertiert &#x0005;

Warum WBXML?

Einfache Antwort: Das Ergebnis einer WBXML-Transformation ist in der Anzahl der generierten Bytes kleiner als die ausführliche XML-Textdatei selbst.

Hinweis: Viele Tags werden in Bytes konvertiert, aber manchmal auch Inhalte (wie URL-Adressen), z. B. die URL http://www.dev.mobi kann in WBXML als geschrieben werden 0Ddev.mobi , wobei „0D“ für http://www steht.

„0C“ ist allgemeiner und steht für http://, sodass Sie die URL auf zwei Arten schreiben können:

1
< spanne>0Ddev.mobi </spanne>

oder

1
< spanne>0Cwww.dev.mobi</Spanne>

Die erste verwendet 9 Zeichen (0D ist ein Byte), die zweite 13 Zeichen! Ich liebe WBXML 🙂

Um es klar zu sagen, mit „WAP Push“ meinen wir keine Möglichkeit, SMS mit WAP zu senden. Was wir meinen, ist das, was technisch als SI (Service Indication) bekannt ist. Eine Serviceanzeige ist eine binäre SMS, die an einen dedizierten Port eines Geräts gesendet wird und das Gerät darüber informiert, dass eine URL darauf wartet, besucht zu werden. Die URL kann die Adresse eines Klingeltons in einem Webserver sein, die Adresse einer JAD-Datei, um eine J2ME-Anwendung oder ein JPG oder einfach eine WAP-Seite zu installieren; Es liegt am „Webmaster“ des Webservers, den Inhalt auf die Website zu stellen, und es liegt am Gerät, zu verstehen, wie mit dem Inhalt umgegangen wird. Weitere Informationen zu diesem Aspekt des Puzzles finden Sie in unserer Artikelserie zur Inhaltsanpassung.

Hinweis: Wenn ich „Webserver“ sage, meine ich sowohl Web- als auch WAP-Server, da die meisten Webserver für die Bereitstellung von WAP-Inhalten konfiguriert werden können. Mit „OTA-Konfigurations-SMS“ meine ich eine binäre SMS, die APN-Details enthält (aber mehr enthalten kann), auch bekannt als „Internetzugangskonfiguration“.

Hinweis: Es gibt spezielle „Service Indication“-Meldungen, die normalerweise als SL (Service Load) bezeichnet werden und „SI“ ähneln. Ein SI fragt den Benutzer um Erlaubnis, bevor er den Inhalt über die Netzwerkverbindung abruft, und lädt Inhalte automatisch herunter, ohne den Benutzer um Erlaubnis zu fragen. „SL“ sind MMS-Nachrichten sehr ähnlich: Der Inhalt befindet sich auf einem Webserver und die SMS weist das Telefon an, die Nachricht herunterzuladen.

Also fangen wir an

Zunächst müssen wir einige Papiere lesen (leider), um einige Spezifikationen zum Schreiben von XML-Inhalten zu lesen, die über SMS gesendet werden sollen. Ein guter Ausgangspunkt könnte die „Smart Messaging Specification 3.0.0“ von Nokia sein, die heruntergeladen werden kann von www.forum.nokia.com und weitere technische Dokumente der Open Mobile Alliance (OMA) von www.openmobilealliance.org/tech/affiliates/wap/wapindex.html

So werden unsere Schritte sein:

  • Entscheiden Sie, was wir senden möchten
  • Finden Sie die Dokumente zu diesem Thema
  • Finden Sie die XML-Struktur der zu sendenden Nachricht
  • Passen Sie das XML an
  • Konvertieren Sie das XML in WBXML
  • Bereiten Sie die UDH vor
  • Senden Sie die UDH und den BODY

Da wir eine J2ME-Anwendung an ein neues Telefon senden möchten, müssen wir eine „Service Indication“ -Nachricht senden, die auch als „WAP Push“ bezeichnet wird. Dieses „SI“ kann verwendet werden, um eine SMS zu senden, die als Link zum Herunterladen von etwas gelesen wird. Jeder Inhaltstyp (Bild / JPEG, Anwendung / Java-Archiv, …) ist gültig, wenn das Telefon es öffnen kann.

Wer kann also sagen, welche Inhaltstypen ein Gerät öffnen kann? DeviceAtlas kann uns hier helfen! (siehe Referenzen)

Finden Sie die Dokumente zu diesem Thema

Ok, öffnen wir den OMA-Link und gehen wir zum „Funktionsbereich“ mit der Bezeichnung „push“. Lassen Sie uns die „WAP Service Indication Specification “ erhalten. Um zu verstehen, wie WBXML funktioniert, würde ich vorschlagen, Absatz 8.3.2 „Attribute Start Tokens“ zu lesen.

Finden Sie die XML-Struktur der Nachricht

Für diejenigen unter Ihnen, die DTDs eher mögen, lesen Sie Abschnitt 7.2. Alle anderen können das gesamte Dokument überspringen und zum Lesebeispiel in Abschnitt 9 wechseln. Das XML dort ist ziemlich selbsterklärend, daher werde ich einige Anpassungen direkt vornehmen.

1
2
3
4
5
6
7

<?xml version=“1.0″?>
<!DOCTYPE si PUBLIC „-//WAPFORUM//DTD SI 1.0//DE“ „http://www.wapforum.org/DTD/si.dtd“>
<si>
<indication href=http://www.dev.mobi/is_fun.html si-id=“6532″>
DevDotMobi is Fun !
</indication>
</si>

Convert to WBXML

Hex code Meaning
02 WBXML Version 1.2
05 SI 1.0 Public Identifier
6A Charset UTF-8
00 String table length = 0
45 <SI>
C6 <indication>
0C href=“http://
03 String starts
* 7777772E6465762E6D6F62692F69735F66756E2E68746D6C www.dev.mobi/is_fun.HTML-code
00 String enden
11 si-id-Attribut
03 String beginnt
** 36353332 6532
00 String enden
07 Aktionsattribut (Signal – Medium)
01 Enden von Attributen, jetzt der Inhalt
03 String beginnt
* 446576446F744D6F62692069732046756E2021 DevDotMobi macht Spaß !
00 String enden
01 </ indikation>
01 </ SI>

* Jedes Zeichen in der Zeichenfolge wird in seine hexadezimale Darstellung konvertiert.
** „6532“ ist als Zeichenfolge und nicht als Zahl zu betrachten, verwenden Sie also nicht den Taschenrechner, um diese Zahl umzurechnen

Unser Körper ist, alle Zahlen zusammenzufügen:

1
02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101

( welches ist 130 Zeichen)

Bereiten Sie die UDH vor

Die Vorbereitung der UDH ist ziemlich einfach. Beginnen Sie einfach mit „06 05 04“ und fügen Sie dann die Portnummern hinzu. WAP-Push-Nachrichten verwenden den „Zielport“ 2948, während der Quellport 9200 ist. Konvertieren Sie dezimale Portnummern in hexadezimale Formate, sodass 2948 zu 0B84 und 9200 zu 23F0 wird. Magisch ist die UDH: 06 05 04 0B 84 23 F0

Senden Sie die SMS und die UDH

Nun, was müssen Sie damit machen? Ziemlich einfach, einfach alles zusammenstellen und die SMS kann gesendet werden.

< UDH> + <KÖRPER>

1
UDH: 06 05 04 0B 84 23 F0<br />KÖRPER: 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101

The complete message is then:

1
< spanne><stark>0605040B8423F0</stark><br /> 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101</Spanne>

Welches ist 137 Zeichen lang (hey, es ist eine binäre SMS, Java verwendet UTF-8-Codierung für binäre Nachrichten, also ist das Limit für 1 SMS 140 Zeichen, sind wir nicht cool?)

Die J2ME-Anwendung

Um so praktisch wie möglich zu sein, benötigen wir eine Umgebung, um SMS-Nachrichten zu senden und die reale Welt zu beschreiben, aber da nicht jeder Zugang zu einem SMS-Gateway mit UDHs und einer Schnittstelle zur Eingabe von Binärcode hat, werden wir beschreiben, wie man dasselbe mit einer J2ME-Anwendung macht.

Haftungsausschluss: In Bezug auf die technischen Daten können J2ME-Anwendungen nicht auf spezielle reservierte Ports zugreifen, um binäre SMS zu senden, sodass die J2ME-Anwendung im Telefon unglücklicherweise eine Sicherheitsausnahme erhält und die Nachricht nicht zugestellt wird.

MIDP2.0 verfügt über zwei Methoden, die das Senden von Nachrichten ermöglichen: Eine erfordert eine Zeichenfolge, eine erfordert ein Array von Bytes. Ja, der erste wird verwendet, um Textinhalte festzulegen, der zweite, um binäre Inhalte festzulegen.

Text Methode: setPayloadText(String textualSMS);
Binary Methode: setPayloadData(Byte binarySMS);

Um die J2ME-Anwendung „Over The Air“ installieren zu können, kompilieren Sie sie mit Ihrer bevorzugten J2ME-Umgebung (ich mag NetBeans mit dem Mobility Pack), kopieren Sie die .JAD und .JAR-Dateien auf Ihren Webserver und passen Sie die URL in der Wap-Push-Nachricht an.

Schreiben wir nun eine einfache J2ME-Klasse, die die Nachricht sendet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.wireless.messaging.*;
import java.io.*;
import javax.microedition.io.*;
public class WapPush extends MIDlet {
// Verbindung zum Senden einer Nachricht
private MessageConnection conn;
public void startApp() {
// Geben Sie hier Ihre Handynummer ein
String myMobileNumber=“+39335…“;
try {
// Erstellen Sie eine binäre Nachricht
// Zielport wird mit der Dezimalnotation ausgedrückt
dies.conn=(MessageConnection) Anschluss.öffnen („sms://“ +myMobileNumber+“:2948″);
// Geben Sie an, dass wir eine binäre Nachricht senden
BinaryMessage bm=(BinaryMessage)conn.newMessage(MessageConnection.BINARY_MESSAGE);
String ourContent=“0605040B8423F0″ +
„02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0“ +
„011033635333200070103446576446F744D6F62692069732046756E2021000101“;
bm.setPayloadData(convertHexToBinary(ourContent));
this.conn.send(bm);
}
// Let’s throw exceptions
catch (IOException ex) {
ex.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace();
}
/** Diese Methode stammt von affinitystudios
* weiterlesen http://discussion.forum.nokia.com/forum/member.php?u=56142
* Es konvertiert Zeichenfolgen in ein Datenarray von Zeichen
*/
privates statisches Byte convertHexToBinary(String hexData) löst eine Ausnahme aus {
System.aus.println(„Länge: „+(Hex).länge()/2));
wenn ( hexData.länge() % 2 != 0 ) {
throw new Exception(„Muss eine gerade Anzahl von hexadezimalen Ziffern sein“ );
}
byte binaryData = neues Byte;
für (int i = 0; i < binaryData.länge; ++i) {
String byteStr = hexData.substring(i*2, i*2+2);
int value;
try {
value = Integer.parseInt(byteStr,16);
}
catch (NumberFormatException e) {
e.printStackTrace();
throw new Exception(„“);
}
binaryData = (byte)value;
}
return binaryData;
}
öffentliche leere pauseApp() {}
öffentliche leere destroyApp(boolean)) {}
}

Verwenden eines Online-SMS-Gateways

Da J2ME viele Binärnachrichten blockiert, können Sie ein Online-Gateway zum Senden Ihrer Binärnachrichten verwenden. Viele Unternehmen bieten SMS-Gateway-Dienste an, und die meisten von ihnen verfügen über eine Schnittstelle zum Senden von rohen binären SMS-Nachrichten (dies ist für mich ein „Plus“), während einige andere Unternehmen Ihnen nur eine Schnittstelle zum Festlegen der benutzerdefinierten Felder und zum Erstellen der Binärdateien bieten Sachen für Sie.

Wenn Sie ein Online-SMS-Gateway verwenden möchten, denken Sie daran, deren technische Spezifikationen zu lesen. Wenn Sie sich ein SMS-Gateway installieren möchten, das eine Verbindung zu externen Diensten (Carriern / Betreibern) herstellt, schlage ich Kannel vor, eine kostenlose SMS-Gateway-Software, die auf der ganzen Welt verbreitet ist.

  1. Reservierte Ports und mehr: J2ME „Wireless Messaging API“ Spezifikationen
    http://java.sun.com/products/wma/index.jsp
  2. standardformat für OTA-Inhalte: Open Mobile Alliance
    http://www.openmobilealliance.org/tech/affiliates/wap/wapindex.html
  3. So senden Sie OTA-Konfigurationen, Klingeltöne und Bedienerlogos: NOKIA
    http://www.forum.nokia.com (suche nach der „Smart Messaging Specification“)
  4. So erkennen Sie ein Mobiltelefon: WURFL
    http://deviceatlas.com
  5. Sms gateway software: Kannel
    www.kannel.org

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.