Wireless Messaging API屬于J2ME體系的一個Optional Package,通常簡稱為WMA,使用它可以通過無線連接發(fā)送和接受短文本信息或者是二進(jìn)制信息。WMA基于Generic ConnectionFramework(GCF),GCF在Connected Limited Device Configuration (CLDC)中定義,GCF提供了一個抽象的框架用于履行輸入和輸出操作,GCF也是Connected Device Configuration (CDC)的一部分,因此何J2ME-enabled設(shè)備上使用WMA。
應(yīng)用WMA,意味著你可以使用cellular telephones(蜂窩電話)或者是相似的設(shè)備通過各種無線網(wǎng)絡(luò)發(fā)送和接收短信息,而不管這個無線網(wǎng)絡(luò)是基于GSM還是CDMA。值得一提的是,WMA還支持ShortMessage Service (SMS,短信息服務(wù))和 Cell Broadcast Short Message Service (CBS).盡管WMA消息和數(shù)據(jù)報(bào)(datagrams)十分相似,但是WMA并沒有使用GCF框架中定義的數(shù)據(jù)報(bào)接口(datagraminterfaces),因?yàn)檫@種接口是為UDP Connections而設(shè)計(jì)的。WMA在javax.wireless.messaging包中定義了一套全新的接口,用于接收和發(fā)送短消息。
在WMA中,為了接收或者是發(fā)送短消息,你必須首先獲得一個MessageConnection接口的實(shí)例,調(diào)用javax.microedition.io.Connector的open()方法可以返回MessageConnection接口的實(shí)例,參數(shù)是字
符串型的URL,該URL和HTTP協(xié)議中的URL十分相似,它必須指定所使用的協(xié)議(SMS或者是CBS),目標(biāo)電話的號碼,端口號等等,例如下面的URL都是合法的URL:
1. sms://+417034967891
2. sms://+417034967891:5678
3. sms://:5678
4. cbs://:5678
在上述URL串中,第一個和第二個URL串指定了目標(biāo)設(shè)備(移動電話)的號碼,第二個URL串還指定了端口號,假如端口號沒有被指定,那么WMA將會使用目標(biāo)設(shè)備上缺省的文本信息端口(text messaging port),上述兩種情況主要用于發(fā)送短信息的情況。第三個URL串表明指定的是本機(jī)的端口,這種情況主要用于接收短信息。第四個URL串也是指定本機(jī)的端口,這種情況主要適用于監(jiān)聽網(wǎng)絡(luò)中廣播信息。第三個URL串和第四個URL串的主要區(qū)別在于所哦使用的協(xié)議不一樣。
下面我們來看一段簡單的創(chuàng)建SMS客戶端的代碼:
import javax.microedition.io.*;
import javax.wireless.messaging.*;
.....
MessageConnection conn = null;
String url = "sms://+417034967891";
try
{
conn = (MessageConnection) Connector.open( url );
// do something with the connection
}
catch( Exception e )
{
// handle errors
}
finally
{
if( conn != null )
{
}}
現(xiàn)在SMS客戶端是創(chuàng)建起來了,也就是說你手上的設(shè)備已經(jīng)和服務(wù)器建立了連接,那么如何發(fā)送短信息呢?首先,你應(yīng)該使用MessageConnection接口的newMessage()方法創(chuàng)建一個空(empty)的消息,然后再設(shè)置該消息的PayloadText(也就是需要發(fā)送的文本或者是二進(jìn)制數(shù)據(jù)),最后調(diào)用MessageConnection的send()方法將短信息發(fā)送到目標(biāo)設(shè)備中去。請看下面的代碼:
public void sendText( MessageConnection conn, String text)
throws IOException, InterruptedIOException {
TextMessage msg = conn.newMessage( conn.TEXT_MESSAGE );
msg.setPayloadText( text );
conn.send( msg );
}
假如是發(fā)送二進(jìn)制格式的數(shù)據(jù),那么代碼略有不同:
public void sendBinary( MessageConnection conn, byte[] data)
throws IOException, InterruptedIOException {
BinaryMessage msg=conn.newMessage( conn.BINARY_MESSAGE);
當(dāng)然了,你所能發(fā)送的數(shù)據(jù)量是有限的,一般來說,SMS文本信息可以包含160或者是70個字符,
這依靠于你使用何種字符編碼,假如是二進(jìn)制數(shù)據(jù),那么容量是140字節(jié)(Note:The WMA requires support for message concatenation, however, which means that these limits are actually at least three times higher.)。同時,你可以使用MessageConnection接口的numberO fSegments()
方法決定某一個非凡的短信息能否被發(fā)送,并且需要把這條信息拆分為多少個信息段(message segments)。
上面介紹了如何應(yīng)用WMA發(fā)送短信息,應(yīng)用WMA接收短信息更加簡單,當(dāng)打開一個Server Connection后(此時建立connection時,不需指定電話號碼,只需要指定協(xié)議以及監(jiān)聽端口號),直接調(diào)用MessageConnection接口的receive()方法,該方法返回在當(dāng)前設(shè)備的指定端口收到的下一個短信息。假如沒有短信息到達(dá),那么該方法將會阻塞,并等待下一個短信息的到達(dá),或者由另一個不同的線程關(guān)閉此連接。請看下面的示例代碼:
新聞熱點(diǎn)
疑難解答
圖片精選