用JavaME进行无线消息传递

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

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

    本月,我将讨论 Java ME 无线消息 API.我将从几个简单的编码示例开始,随后讨论它为企业开发人员带来的各种机会。

无线消息 API

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

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

消息内容

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

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

发送和接收

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

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

    发送的消息中包含的发送人信息,与正常发送消息时的相同。清单 1 显示了使用 Java ME WMA 发送消息的代码。


清单 1. 发送消息

 try { 
     String addr = "sms://+358401234567";
     MessageConnection conn = (MessageConnection) Connector.open(addr); 
     TextMessage msg = (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE); 
     msg.setPayloadText("this is a test message!"; 
     conn.send(msg); 
} catch (Exception e) { ... }
    接收文本消息略微复杂,但也不是太复杂。在一个端口上打开 MessageConnection (在这个示例中是 5432)并从 MessageConnection 读取进入的消息。可以用 instanceof 测试消息的类型。要接收有消息进入的通知,应用程序必须实现 MessageListener 接口,所以要编写比 清单 2 更复杂一些的代码,才能让它真正工作。


清单 2. 接收消息

 try { 
     String addr = "sms://:5432";
     MessageConnection conn = (MessageConnection) Connector.open(addr);
     Message msg = null; 
     while (someExitCondition) { 
             msg = conn.receive(); 
             if (msg instanceof TextMessage) 
             { 
                 TextMessage tmsg = (TextMessage)msg; 
                 String receivedText = tmsg.getPayloadText();
                // respond with the same text with hanks.
                  tmsg.setPayloadText(hanks); 
                  conn.send(tmsg); 
              } else { 
                 // Received message was not a text message, but e.g. binary ... 
             } 
           } // end while 
       } catch (Exception e) { ... }
    发送二进制消息与发送文本消息很相似。首先需要把数据放在字节数组中,然后创建 MessageConnection(如 清单 3 所示),并创建 BINARY_MESSAGE。


清单 3. 发送二进制消息

 try { 
       String str = "Hello!"; 
       byte[] msg = str.getBytes();
       String addr = "sms://+358401234567"; 
       MessageConnection conn = (MessageConnection) Connector.open(addr); 
       BinaryMessage bm = (BinaryMessage)mc.newMessage (MessageConnection.BINARY_MESSAGE); 
       if (url!= null) 
             bm.setAddress(url); 
        bm.setPayloadData(msg); 
        conn.send(bm); 
} catch(Exception e) { }

    如果想学习使用 WMA 编写代码的更多内容,请参阅本文末尾的 参考资料。现在,我把重点放在 WMA 的潜在应用上。

  

无尽的可能性

    用消息能做什么呢?从 Java ME 应用程序发送文本消息确实很酷 —— 可以按自己的想法定制用户界面和用途 —— 但它还算不上是招人喜爱的应用程序。在让这种消息传递尽可能简单便捷方面,Nokia 和 Sony-Ericsson 已经投入了大量时间和金钱。

    商业应用程序和预定义文本信息为其带来了真正的优势。例如,在商业应用中,很可能会出现这样的一些情况:GPRS、WLAN 或者其他基于 IP 的协议不可用或不可靠;使用的是基于 SMS 的传统接口;操作的也还是带有 SMS 接口的设备,此时您就可以用文本消息作为传输协议。比如在某种场景下,您可以让服务器(例如 CRM 服务器)发送带有最新销售数据的文本消息,然后手机应用程序可以确认来自业务服务的消息,并用图表或者其他您喜欢的方式呈现数据(对于更大量的数据,当然用 HTTP 或数据报会更好)。

    也可以在游戏编程中同时使用文本和二进制消息。例如,一个玩家可以把特定于游戏的一些内容(例如获得的级别、工具或点数)发送给玩同一手机游戏的好友。好友的应用程序会接收消息,并打开发送的内容。当然,二进制数据也可以用于商业应用程序。

    多媒体消息在应用或服务中还不太流行,但是它们确实为游戏领域提供了一些有趣的机会。例如,可以把游戏屏幕的快照发送给好友,好友能以多媒体消息的形式接收快照,而不依赖任何特定的应用程序。以图片形式发送天气预报是利用 MMS 的方便性的另一个便利服务。

三类消息传递

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

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

结束语

    在本文中,我介绍了使用 Java ME WMA 进行无线消息传递的相关内容。我提供了一些基本的发送和接收示例,并讨论了无线消息传递的一些使用方式。WMA 支持发送和接收文本消息、二进制消息和多媒体消息,支持接收小区广播消息。所有这些消息类型为游戏开发人员和商业应用程序开发人员提供了许多机会。

    消息传递(电子邮件、IM)已经证明是 Internet 日常应用的重要部分。文本消息已经成为了手机用户体验至关重要的一部分。WMA 的简单性让它有幸成为了无线应用程序开发人员的工具包中的一员。

为了能收到进入消息的通知,MIDlet 在 MessageConnection 实例 serverConn 处注册一个 MessageListener 对象。

serverConn.setMessageListener(MessageListener ml);

            

它还在 MessageListener 接口中实现 notifyIncomingMessage() 。当进入消息到达 MessageConnection 时,就调用 notifyIncomingMessage() 方法。应用程序必须使用 MessageConnectionreceive() 方法来检索该消息。

WMAServer 应用程序从进入消息读取文本或二进制的有效负载数据,然后将其存储在字符串对象中供以后显示。

public void notifyIncomingMessage(MessageConnection conn) {

            Message msg = null;

            //  Try reading (maybe block for) a message

            try {

            msg = conn.receive();

            }

            catch (Exception e) {

            // Handle reading errors

            System.out.println("processMessage.receive " + e);

            }

            // Process the received message

            if (msg instanceof TextMessage) {

            TextMessage tmsg = (TextMessage)msg;

            msgReceived = tmsg.getPayloadText();

            }

            else

            {

            // process received message

            if (msg instanceof BinaryMessage) {

            BinaryMessage bmsg = (BinaryMessage)msg;

            byte[] data = bmsg.getPayloadData();

            //   Handle the binary message...

            msgReceived = data.toString();

            }

            }

            }         

测试代码:

import  javax.microedition.io.Connector;
import  javax.microedition.lcdui.Command;
import  javax.microedition.lcdui.CommandListener;
import  javax.microedition.lcdui.Display;
import  javax.microedition.lcdui.Displayable;
import  javax.microedition.lcdui.Form;
import  javax.microedition.lcdui.TextField;
import  javax.microedition.midlet.MIDlet;
import  javax.wireless.messaging.MessageConnection;
import  javax.wireless.messaging.TextMessage;

public   class  SMSMIDlet  extends  MIDlet  implements  CommandListener {

    
private  Command exit;
    
private  Command send;
    
private  TextField number;
    
private  TextField content;
    
private  Form form;

    
public  SMSMIDlet() {
        number 
=   new  TextField( " Phone Number: " " 13488755864 " 50 ,
                TextField.ANY);
        content 
=   new  TextField( " Content: " " sms test " 256 , TextField.ANY);

        send 
=   new  Command( " send " , Command.OK,  0 );
        exit 
=   new  Command( " exit " , Command.BACK,  1 );

        form 
=   new  Form( " SMS Test " );
        form.append(number);
        form.append(content);
        form.addCommand(send);
        form.addCommand(exit);
        form.setCommandListener(
this );
    }

    
public   void  commandAction(Command c, Displayable d) {
        
if  (d.equals(form)) {
            
if  (c.equals(send)) {
                String num 
=  number.getString();
                String con 
=  content.getString();
                
if  (num  !=   null   &&  num.length()  >   1 ) {
                    
if  (con  !=   null   &&  con.length()  >   1 ) {
                        sendSMS(num, con);
                    }
                }
            } 
else   if  (c.equals(exit)) {
                notifyDestroyed();
            }
        }
    }

    
protected   void  destroyApp( boolean  arg0) {
    }

    
protected   void  pauseApp() {
    }

    
protected   void  startApp() {
        Display.getDisplay(
this ).setCurrent(form);
    }

    
public   void  sendSMS( final  String phoneNumber,  final  String message) {
        
new  Thread() {
            
public   void  run() {
                
try  {
                    
//  地址
                    String address  =   " sms:// "   +  phoneNumber;

                    
//  建立连接
                    MessageConnection conn  =  (MessageConnection) Connector
                            .open(address);
                    form.append(
" 建立连接 " );
                    
//  设置短信息类型为文本,短信息有文本和二进制两种类型
                    TextMessage msg  =  (TextMessage) conn
                            .newMessage(MessageConnection.TEXT_MESSAGE);
                    form.append(
" 创建信息 " );
                    
//  设置信息内容
                    msg.setPayloadText(message);
                    form.append(
" 设置信息 " );
                    
//  发送
                    conn.send(msg);
                    form.append(
" 发送完成 " );
                    conn.close();
                    form.append(
" 关闭连接 " );
                } 
catch  (Exception e) {
                    form.append(e.toString());
                    
//  未处理
                }
            }
        }.start();
    }
}

你可能感兴趣的:(JavaME)