CERCA SITEMAP FEED RSS 1280
Ultimo aggiornamento: 30 Agosto 2009

Wireless Messaging API

Le Wireless Messaging API costituiscono un pacchetto opzionale per l’invio e la ricezione di messaggi wireless su dispositivi che supportano Java 2 Micro Edition.
Tutte le componenti sono contenute nel package javax.wireless.messaging che definisce tutte le interfacce per l’invio e la ricezione di messaggi testuali e binari.
L’interfaccia Message è rappresentativa di un generico messaggio e costituisce quindi la base del funzionamento delle WMA: contiene infatti funzionalità comuni ai diversi tipi di messaggi e da essa derivano le implementazioni di messaggi testuali (TextMessage) e di messaggi binari (BinaryMessage).
L’interfaccia MessageConnection definisce le funzionalità di base per l’invio e la ricezione di messagi offrendo metodi per la creazione di nuovi messaggi e per la determinazione del numero di segmenti necessari per l’invio di un messaggio mediante un determinato protocollo (sms, mms ...).
L’interfaccia MessageListener infine permette di implementare un ascoltatore degli eventi di notifica (asincroni) di nuovi messaggi.
Il supporto dei messaggi multimediali (MMS) è stato introdotto con la versione 2.0 delle Wireless Messaging API mediante l’introduzione della classe MultipartMessage.
Tipi di messaggi
La classe Message sta alla base della definizione delle classi per la rappresentazione di messaggi:
  • testuali (TextMessage)
  • binari (BinaryMessage)
  • multipart (MultipartMessage)
Ciascuna classe opera su un carico di dati (payload) organizzato diversamente e definisce pertanto metodi per l’accesso in lettura ed in scrittura al contenuto informativo dei messaggi.

Message e MessageConnection

L’interfaccia Message sta alla base di tutte le comunicazioni che coinvolgono le Wireless Messaging API; per certi aspetti la classe Message è simile alla classe Datagram: ha un indirizzo sorgente ed un indirizzo di destinazione, un payload e naturalmente definisce metodi comuni a tutti i messaggi:
  • getAddress() restituisce l’indirizzo associato al messaggio
  • setAddress(String indirizzo) setta l’indirizzo associato al messaggio
  • getTimeStamp() restituisce il timestamp relativo all’istante di tempo in cui il messaggio è stato inviato
Le WMA definiscono tre tipi di messaggi: TextMessage, BinaryMessage e MultipartMessage.
Un TextMessage è un Message che ha un payload testuale (come gli sms) e contiene metodi per:
  • settare il payload testuale setPayloadText(String testo)
  • recuperare il payload testuale getPayloadText()
Un BinaryMessage rappresenta invece un messaggio avente un payload binario e anch’esso contiene metodi per:
  • settare il payload binario setPayloadData(byte[] data)
  • recuperare il payload binario getPayloadData()
Infine il MultipartMessage rappresenta una sorta di contenitore di messaggi di diverso tipo ognuno dei quali è rappresentato dalla classe MessagePart e fisicamente costituito da un’intestazione che mantiene informazioni sul tipo dei dati e da un corpo che contiene i dati veri e propri.

L’interfaccia MessageConnection costituisce la classe factory per la creazione di messaggi, l’invio e la ricezione:
  • newMessage(String type) consente di creare un nuovo messaggio del tipo indicato come parametro (TEXT_MESSAGE, BINARY_MESSAGE o MULTIPART_MESSAGE)
  • numberOfSegments(Message msg) restituisce il numero di segmenti necessari per inviare il messaggio secondo il protocollo scelto
  • receive() riceve un messaggio
  • send(Message message) invia un messaggio
  • setMessageListener(MessageListener listener) registra un ascoltatore per la notifica di un nuovo messaggio ricevuto.
La creazione e la chiusura di una nuova MessageConnection avviene sfruttando i metodi open(String address) e close() della classe Connector (del resto le Wireless Messaging API rispettano le specifiche del Generic Connection Framework).

Una MessageConnection può essere creata in due modi:
  • lato client indicando l’indirizzo di destinazione del messaggio (è possibile inviare messaggi ma non è possibile riceverne)
    (MessageConnection)Connector.open("sms://+39xxxxxxxxxx:5000"); 
    
  • lato server specificando soltanto il protocollo e la porta di ascolto (si possono inviare e ricevere messaggi)
    (MessageConnection)Connector.open("sms://:5000"); 
    
Naturalmente occorre indicare il protocollo adatto al messaggio che vogliamo inviare o ricevere (sms:// per gli Short Message System, mms:// per i Multimedia Message System ...)
Infine l’interfaccia MessageListener permette di implementare un ascoltatore degli eventi di notifica di nuovi messaggi ricevuti: viene collegata ad una MessageConection mediante il metodo setListener(MessageListener listener) e contiene un solo metodo notifyIncomingMessage(MessageConnection conn) che viene invocato quando viene ricevuta la notifica di un nuovo messaggio in ricezione (sarà quindi necessario invocare il metodo receive() della classe MessageConnection per ottenere il messaggio ricevuto).

L'invio di messaggi

Per inviare un messaggio sia esso testuale, binario o multimediale occorre compiere le seguenti operazioni:
  • creare una MessageConnection utilizzando il protocollo adatto al contenuto del messaggio stesso
  • ottenere un’istanza del messaggio mediante il metodo newMessage(String type) della classe MessageConnection
  • configurare il messaggio indicando l’indirizzo del destinatario ed il contenuto informativo
  • inviarlo utilizzando il metodo send(Message message) della classe MessageConnection
Ecco un esempio completo di invio di un messaggio sms:
MessageConnection mc;

...

try
{
   TextMessage messaggio = (TextMessage)mc.newMessage(MessageConnection.TEXT_MESSAGE);
   messaggio.setAddress(url);
   messaggio.setPayloadText(msg);
   mc.send(messaggio);
}
catch(Exception e)
{
   ...
}

La ricezione dei messaggi

Per ricevere messaggi occorre:
  • Implementare l’interfaccia MessageListener definendo il metodo notifyIncomingMessage(MessageConnection conn)
  • Creare una MessageConnection di tipo server
  • Aggiungere il MessageListener alla MessageConnection mediante il metodo setMessageListener(MessageListener listner)
class Ascoltatore implements MessageListener
{
   public void notifyIncomingMessage(MessageConnection messageconnection)
   {
      try
      {
         Message message = messageConnection.receive();
         if (message.instanceof TextMessage)
         {
            String contenuto = ((TextMessage)message).getPayloadText();
            ...
         }
      }
      catch(Exception ecc)
      {
         ...
      }
   }
}

...

MessageConnection mc;

...

mc.setMessageListener(new Ascoltatore());

Messaggi multimediali

Un MultipartMessage come già detto può essere considerato come un contenitore di messaggi di diverso tipo ognuno dei quali è rappresentato da una classe MessagePart.

Tale classe è costituita da informazioni relative al contenuto informativo del messaggio ed il contenuto informativo vero e proprio:
  • getContent() restituisce il contenuto del messaggio in termini di byte
  • getEncoding() restituisce la codifica del contenuto del messaggio
  • getLength() restituisce la lunghezza del messaggio
  • getMIMEType() restituisce il tipo del contenuto informativo del messaggio
La creazione e la configurazione di un MultipartMessage avviene nel seguente modo:
  • viene ottenuto un MultipartMessage mediante il metodo createMessage(String type) della classe MessageConnection utilizzando come tipo MessageConnection.MULTIPART_MESSAGE;
  • vengono create le varie parti del MultipartMessage istanziando diversi MessagePart
  • le varie parti del messaggio vengono aggiunte al MultipartMessage mediante il metodo addMessagePart(MessagePart message)
  • il messaggio viene inviato mediante il metodo send(Message message) della classe MessageConnection
L’interfaccia MultipartMessage contiene anche metodi per:
  • ottenere i vari MessagePart che costituiscono il messaggio multimediale getMessageParts()
  • aggiungere e rimuovere indirizzi addAddress(String type, String address), removeAddresses()
  • configurare il subject del messaggio setSubject(String subject)