Questo articolo spiegherà da un livello elevato a un livello inferiore come scrivere una semplice applicazione mobile SMS-enabled che vi permetterà di inviare “Over The Air messaggi di installazione”. Dopo aver letto questo articolo, si sarà in grado di creare una piccola applet J2ME che teoricamente si invia ad un altro telefono utilizzando un messaggio SMS come mezzo di consegna. Infatti, a causa di limitazioni nell’API di messaggistica wireless in J2ME (JSR 120/205) la porta per i messaggi Push WAP è “riservata” per motivi di sicurezza. La possibilità di inviare contenuti tramite il canale SMS ampiamente supportato può essere molto utile per i fornitori di contenuti.
I messaggi SMS sono un piccolo numero di byte imballati inviati sulle reti dell’operatore. Molti di voi hanno già sperimentato l’invio di “messaggi di testo” da dispositivi e molti si riferiscono all’invio di messaggi SMS come “sms”.
Un po ‘ di introduzione tecnica per SMS
Lo scopo di questo articolo è quello di essere pratico, quindi non andremo attraverso tutti i dettagli tecnici e noiosi di reti, ma tre concetti sono piuttosto importanti non capire su sms.
- SMS utilizza il concetto di “porta” proprio come fanno le prese Internet standard;
- I messaggi SMS hanno un limite nel corpo di 160 caratteri;
- Il corpo non è l’unica cosa con cui puoi giocare in un SMS, c’è anche l’intestazione dei dati utente.
Porte
Quando si preme un URL nel browser come http://dev.mobi, si chiama in modo trasparente la porta 80 di un server Web, per convenzione. La connessione verrà inizializzata sulla porta 80 e quindi passata a una porta superiore per consentire ad altri utenti di accedere alla stessa porta del server Web. La porta 80, come affermato da IANA si riferisce al protocollo HTTP, ciò significa che un server, che è in grado di comprendere la richiesta del protocollo HTTP, verrà risvegliato e sarà pronto a rispondere ed elaborare le richieste HTTP. Lo stesso accade con i messaggi SMS. È possibile inviare un SMS a una porta specifica di un telefono e si sveglierà un servizio specifico su quel dispositivo. Ora, proprio come non tutti i computer hanno servizi standard (come un server web), anche non tutti i dispositivi mobili hanno servizi in ascolto di porte. Questa è una roba molto “produttore correlati”, quindi sarà necessario controllare il telefono ciò che è abilitato ad accettare.
Corpo e codifica
Questo potrebbe essere un argomento difficile da trattare, ma descriveremo solo informazioni di base che possono essere utili. La codifica predefinita SMS utilizza 7 bit per gestire un carattere. Ciò significa che è possibile scrivere in un SMS solo quei caratteri che sono presenti su una tabella char molto semplice, sì quei famosi 127 caratteri. Se vuoi fare cose più complicate e inviare caratteri più “interessanti”, allora è necessario un gruppo di 8 bit e la tabella dei caratteri disponibili diventa più grande. Lo spazio disponibile è di 1120 bit per SMS, né più né meno. Puoi avere 160 caratteri usando 7 bit o 140 caratteri usando 8 bit
Nota: Il carattere “É” è incluso nella “tabella di base”, mentre il carattere “È” è nelle “tabelle più grandi”. Se scrivi un messaggio con il secondo carattere, avrai meno spazio disponibile nel messaggio. Quindi, fai attenzione a quali caratteri stai usando quando invii SMS
Intestazione dati utente
L’intestazione dati utente (nota anche come UDH) è ciò che uno “sviluppatore di alto livello” può impostare per fare qualcosa di più di un semplice “messaggio di testo”. Un UDH è molto utile perché puoi inviare ” messaggi di testo invisibili “all’applicazione mobile (dove per” applicazioni mobili ” intendo quelle in esecuzione su dispositivi mobili, ad esempio) o puoi dire a un dispositivo che il messaggio conterrà informazioni speciali. È molto simile a un file XML: devi dire al parser cosa stai inviando e il contenuto che segue il prolog che verrà gestito dal parser stesso.
L’UDH viene utilizzato principalmente per specificare a quali porte il nostro cliente (telefono) invierà l’SMS. È fatto da un insieme di numeri esadecimali che descrivono:
<per quanto tempo UDH è >< il formato utilizzato per specificare i numeri delle porte>< la lunghezza del numero di porta>< numero di porta di destinazione><numero di porta di origine>.
un esempio pratico, supponiamo di voler creare un UDH per inviare un WAP Push, in cui il livello di porta di destinazione per il WAP spinge è 2948, il UDH sarà:
1
|
06 05 04 0B 84 23 F0
|
dove:
- 06 significa “ehi leggere i seguenti 6 byte”
- 05 è il formato per i numeri, in questo caso i numeri esadecimali
- 04 raccontare la UDH che ogni porta viene rappresentato con 4 caratteri
- 0B84 è la porta di destinazione, 2948 (rappresentazione decimale) o 0B84 (esadecimali)
- 23F0 è la porta di origine, 9200 (rappresentazione decimale) o 23F0 (esadecimali).
Nota: Utilizzare una semplice calcolatrice per convertire i numeri decimali in hex; selezionare “Dec”, mettere 2948 nella calcolatrice, quindi premere il pulsante “Hex”. Qualsiasi calcolatrice scientifica può farlo e molti sistemi operativi hanno una piccola applicazione” calc ” da qualche parte che può farlo.
SMS binario
Un “SMS binario” è un SMS testuale in formato XML che è stato trasformato con WBXML. WBXML è un “trasformatore di tag”, questo significa che per ogni tag XML, viene associato un byte binario. Ad esempio, il tag < SI > viene convertito come carattere binario & # x0005;
Perché WBXML?
Risposta facile: il risultato di una trasformazione WBXML è minore nel numero di byte generati rispetto al file XML testuale dettagliato stesso.
Nota: molti tag vengono convertiti in byte, ma a volte anche contenuti (come indirizzi URL) ad esempio l’URL http://www.dev.mobi può essere scritto in WBXML come 0Ddev.mobi , dove ” 0D ” sta per http://www.
“0” è più generico e sta per http:// così è possibile scrivere l’URL in due modi:
1
|
<span>0Ddev.mobi </span>
|
o
1
|
<span>0Cwww.dev.mobi< / span>
|
Il primo usa 9 caratteri (0D è un byte), il secondo 13 caratteri! Amo WBXML Terms
Termini
Per essere chiari, con “WAP push” non intendiamo un modo per inviare SMS usando WAP. Ciò che intendiamo è ciò che è tecnicamente noto come SI (Service Indication). Un’indicazione di servizio è un SMS binario inviato a una porta dedicata su un dispositivo che informa il dispositivo che c’è un URL in attesa di essere visitato. L’URL può essere l’indirizzo di una suoneria in un webserver, l’indirizzo di un file JAD per installare un’applicazione J2ME o un JPG o semplicemente una pagina WAP; sta al “webmaster” del webserver mettere i contenuti sul sito web, e sta al dispositivo per capire come gestire il contenuto. Per ulteriori informazioni su questo aspetto del puzzle, si prega di fare riferimento al nostro Content Adapation serie di articoli.
Nota: Quando dico “server web” intendo sia server Web che WAP poiché la maggior parte dei server Web può essere configurata per fornire contenuti WAP. Con” SMS di configurazione O ” intendo un SMS binario che contiene dettagli APN (ma può contenere di più) noto anche come “Configurazione di accesso a Internet”.
Nota: Ci sono speciali messaggi “Service Indication” che sono normalmente chiamati SL (Service Load) che sono simili a “SI”. Un SI chiede il permesso all’utente prima di recuperare il contenuto tramite la connessione di rete, SL scaricare contenuti automaticamente senza chiedere il permesso all’utente. “SL” sono molto simili ai messaggi MMS: il contenuto è su un server Web e l’SMS dice al telefono di scaricare il messaggio.
Quindi iniziamo
Prima di tutto, dobbiamo leggere alcuni documenti (ahimè) per leggere alcune specifiche su come scrivere contenuti XML da inviare tramite SMS. Un buon punto di partenza potrebbe essere il Nokia “Smart Messaging Specification 3.0.0” che può essere scaricato da www.forum.nokia.com e anche documenti più tecnici dalla Open Mobile Alliance (OMA) da www.openmobilealliance.org/tech/affiliates/wap/wapindex.html
Così i nostri passi saranno:
- Decidere cosa vogliamo inviare
- Trovare la documentazione su tale argomento
- Trovare la struttura XML del messaggio da inviare
- Personalizza XML
- Convertire XML WBXML
- Preparare il UDH
- Invia il UDH e il CORPO
Come vogliamo inviare un un’applicazione J2ME per un nuovo telefono, quindi abbiamo bisogno di inviare un “Indicazione” del messaggio, noto anche come “push WAP”. Questo ” SI ” può essere usato per spingere un SMS che verrà letto come un link per scaricare qualcosa. Qualsiasi tipo di contenuto (image/jpeg, application/java-archive, …) è valido se il telefono può aprirlo.
Quindi, chi può dire quali tipi di contenuto può aprire un dispositivo ? DeviceAtlas ci può aiutare qui! (vedi Riferimenti)
Trova i documenti su quell’argomento
Ok, apriamo il link OMA e andiamo alla “Area funzionale” denotata “push”. Otteniamo la “Specifica di indicazione del servizio WAP”. Per capire come funziona WBXML, suggerirei di leggere il paragrafo 8.3.2 “Token di avvio degli attributi”.
Trova la struttura XML del messaggio
Per quelli di voi che sono più simili a DTD, guarda la sezione 7.2. Tutti gli altri possono saltare tutto il documento e andare all’esempio di lettura alla sezione 9. L’XML è piuttosto autoesplicativo, quindi farò direttamente un po ‘ di personalizzazione.
1
2
3
4
5
6
7
|
<?versione xml=”1.0″?>
<!DOCTYPE si PUBLIC “- / / WAPFORUM / / DTD SI 1.0 / / IT “” 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 | Stringa termina |
11 | si-attributo id |
03 | Stringa inizia |
** 36353332 | 6532 |
00 | Stringa termina |
07 | attributo di Azione (segnale – media) |
01 | Finisce di attributi, ora il contenuto |
03 | Stringa inizia |
* 446576446F744D6F62692069732046756E2021 | DevDotMobi è Divertente ! |
00 | Stringa termina |
01 | </indicazione> |
01 | </SI> |
* Queste sono le stringhe utilizzate per il passaggio di contenuti per il SI, ogni carattere di una stringa è convertito alla sua rappresentazione esadecimale.
* * “6532” deve essere considerato una stringa di caratteri e non un numero, quindi non usare la calcolatrice per convertire questo numero
Il nostro corpo è, mettendo tutti i numeri insieme:
1
|
02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br />011033635333200070103446576446F744D6F62692069732046756E2021000101
|
(che è di 130 caratteri)
Preparare il UDH
redazione UDH è abbastanza facile. Basta iniziare con “06 05 04” e quindi aggiungere i numeri di porta. I messaggi push WAP utilizzano “porta di destinazione” 2948 mentre la porta di origine è 9200. Converti i numeri di porta decimali in formati esadecimali, quindi 2948 diventa 0B84 e 9200 diventa 23F0. Magicamente, l’UDH è: 06 05 04 0B 84 23 F0
Invia l’SMS e l’UDH
Ora, cosa devi fare con questo? Abbastanza semplice, basta mettere tutto insieme e l’SMS è pronto per essere inviato.
<UDH> + <CORPO>
1
|
UDH: 06 05 04 0B 84 23 F0<br />CORPO: 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101
|
The complete message is then:
1
|
<span><forte>0605040B8423F0</strong><br /> 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101</span>
|
Che è di 137 caratteri di lunghezza (hey, è un binario SMS, Java utilizza la codifica UTF-8 per i messaggi binari, in modo che il limite di 1 SMS è di 140 caratteri, non siamo cool ?)
L’applicazione J2ME
Per essere il più pratico possibile, abbiamo bisogno di un ambiente per essere utilizzato per inviare messaggi SMS e di descrivere il mondo reale, ma non tutti hanno accesso a un gateway SMS con UDHs e un’interfaccia dove inserire il codice binario, saremo descrivere come fare lo stesso con un’applicazione J2ME.
Disclaimer :Per quanto riguarda le specifiche WMA, le applicazioni J2ME non possono accedere a porte riservate speciali per inviare SMS binari così purtroppo l’applicazione J2ME nel telefono otterrà un’eccezione di sicurezza e il messaggio non verrà consegnato.
MIDP2.0 ha due metodi che consentono di inviare messaggi: uno richiede una stringa, uno richiede una matrice di byte. Sì, il primo viene utilizzato per impostare il contenuto del testo, il secondo per impostare il contenuto binario.
Metodo di testo: setPayloadText (String textualSMS);
Metodo binario: setPayloadData (byte binarySMS);
Per poter installare l’applicazione J2ME “Over The Air”, compilarla con il tuo ambiente J2ME preferito (mi piacciono i NetBeans con il Mobility Pack), copiare il .JAD e .File JAR al server Web e personalizzare l’URL nel messaggio Push Wap.
Scriviamo ora una semplice classe J2ME che invia il messaggio:
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 estende MIDlet {
// Connection per inviare un messaggio
private MessageConnection conn;
public void startApp() {
// Metti qui il tuo numero di cellulare
String myMobileNumber=”+39335…”;
prova {
// Crea un messaggio binario
// La porta di destinazione viene espressa usando la notazione decimale
questo.conn = (MessageConnection) Connettore.aperto (“sms: / /” + myMobileNumber+”:2948″);
// Specificare che stiamo per inviare un messaggio binario
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();
}
/** Questo metodo viene da affinitystudios
* continua a leggere http://discussion.forum.nokia.com/forum/member.php?u=56142
* Converte le stringhe in array di dati di caratteri
*/
il byte statico privato convertHexToBinary (String hexData) genera Exception {
System.fuori.println (“Lunghezza:” +(esadecimale.lunghezza()/2));
se (esadecimale.lunghezza () % 2 != 0 ) {
lancia una nuova eccezione (“Deve essere un numero pari di cifre esadecimali” );
}
byte binaryData = nuovo byte;
per (int i = 0; i < binaryData.length; ++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;
}
public void pauseApp() {}
public void destroyApp (incondizionato booleano) {}
}
|
Utilizzando un gateway SMS online
Poiché J2ME blocca molti messaggi binari, puoi provare un gateway online per inviare i tuoi messaggi binari. Molte aziende forniscono servizi di gateway SMS e la maggior parte di loro ha un’interfaccia per inviare messaggi SMS binari grezzi (questi sono un “plus” per me) mentre alcune altre aziende ti danno un’interfaccia per impostare i campi personalizzati e creare le cose binarie per te.
Se si desidera utilizzare un gateway SMS online, basta ricordarsi di leggere le loro specifiche tecniche. Se si desidera installare da soli un gateway SMS che si collega a servizi esterni (vettori/operatori), suggerisco Kannel, che è un software gateway SMS gratuito ed è diffuso in tutto il mondo; Kannel ama avere l’UDH e il corpo da separare.
- Porte riservate e altro: specifiche J2ME” Wireless Messaging API”
http://java.sun.com/products/wma/index.jsp - formato standard per i contenuti O: Open Mobile Alliance
http://www. openmobilealliance.org/tech/affiliates/wap/wapindex.html - Come inviare configurazioni O, suonerie e loghi dell’operatore: NOKIA
http://www. forum.nokia.com (seach per la “Smart Messaging Specification”) - Come rilevare un telefono cellulare: WURFL
http://deviceatlas.com - Sms gateway software: Kannel
www.kannel.org