短信API基础
http://wireless.java.sun.com/midp/ttips/wma/
aiya翻译
[email protected]
java的短信API是可选的包,Wireless Messaging API(WMA),让手机能够通过它来收发文本的短信息和二进制格式多媒体的信息。
WMA是基于GCF(Generic Connection FrameWork),GCF提供了输入输出的抽象的框架,该框架定义了一个可选包提供他们需要的i/o连接,GCF还是CDC的一部分。
通过WMA来传递和接受信息意味着电话通过无线的方式来传递信息,不论是GSM手机还是CDMA手机,特别是WMA支持SMS和CBS,虽然WMA信息和数据报很相似,但是WMA并不使用GCF定义的数据报借口,这种数据报接口是为了在UDP连接中使用,取而代之的是,WMA定义了一套新的接口,这套接口放在javax.wireless.messaging包中。
如果要接受和发出短信息,应用程序必须首先得到一个MessageConnection接口的一个实例,这可以使用GCF连接的工厂方法,传递给方法javax.microedition.io.Connector.open()的URL确认是使用SMS协议还是CBS协议,当然还要传递过去目的手机的号码,端口,也可以同时传递过去。
下面都是有效的URL形式:
sms://+417034967891
sms://+417034967891:5678
sms://:5678
cbs://:5678
这两种形式的短信,前面两种形式的URL建立客户端连接,这个URL一般指定设备,指定端口,如果端口不指定的话,默认的就是文本短信端口,第三种形式是在本地设备上建立一个服务连接,允许应用程序等待和应对其他设备发过来的信息,最后的形式允许应用接受网络操作的广播信息。
下面是一个简单的建立一个客户SMS连接的代码
import javax.microedition.io.*;
import javax.wireless.messaging.*;
.....
MessageConnection conn = null;
String url = "sms://+417034967891";
try {
conn = (MessageConnection) Connector.open( url );
// 操作这个连接
}
catch( Exception e ){
// 处理异常
}
finally {
if( conn != null ){
try { conn.close(); } catch( Exception e ){}
}
}
如果需要发送一个短信,则使用MessageConnection.newMessage()方法来建立一个空的信息,设定他的payload(需要发送的文本,或者是二进制数据),然后调用MessageConnection.send()方法,如下所示:
public void sendText( MessageConnection conn, String text )
throws IOException, InterruptedIOException {
TextMessage msg = conn.newMessage( conn.TEXT_MESSAGE );
msg.setPayloadText( text );
conn.send( msg );
}
传送二进制数据也大同小异
public void sendBinary( MessageConnection conn, byte[] data )
throws IOException, InterruptedIOException {
BinaryMessage msg =
conn.newMessage( conn.BINARY_MESSAGE );
msg.setPayloadData( data );
conn.send( msg );
}
当然,对于在一个信息里面能够传递的数据长度是有限制,一般来说,一则SMS文本短信息限制在160个字符,或者70个汉字,这和字符编码方式有关,而二进制数据限制在140字节,WMA需要对于信息串联融合的支持,但是,这意味着在长度需要至少是限制的三倍的时候使用。可以通过使用MessageConnection.numberOfSegments()来判断一个信息能不能够被传递,如果需要传递,至少要多少节?
而接受一个信息就要简单一些,在打开一个服务连接后,应用程序调用连接的receive()方法,他返回的是在指定的端口上下一个可以接受的短信,如果没有可以接受的短信,方法会一直等待倒下格的到来,或者一直到一个不同的线程来关闭这个连接。
import java.io.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;
MessageConnection conn = null;
String url = "sms://:5678"; // 本机,不需要手机号!
try {
conn = (MessageConnection) Connector.open( url );
while( true ){
Message msg = conn.receive(); // 等待
if( msg instanceof BinaryMessage ){
byte[] data =
((BinaryMessage) msg).getPayloadData();
//
} else {
String text =
((TextMessage) msg).getPayloadText();
//进行必要的操作 }
}
}
catch( Exception e ){
// 处理异常
}
finally {
if( conn != null ){
try { conn.close(); } catch( Exception e ){}
}
}
当然,WMA就是为了处理收发短信息的,不是为了处理他们,一般来说,应用程序发给应用程序的信息应该用二进制信息来作为收发的载体,标准的DataInputStream, DataOutputStream, ByteArrayInputStream, 和 ByteArrayOutputStream类能够很好的完成需要的功能。
这里是最新的WMA的实现。他的完善还有很漫长的路…