无线消息 API JSR-205 JSR-102 整理

阅读更多
开发手机程序,最能想到的就是对SMS(ShortMessagingService),MMS(MultimediaMessagingService),Email的支持。
对于SMS,MMS,sun官方已经出了个jsr-205,jsr-102规范对其进行了完善的支持。至于Email吗,介绍完前两个后,我再把我的想法说出来,大家参考下。

一。前言
学习Java™MicroEdition(JavaME)无线消息API。这个专栏将从几个简单的代码示例开始,随后讨论它为企业开发人员带来的各种机会。

移动电话最常见的一个特性就是消息传递。文本消息或短消息(SMS)自引入之初,已经变得越来越流行。当然,多媒体消息(MMS)又为其增加了图片、声音和视频等多媒体内容。

在MMS刚出现时,有些专家预言它会取代SMS,如果它的价格不是这么高的话,这个预言确实有可能会成为现实。即便如此,这种能在手机之间传递多媒体内容的功能还是渐受青睐。最近手机电子邮件的成功,意味着未来手机消息传递的主要形式可能是电子邮件,但是要到那一步还有很长的一段路要走。

二。无线消息
JSR-205中定义的无线消息API(WMA)2.0是用于无线消息的一组可选API。WMA的连接基于通用连接框架,该框架是在基于CLDC的JavaME架构中进行通信的基础。WMA2.0向后兼容WMA1.1,添加了对发送和接收多媒体消息的支持。换句话说,无线消息API提供了无线通信的高级抽象。它将传输层完全隐藏,因而所要做的工作只是创建消息、发送消息和接收消息。

WMA支持文本消息、小区广播和多媒体消息。文本消息很简单,大多数人都知道它是什么。SMS消息极为流行,而且已经成为日常生活的一部分。WMA支持发送和接收文本消息。发送非常简单:只需定义目标地址和文本,文本被称为净荷(payload)。接收稍微复杂些,因为需要应用程序能够侦听进入的消息。在下面的示例中将看到如何读取进入的消息。

这里介绍下jsr-102规范是针对WMA1.1的。比较详细的资料可以google下。jsr205规范完全向下兼容,也就是说。你在jsr-102写的程序可以不用任何修改就可以运行在jsr-205规范下。

消息内容

二进制消息顾名思义就是带有二进制内容的消息。内容可以是要传递给应用程序或者从应用程序传递给其他客户机或服务器的任何内容。多部分消息可以包含多块媒体,例如文本、音频和视频。

小区广播可能是最不为人所知的消息类型。小区广播服务是一种数据服务,在这种服务中,消息由基站广播,由侦听这个基站的每个移动站接收。这个服务是单向的,这意味着WMA只能用来接收这类消息。

发送和接收

发送文本消息很简单。步骤如下:

  • 设置手机号码(地址)。
  • Connector接口创建MessageConnection
  • 创建新消息,并把它的类型转换成TextMessage
  • 设置净荷。
  • 通过调用send()方法并向方法传递Message实例,发送消息。

发送的消息中包含的发送人信息,与正常发送消息时的相同。显示了使用JavaMEWMA发送消息的代码。

java代码
  1. try{
  2. Stringaddr=?ms://+358401234567?
  3. MessageConnectionconn=(MessageConnection)Connector.open(addr);
  4. TextMessagemsg=
  5. (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);
  6. msg.setPayloadText(?hisisatestmessage!?;
  7. conn.send(msg);
  8. }catch(Exceptione){
  9. ...
  10. }

接收文本消息略微复杂,但也不是太复杂。在一个端口上打开MessageConnection(在这个示例中是5432)并从MessageConnection读取进入的消息。可以用instanceof测试消息的类型。要接收有消息进入的通知,应用程序必须实现MessageListener接口,所以要编写比更复杂一些的代码,才能让它真正工作。


java代码
  1. try{
  2. Stringaddr=?ms://:5432?
  3. MessageConnectionconn=(MessageConnection)Connector.open(addr);
  4. Messagemsg=null;
  5. while(someExitCondition){
  6. msg=conn.receive();
  7. if(msginstanceofTextMessage){
  8. TextMessagetmsg=(TextMessage)msg;
  9. StringreceivedText=tmsg.getPayloadText();
  10. //respondwiththesametextwith?hanks.?
  11. tmsg.setPayloadText(?hanks?;
  12. conn.send(tmsg);
  13. }else{
  14. //Receivedmessagewasnotatextmessage,bute.g.binary
  15. ...
  16. }
  17. }//endwhile
  18. }catch(Exceptione){
  19. ...
  20. }

发送二进制消息与发送文本消息很相似。首先需要把数据放在字节数组中,然后创建MessageConnection(如清单3BINARY_MESSAGE


java代码
  1. try{
  2. Stringstr="Hello!";
  3. byte[]msg=str.getBytes();
  4. Stringaddr="sms://+358401234567";
  5. MessageConnectionconn=(MessageConnection)Connector.open(addr);
  6. BinaryMessagebm=(BinaryMessage)mc.newMessage
  7. (MessageConnection.BINARY_MESSAGE);
  8. if(url!=null)
  9. bm.setAddress(url);
  10. bm.setPayloadData(msg);
  11. conn.send(bm);
  12. }
  13. catch(Exceptione){
  14. }

三类消息传递

WMA消息的传递可以分成:服务器到手机、手机到服务器和手机到手机。

服务器到手机消息传递中,CRM应用程序可以向手机应用程序发送数据,手机应用程序可以接收数据并用对用户友好的方式呈现数据。在手机到服务器的消息传递中,手机应用程序可以向服务器发送数据(HTTP连接也可以做这项工作,但HTTP连接不可能总是存在)。在手机到手机的消息传递中,用户可以向好友的手机发送应用程序数据或游戏数据,进行游戏项目交换及其他操作。

上面大部分文字摘自www.ibm.com/developerworks/cn/java/wi-arch32.html

整理成一个工具类
java代码
  1. publicfinalstaticvoidsendTextMessage(Stringphone,Stringtext)
  2. throwsIOException{
  3. checkPhoneNumber(phone);
  4. MessageConnectionconn=(MessageConnection)Connector.open("sms://"
  5. +phone);
  6. TextMessagemsg=(TextMessage)conn
  7. .newMessage(MessageConnection.TEXT_MESSAGE);
  8. msg.setPayloadText(text);
  9. conn.send(msg);
  10. }
  11. publicfinalstaticvoidsendTextBinary(Stringphone,byte[]text)
  12. throwsIOException{
  13. checkPhoneNumber(phone);
  14. MessageConnectionconn=(MessageConnection)Connector.open("sms://"
  15. +phone);
  16. BinaryMessagebm=(BinaryMessage)conn
  17. .newMessage(MessageConnection.BINARY_MESSAGE);
  18. bm.setAddress(phone);
  19. bm.setPayloadData(text);
  20. conn.send(bm);
  21. }
  22. privatefinalstaticvoidcheckPhoneNumber(Stringphone)
  23. throwsPhoneNumberException{
  24. if(phone==null
  25. ||phone.equals("")){
  26. thrownewPhoneNumberException("手机号码不能为空!");
  27. }
  28. try{
  29. Integer.parseInt(phone);
  30. }catch(NumberFormatExceptionn){
  31. thrownewPhoneNumberException("手机号码必须为数据!");
  32. }
  33. }

这篇文章会持续更新中,请关注

更新一。对Email的支持:有用过手机支持email浏览是比较痛苦的。就单纯拿我的nokia6630来说吧。设置就一大堆了。搞的我都不想去设置了。其实对于手机浏览email来说我们直需要其中的文本信息就ok了(如果邮件带有附件(一般附件是word,图片等)对于智能机来说,是可以通过安装office来支持浏览的,但很辛苦。
该怎么样来省去那些麻烦的设置呢,我们只需要用户提供一个邮箱地址,密码就可以登录到邮箱跟发邮件了,对于那些协议的设置我们来帮它们做。
比如设计一个自己的邮件转发服务器。一个邮件客户端(j2me)实现,然后客户端的所有请求都是通过我们这边的服务器进行工作,我们可以把那些邮件数据进行压缩,后在传送,这样不仅可以提高速度,而且处理起来也是比较方便的。
过段时间,决定自己实现一个这样的结构。

你可能感兴趣的:(应用服务器,JavaME,企业应用,游戏,浏览器)