L'invio e la ricezione di SMS da applicazioni J2ME sono consentiti tramite le Wireless Messaging API (WMA), package opzionale che attualmente è presente in gran parte dei modelli di terminali presenti sul mercato.
Attualmente le WMA sono alla versione 1.1 (JSR 120), mentre sono in fase di approvazione le WMA versione 2.0 (identificata dalla JSR 205).
Le WMA 1.1 sono supportate nativamente nel WTK, mentre se si vogliono affrontare progetti provando le WMA 2.0, è necessario selezionare l'apposita checkbox nella schermata "Settings for Project" del WTK.
Come nel caso di una normale connessione di rete, anche per inviare un messaggio è necessario aprire una connessione (sul modello del Generic Connection Framework GCF) e creare, in questo caso, una MessageConnection:
MessageConnection msgConnection = (MessageConnection) Connector.open("sms://3481234567");
In questo modo abbiamo creato una connessione per inviare un SMS al numero 3481234567.
È opportuno gestire l'invio dell'SMS in un thread separato:
...//
SMSSender sender = new SMSSender();
Thread th = new Thread(sender);
th.start();
...//
Listato 32. invio sms (Vedi codice completo)
..//
conn = (MessageConnection) Connector.open("sms://3481234567");
TextMessage msg = (TextMessage) conn.newMessage(
MessageConnection.TEXT_MESSAGE);
msg.setPayloadText("Ciao");
conn.send(msg);
..//
Anche quando si effettua l'invio di un SMS, se la midlet non è autenticata dal produttore del terminale, apparirà una schermata che richiede la confermare dell'operazione.
È possibile stabilire una connessione senza specificare a priori il numero a cui inviare il messaggio, che viene poi settato quando si crea l'oggetto TextMessage (la porta sarà utile quando si dovrà gestire dalla midlet sia l'invio che la ricezione di SMS):
MessageConnection conn = (MessageConnection) Connector.open("sms://");
TextMessage msg = (TextMessage) conn.newMessage(MessageConnection.TEXT_MESSAGE, "3481234567");
msg.setPayloadText("Ciao");
Oltre che messaggi di testo è possibile spedire anche messaggi binari, nei quali viene inviato un contenuto rappresentato da un array di byte:
Listato 33. invio messaggi binari
public void sendBinaryMessage(MessageConnection conn, byte[] content) {
try {
BinaryMessage bmsg = (BinaryMessage)conn.newMessage(MessageConnection.BINARY_MESSAGE);
bmsg.setAddress("sms://34812345678:7500");
bmsg.setPayloadData(msg);
conn.send(bmsg);
}
catch(Exception e) {
e.printStackTrace();
}
}
In questo esempio si è settata la porta di destinazione dell'SMS che è la 7500: è un'altra modalità di configurazione che si ha utilizzando WMA.
Per provare i progetti che utilizzano WMA nel WTK si può utilizzare la WMA console. Per attivarla si va su File>Utilities e si preme il quinto pulsante ("Open console") sulla destra.
Figura 14. Test nella console per verificare il codice
La console permette di verificare se il nostro codice per l'invio SMS è corretto. Per fare ciò, la destinazione del nostro SMS deve essere +5550000 (lo possiamo sostituire a 3481234567), cioè il numero riportato in alto a sinistra sulla console.
Figura 15. Tracciamento e risposta al messaggio inviato
Effettuando l'invio del messaggio, nella console viene riportata, tramite un opportuno tracciamento, la ricezione del messaggio spedito dall'emulatore del WTK identificato dal numero +5550001.
Le applicazioni J2ME possono ricevere messaggi su una determinata porta e quindi questa deve essere specificata quando si crea la connessione:
MessageConnection conn = (MessageConnection) Connector.open("sms://:7500");
Ci sono due modi per effettuare la ricezione:
Nel primo caso si sfrutta il metodo receive() di MessageConnection che è bloccante. Alla ricezione, l'esecuzione va avanti e si può determinare il tipo di messaggio (nel codice seguente consideriamo solo i messaggi di testo) e leggerne i dati (mittente, testo, ecc.) tramite i metodi getPayloadText() e getAddress():
Listato 34. Ricezione sms (Vedi codice completo)
..//
mc = (MessageConnection) Connector.open("sms://+7500");
msg = mc.receive();
if (msg instanceof TextMessage)
{
originator = msg.getAddress();
TextMessage tmsg = (TextMessage) msg;
text = tmsg.getPayloadText();
..//
Form form = new Form(originator);
form.append(text);
..//
display.setCurrent(form);
..//
Apache commons: BeanUtilsUn componente che permette di riconoscere e manipolare con... |
Generare classi Java dal modello UML con EclipseGenerare automaticamente le classi Java e le relazioni a partire da... |
Dependency Injection con Google GuiceRealizzare la Dependency Injection con il container di Mountain View |
Struts vs JSF, le principali differenze tra i due framework per il WebLe principali differenze tra i due framework Java per il Web |
Introduzione a JavaFXProgrammare con Java FX script e applicazioni cross-platform |
Guida Java SpringScoprire il lightweight container più famoso del mondo Java.... |
Guida Java 6Prendendo le mosse dalla guida Java, già presente su HTML.it,... |
Guida J2EEUn percorso che ci porterà a conoscere Java 2 Enterprise Edition la... |
Ogni mese, direttamente nella tua e-mail: articoli, script e guide su Java, Visual Basic, VB.Net ed i più diffusi linguaggi di programmazione.
Iscriviti alla newsletter