Cet article expliquera d’un niveau élevé à un niveau inférieur comment écrire une simple application mobile compatible SMS qui vous permettra d’envoyer des « Messages d’installation en direct ». Après avoir lu cet article, vous pourrez créer une petite applet J2ME qui s’enverra théoriquement sur un autre téléphone en utilisant un message SMS comme moyen de livraison. En fait, en raison des limitations de l’API de messagerie sans fil dans J2ME (JSR 120/205), le port des messages Push WAP est « réservé » pour des raisons de sécurité. La possibilité d’envoyer du contenu via le canal SMS largement pris en charge peut être très utile pour les fournisseurs de contenu.
Les messages SMS sont un petit nombre d’octets emballés envoyés sur les réseaux de l’opérateur. Beaucoup d’entre vous ont déjà expérimenté l’envoi de « messages texte » à partir d’appareils et beaucoup se réfèrent à l’envoi de messages SMS comme « textos ».
Une petite introduction technique aux SMS
La portée de cet article doit être pratique, nous ne passerons donc pas en revue tous les détails techniques et ennuyeux des réseaux, mais trois concepts sont assez importants pour comprendre les SMS.
- SMS utilise le concept de « port » tout comme le font les sockets Internet standard;
- Les messages SMS ont une limite dans le corps de 160 caractères;
- Le corps n’est pas la seule chose avec laquelle vous pouvez jouer dans un SMS, il y a aussi l’en-tête de données utilisateur.
Ports
Lorsque vous accédez à une URL dans votre navigateur telle que http://dev.mobi, vous appelez de manière transparente le port 80 d’un serveur Web, par convention. La connexion sera initialisée sur le port 80, puis commutée sur un port supérieur pour permettre aux autres utilisateurs d’accéder au même port du serveur Web. Le port 80, comme indiqué par l’IANA se réfère au protocole HTTP, cela signifie qu’un serveur, capable de comprendre la requête du protocole HTTP, sera réveillé et sera prêt à répondre et à traiter les requêtes HTTP. La même chose se produit avec les messages SMS. Vous pouvez envoyer un SMS à un port spécifique d’un téléphone et vous réveillerez un service spécifique sur cet appareil. Maintenant, tout comme tous les ordinateurs n’ont pas de services standard (comme un serveur Web), tous les appareils mobiles n’ont pas non plus de services à l’écoute des ports. C’est un truc très « lié au fabricant », vous devrez donc vérifier sur votre téléphone ce qui est autorisé à accepter.
Corps et encodage
Cela pourrait être un sujet difficile à traiter, mais nous allons simplement décrire des informations très basiques qui peuvent être utiles. L’encodage par défaut SMS utilise 7 bits pour gérer un caractère. Cela signifie que vous ne pouvez écrire dans un SMS que les caractères présents sur une table de caractères très basique, oui ces fameux 127 caractères. Si vous voulez aller plus loin et envoyer des caractères plus « intéressants », un groupe de 8 bits est nécessaire et la table des caractères disponibles s’agrandit. L’espace disponible est de 1120 bits par SMS, ni plus, ni moins. Vous pouvez avoir 160 caractères en utilisant 7 bits ou 140 caractères en utilisant 8 bits
Remarque: Le caractère « É » est inclus dans la « table de base », tandis que le caractère « È » est dans les « tables plus grandes ». Si vous écrivez un message avec le deuxième caractère, vous aurez moins d’espace disponible dans le message. Faites donc attention aux caractères que vous utilisez lors de l’envoi de SMS
En-tête de données utilisateur
L’en-tête de données utilisateur (également appelé UDH) est ce qu’un « développeur de haut niveau » peut définir pour faire quelque chose de plus qu’un simple « message texte ». Une UDH est très utile car vous pouvez envoyer des « messages texte invisibles » à une application mobile (où « applications mobiles », je veux dire celles fonctionnant sur des appareils mobiles par exemple) ou vous pouvez dire à un appareil que le message contiendra des informations spéciales. C’est très similaire à un fichier XML: vous devez indiquer à l’analyseur ce que vous envoyez et le contenu suivant le prologue qui sera géré par l’analyseur lui-même.
L’UDH est principalement utilisé pour spécifier les ports vers lesquels notre client (téléphone) enverra le SMS. Il est fait par un ensemble de nombres hexadécimaux qui décrivent:
< combien de temps l’UDH est > < le format utilisé pour spécifier les numéros de ports > < la longueur du numéro de port > < numéro de port de destination > < numéro de port source >.
À titre d’exemple pratique, disons que je veux créer une UDH pour envoyer un Push WAP, où le port de destination standard pour les push WAP est 2948, l’UDH sera:
1
|
06 05 04 0B 84 23 F0
|
où:
- 06 signifie « hé la lecture des 6 octets suivants »
- 05 est le format des nombres, dans ce cas les nombres hexadécimaux
- 04 indiqueront à l’UDH que chaque port est représenté en utilisant 4 caractères
- 0B84 est le port de destination, 2948 (représentation décimale) ou 0B84 (représentation hexadécimale)
- 23F0 est le port de destination port source, 9200 (représentation décimale) ou 23F0 (représentation hexadécimale).
Remarque: Utilisez une calculatrice simple pour convertir les nombres décimaux en hexadécimal; sélectionnez « Dec », mettez 2948 dans la calculatrice, puis appuyez sur le bouton « Hex ». N’importe quelle calculatrice scientifique peut le faire et de nombreux systèmes d’exploitation ont une petite application « calc » quelque part qui peut le faire.
SMS binaires
Un « SMS binaire » est un SMS textuel au format XML qui a été transformé avec WBXML. WBXML est un « transformateur de balise », cela signifie que pour chaque balise XML, un octet binaire est associé. Par exemple, la balise < SI > est convertie en tant que caractère binaire & #x0005;
Pourquoi WBXML?
Réponse facile: le résultat d’une transformation WBXML est plus petit en nombre d’octets générés que le fichier XML textuel verbeux lui-même.
Remarque: de nombreuses balises sont converties en octets, mais parfois aussi des contenus (tels que des adresses URL) par exemple, l’URL http://www.dev.mobi peut être écrite en WBXML comme 0Ddev.mobi , où « 0D » signifie http://www.
« 0C » est plus générique et signifie http:// afin que vous puissiez écrire l’URL de deux manières:
1
|
< portée >0Ddev.mobi < / envergure>
|
ou
1
|
< portée > 0Cwww.dev.mobi < / span>
|
Le premier utilise 9 caractères (0D est un octet), le second 13 caractères ! J’adore WBXML 🙂
Termes
Pour être clair, par « WAP push » nous ne voulons pas dire un moyen d’envoyer des SMS en utilisant WAP. Ce que nous entendons par ce que l’on appelle techniquement SI (Indication de service). Une indication de service est un SMS binaire envoyé à un port dédié sur un périphérique qui informe le périphérique qu’une URL attend d’être visitée. L’URL peut être l’adresse d’une sonnerie dans un serveur web, l’adresse d’un fichier JAD pour installer une application J2ME ou une page JPG ou simplement une page WAP; c’est au « webmaster » du serveur web de mettre le contenu sur le site web, et c’est à l’appareil de comprendre comment gérer le contenu. Pour plus d’informations sur cet aspect du puzzle, veuillez vous référer à notre série d’articles sur l’adaptation du contenu.
Remarque: Lorsque je dis « serveur Web », je veux dire à la fois serveur Web et serveur WAP, car la plupart des serveurs Web peuvent être configurés pour fournir du contenu WAP. Par « SMS de configuration OTA », j’entends un SMS binaire qui contient des détails APN (mais peut en contenir plus) également connu sous le nom de « Configuration d’accès Internet ».
Remarque: Il existe des messages spéciaux « Indication de service » qui sont normalement appelés SL (Charge de service) et qui sont similaires à « SI ». Un SI demande l’autorisation à l’utilisateur avant de récupérer le contenu via la connexion réseau, SL télécharge automatiquement le contenu sans demander l’autorisation à l’utilisateur. Les « SL » sont très similaires aux messages MMS: le contenu est sur un serveur Web et le SMS indique au téléphone de télécharger le message.
Commençons donc
Tout d’abord, nous devons lire quelques articles (hélas) pour lire quelques spécifications sur la façon d’écrire du contenu XML à envoyer par SMS. Un bon point de départ pourrait être la « Spécification de messagerie intelligente 3.0.0 » de Nokia qui peut être téléchargée à partir de www.forum.nokia.com et aussi des documents plus techniques de l’Open Mobile Alliance (OMA) de www.openmobilealliance.org/tech/affiliates/wap/wapindex.html
Donc nos étapes seront:
- Décidez de ce que nous voulons envoyer
- Trouvez les documents sur ce sujet
- Trouvez la structure XML du message à envoyer
- Personnalisez le XML
- Convertissez le XML en WBXML
- Préparez l’UDH
- Envoyer l’UDH et le CORPS
Comme nous voulons envoyer une application J2ME à un nouveau téléphone, nous devons envoyer un message « Indication de service », également connu sous le nom de « Push WAP ». Ce « SI » peut être utilisé pour pousser un SMS qui sera lu comme un lien pour télécharger quelque chose. Tout type de contenu (image/jpeg, application/java-archive, …) est valide si le téléphone peut l’ouvrir.
Alors, qui peut dire quels types de contenu un périphérique peut-il ouvrir? DeviceAtlas peut nous aider ici! (voir Références)
Trouvez les documents sur ce sujet
Ok, ouvrons le lien OMA et passons à la « Zone fonctionnelle » notée « push ». Obtenons la « Spécification d’indication de service WAP ». Afin de comprendre comment fonctionne WBXML, je suggère de lire le paragraphe 8.3.2 « Jetons de démarrage d’attribut ».
Trouvez la structure XML du message
Pour ceux d’entre vous qui ressemblent davantage à des DTD, consultez la section 7.2. Tous les autres peuvent ignorer tout le document et aller à l’exemple de lecture à la section 9. Le XML y est assez explicite, donc je vais faire une personnalisation directement.
1
2
3
4
5
6
7
|
<?version xml = « 1.0 » ?>
<!DOCTYPE si PUBLIC »-//WAPFORUM//DTD SI 1.0//FR » »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 |
00 | Extrémités des cordes |
11 | attribut si-id |
03 | La chaîne commence |
** 36353332 | 6532 |
00 | Extrémités des cordes |
07 | Attribut d’action (signal-moyen) |
01 | Fin des attributs, maintenant le contenu |
03 | La chaîne commence |
* 446576446F744D6F62692069732046756E2021 | DevDotMobi est amusant! |
00 | Extrémités des cordes |
01 | </ indication> |
01 | </ SI> |
* Ce sont des chaînes utilisées pour transmettre le contenu au SI, chaque caractère de la chaîne est converti en sa représentation hexadécimale.
** « 6532 » doit être considéré comme une chaîne de caractères et non un nombre, alors n’utilisez pas la calculatrice pour convertir ce nombre
Notre corps est, en rassemblant tous les nombres:
1
|
02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0 <br/> 011033635333200070103446576446F744D6F62692069732046756E2021000101
|
( qui est de 130 caractères)
Préparer l’UDH
Préparer l’UDH est assez facile. Commencez simplement par « 06 05 04 », puis ajoutez les numéros de port. Les messages push WAP utilisent le « port de destination » 2948 tandis que le port source est 9200. Convertissez les numéros de ports décimaux en formats hexadécimaux, donc 2948 devient 0B84 et 9200 devient 23F0. Comme par magie, l’UDH est: 06 05 04 0B 84 23 F0
Envoyez le SMS et l’UDH
Maintenant, que devez-vous faire avec cela? Assez simple, il suffit de tout assembler et le SMS est prêt à être envoyé.
< UDH > + < CORPS>
1
|
UDH: 06 05 04 0B 84 23 F0 < br /> CORPS: 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101
|
The complete message is then:
1
|
< portée > < forte > 0605040B8423F0 < / forte > < br /> 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0 <br/> 011033635333200070103446576446F744D6F62692069732046756E2021000101 </span>
|
Ce qui fait 137 caractères (hé, c’est un SMS binaire, Java utilise l’encodage UTF-8 pour les messages binaires, donc la limite pour 1 SMS est de 140 caractères, n’est-ce pas cool?)
L’application J2ME
Pour être aussi pratique que possible, nous aurons besoin d’un environnement à utiliser pour envoyer des messages SMS et décrire le monde réel mais comme tout le monde n’a pas accès à une passerelle SMS avec UDHs et une interface où entrer du code binaire, nous décrirons comment faire de même avec une application J2ME.
Avertissement: En ce qui concerne les spécifications WMA, les applications J2ME ne peuvent pas accéder aux ports réservés spéciaux pour envoyer des SMS binaires, donc malheureusement, l’application J2ME dans le téléphone obtiendra une exception de sécurité et le message ne sera pas livré.
MIDP2.0 a deux méthodes qui permettent d’envoyer des messages : l’une nécessite une chaîne, l’autre un tableau d’octets. Oui, le premier est utilisé pour définir le contenu du texte, le second pour définir le contenu binaire.
Méthode de texte: setPayloadText (String textualSMS);
Méthode binaire: setPayloadData (byte binarySMS);
Afin de pouvoir installer l’application J2ME « Over The Air », compilez-la avec votre environnement J2ME préféré (j’aime NetBeans avec le Pack de mobilité), copiez le.JAD et.Fichiers JAR sur votre serveur Web et personnalisez l’URL dans le message Push Wap.
Écrivons maintenant une classe J2ME simple qui envoie le message:
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.*;
la classe publique WapPush étend MIDlet {
// Connexion pour envoyer un message
connexion de messagerie privée;
startApp vide public() {
// Mettez ici votre numéro de mobile
String myMobileNumber= »+39335… »;
try {
// Créer un message binaire
// Le port de destination est exprimé en utilisant la notation décimale
ceci.conn = Connecteur (Connexion de message).ouvrir (« sms:// » + Numéro de téléphone mobile+ »:2948″);
// Spécifiez que nous allons envoyer un message binaire
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();
}
/** Cette méthode provient de affinitystudios
* lire la suite http://discussion.forum.nokia.com/forum/member.php?u=56142
* Il convertit les chaînes en tableau de données de caractères
*/
convertHexToBinary d’octet statique privé (Chaîne hexData) lève le système d’exception {
.hors.println(« Longueur: » +(données hexadécimales.longueur()/2));
si (données hexadécimales.longueur ()%2!= 0 ) {
throw new Exception (« Doit être un nombre pair de chiffres hexadécimaux » );
}
les données binaires de l’octet = nouvel octet;
pour (int i = 0; i < données binaires.length; ++i) {
byteStr de chaîne = hexdonnées.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;
}
pause de vide publicapp() {}
public void destroyApp (booléen inconditionnel) {}
}
|
En utilisant une passerelle SMS en ligne
Comme J2ME bloque de nombreux messages binaires, vous pouvez essayer une passerelle en ligne pour envoyer vos messages binaires. De nombreuses entreprises fournissent des services de passerelle SMS, et la plupart d’entre elles ont une interface pour envoyer des messages SMS binaires bruts (ce sont un « plus » pour moi) tandis que d’autres entreprises vous donnent simplement une interface pour définir les champs personnalisés et créer les éléments binaires pour vous.
Si vous souhaitez utiliser une passerelle SMS en ligne, n’oubliez pas de lire leurs spécifications techniques. Si vous souhaitez vous installer une passerelle SMS qui se connecte à des services externes (opérateurs / opérateurs), je suggère Kannel, qui est un logiciel gratuit de passerelle SMS et qui est répandu partout dans le monde; Kannel aime avoir l’UDH et le corps à séparer.
- Ports réservés et plus: Spécifications de l’API de messagerie sans fil J2ME
http://java.sun.com/products/wma/index.jsp - format standard pour le contenu OTA: Open Mobile Alliance
http://www.openmobilealliance.org/tech/affiliates/wap/wapindex .html - Comment envoyer des configurations OTA, des sonneries et des logos d’opérateur: NOKIA
http://www.forum.nokia.com (recherche pour la « Spécification de messagerie intelligente ») - Comment détecter un téléphone mobile: WURFL
http://deviceatlas.com - Logiciel de passerelle SMS: Kannel
www.kannel.org