介绍J2ME可选包WMA(JSR120)
来源:互联网 发布:mac bt软件 编辑:程序博客网 时间:2024/05/10 05:32
作者:mingjava 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=303
本文将详细讲解Wireless Messaging API(WMA,JSR120),WMA提供给应用开发者一个通用的API用于开发基于无线消息服务的应用程序,比如短消息服务。目前支持的发送类型为文本和二进制两种。
在讲解WMA的结构和使用方法前,我们先来从感性上熟悉一下WMA。在SUN Wireless Toolkit 20中包括了一个短消息的范例。在运行Demo程序以前我们先看一下jad文件的内容,这可以帮助我们迅速了解应用程序的信息:
CBS-Message-Identifier: 50001
MIDlet-1: SMS Send, /icons/App.png, example.sms.SMSSend
MIDlet-2: SMS Receive, /icons/App.png, example.sms.SMSReceive
MIDlet-3: CBS Receive, /icons/App.png, example.cbs.CBSReceive
MIDlet-Data-Size: 0
MIDlet-Description: This midlet demonstrates SMS and CBS messaging
MIDlet-Jar-Size: 8569
MIDlet-Jar-URL: SMSDemo.jar
MIDlet-Name: SMS Demo
MIDlet-Permissions: javax.microedition.io.PushRegistry, javax.microedition.io.Connector.sms, javax.wireless.messaging.sms.receive,javax.wireless.messaging.sms.send,javax.microedition.io.Connector.cbs,javax.wireless.messaging.cbs.receive
MIDlet-Push-1: sms://:50000, example.sms.SMSReceive, *
MIDlet-Push-2: cbs://:50001, example.cbs.CBSReceive, *
MIDlet-Vendor: Sun Microsystems, Inc.
MIDlet-Version: 2.0
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-2.0
SMS-Port: 50000
从上述信息中我们可以看出,MIDlet套件中共包括三个MIDlet,分别是SMSSend,SMSReceive和CBSReceive。我们最应该关注的是两个MIDlet-Push实体,他们可以使得应用程序监听SMS和CBS消息,当收到消息后AMS将激活相关的MIDlet来进行处理,套件需要使用MIDP2.0的新特性——Push。因此如果想正确运行这个应用程序,必须通过OTA定购的模式进行安装。具体Push实体的属性含义这里不过多进行解释。
WTK提供了WMA Console工具,可以和模拟器配合使用来调试基于无线短消息服务的应用程序。首先我们打开Ktoolbar选择SMSDemo项目,编译并打包后,从Project—>Run via OTA开始安装应用程序,按照提示一步一步进行安装。安装后运行应用程序,系统为它分配手机号码为5550000。 然后我们从WTK中选择Utilities—WMA Console,打开的时候系统会分配一个号码,比如5550001。选择SMS Send在用户界面中输入号码5550001(WMA Console的号码),在消息内容中输入Hello选择发送。这时候我们可以在WMA Console中看到从模拟器中发送过来的消息,如下图所示: 同样,我们也可以使用WMA Console来发送短消息给模拟器,选择Send SMS然后在客户端的电话号码中选择5550000(模拟器的电话号码),端口为50000,在消息中输入How are you?并点击发送按钮。 同样,我们也可以使用WMA Console来发送短消息给模拟器,选择Send SMS然后在客户端的电话号码中选择5550000(模拟器的电话号码),端口为50000,在消息中输入How are you?并点击发送按钮。
然后我们从WTK中选择Utilities—WMA Console,打开的时候系统会分配一个号码,比如5550001。选择SMS Send在用户界面中输入号码5550001(WMA Console的号码),在消息内容中输入Hello选择发送。这时候我们可以在WMA Console中看到从模拟器中发送过来的消息,如下图所示: 同样,我们也可以使用WMA Console来发送短消息给模拟器,选择Send SMS然后在客户端的电话号码中选择5550000(模拟器的电话号码),端口为50000,在消息中输入How are you?并点击发送按钮。
同样,我们也可以使用WMA Console来发送短消息给模拟器,选择Send SMS然后在客户端的电话号码中选择5550000(模拟器的电话号码),端口为50000,在消息中输入How are you?并点击发送按钮。
我们的SMSDemo中使用了Push特性,因此在WMA Console在向模拟器发送短消息数据的时候,AMS会自动激活example.sms.SMSReceive,接收短消息内容。
WMA Console也提供了发送CBS消息的功能,与SMS类似这里略去不讲。 下面的部分详细讲解WMA的结构和使用方法。WMA是基于通用连接框架(Generic Connection Framework,GCF)的可选包,这又一次说明了GCF出色的扩展特性。所有的WMA组件都包括在javax.wireless.messaging包内。在这个包内定义了所有用于发送、接受短消息的接口,短消息的类型支持文本和二进制两种。下图是WMA组件结构图: WMA的主要组件包括:Message、TextMessage、BinaryMessage、MessageConnection和MessageListener。其中Message接口定义了不同类型短消息的基础部分,它的两个子类BinaryMessage和TextMessage分别代表了文本类型和二进制类型的消息,通过调用BinaryMessage的setPayloadData()和TextMessage的setPayloadText()方法可以把有效负载数据添加到数据容器中,然后进行发送。MessageConnection接口是扩展了GCF中定义的Connection接口,MessageConnection接口提供了newMessage(),send()和receive()方法来创建、发送和接受消息对象。MessageListener实现了监听器设计模式用于异步接受消息,当等待消息到来的时候系统不用堵塞。每次有消息到来的时候,平台会调用MessageListener中定义的notifyIncomingMessage()方法。 使用WMA非常简单,下面我们进行简单的讲述: 1. 创建MessageConnection 2. 发送短消息 MessageConnection smsconn = null; try { /** Open the message connection. */ smsconn = (MessageConnection)Connector.open(address); TextMessage txtmessage = (TextMessage)smsconn.newMessage( MessageConnection.TEXT_MESSAGE); txtmessage.setAddress(address); txtmessage.setPayloadText(messageBox.getString()); smsconn.send(txtmessage); } catch (Throwable t) { System.out.println("Send caught: "); t.printStackTrace(); } if (smsconn != null) { try { smsconn.close(); } catch (IOException ioe) { System.out.println("Closing connection caught: "); ioe.printStackTrace(); } } } 发送二进制短消息和发送文本消息非常类似,我们只是需要把byte[]来代替String作为发送的数据。范例代码如下: public void sendBinaryMessage(MessageConnection mc, byte[] msg, String url) { try { BinaryMessage bmsg = (BinaryMessage)mc.newMessage (MessageConnection.BINARY_MESSAGE); if (url!= null) bmsg.setAddress(url); bmsg.setPayloadData(msg); mc.send(bmsg); } catch(Exception e) { // Handle the exception... System.out.println("sendBinaryMessage " + e); } } 3. 接收短消息 只有作为服务器连接的时候才可以接受短消息,接收短消息的时候我们需要单独启动一个线程来处理。调用receive()方法后,我们需要首先判断Message的类型是二进制还是文本,只有这样才可以调用正确的方法来接收数据。 Message msg = null; // Try reading (maybe block for) a message try { msg = mc.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; // Handle the text message... ticker.setString(tmsg.getPayloadText()); } else { // process received message if (msg instanceof BinaryMessage) { BinaryMessage bmsg = (BinaryMessage)msg; byte[] data = bmsg.getPayloadData(); // Handle the binary message... } else { // Ignore } } } } 4. 使用MessageListener 如果我们的MIDlet注册了一个MessageListener,那么当收到短消息的时候平台就会调用notifyIncomingMessage()方法来进行处理。其实这和MIDP图形用户界面中的回调机制是一样的。通常使用MessageListener按照如下的步骤,首先定义MIDlet实现MessageListener接口,当然你也可以选择不使用MIDlet来实现MessageListener。接下来我们需要实现MessageListener的方法notifyIncomingMessage()。最后MessageConnection需要注册MessageListener,在应用程序结束的时候你最好注销它,调用setMessageListener(null)。 本文没有提供完整的范例,读者可以参考WTK中提供的SMSDemo。 使用WMA非常简单,下面我们进行简单的讲述: 1. 创建MessageConnection 2. 发送短消息 MessageConnection smsconn = null; try { /** Open the message connection. */ smsconn = (MessageConnection)Connector.open(address); TextMessage txtmessage = (TextMessage)smsconn.newMessage( MessageConnection.TEXT_MESSAGE); txtmessage.setAddress(address); txtmessage.setPayloadText(messageBox.getString()); smsconn.send(txtmessage); } catch (Throwable t) { System.out.println("Send caught: "); t.printStackTrace(); } if (smsconn != null) { try { smsconn.close(); } catch (IOException ioe) { System.out.println("Closing connection caught: "); ioe.printStackTrace(); } } } 发送二进制短消息和发送文本消息非常类似,我们只是需要把byte[]来代替String作为发送的数据。范例代码如下: public void sendBinaryMessage(MessageConnection mc, byte[] msg, String url) { try { BinaryMessage bmsg = (BinaryMessage)mc.newMessage (MessageConnection.BINARY_MESSAGE); if (url!= null) bmsg.setAddress(url); bmsg.setPayloadData(msg); mc.send(bmsg); } catch(Exception e) { // Handle the exception... System.out.println("sendBinaryMessage " + e); } } 3. 接收短消息 只有作为服务器连接的时候才可以接受短消息,接收短消息的时候我们需要单独启动一个线程来处理。调用receive()方法后,我们需要首先判断Message的类型是二进制还是文本,只有这样才可以调用正确的方法来接收数据。 Message msg = null; // Try reading (maybe block for) a message try { msg = mc.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; // Handle the text message... ticker.setString(tmsg.getPayloadText()); } else { // process received message if (msg instanceof BinaryMessage) { BinaryMessage bmsg = (BinaryMessage)msg; byte[] data = bmsg.getPayloadData(); // Handle the binary message... } else { // Ignore } } } } 4. 使用MessageListener 如果我们的MIDlet注册了一个MessageListener,那么当收到短消息的时候平台就会调用notifyIncomingMessage()方法来进行处理。其实这和MIDP图形用户界面中的回调机制是一样的。通常使用MessageListener按照如下的步骤,首先定义MIDlet实现MessageListener接口,当然你也可以选择不使用MIDlet来实现MessageListener。接下来我们需要实现MessageListener的方法notifyIncomingMessage()。最后MessageConnection需要注册MessageListener,在应用程序结束的时候你最好注销它,调用setMessageListener(null)。 本文没有提供完整的范例,读者可以参考WTK中提供的SMSDemo。
创建MessageConnection通常有两种方式,一种是按照客户端方式创建,客户端方式创建的MessageConnection只能用于发送短消息。我们需要在URL中提供电话号码和端口,如下:
(MessageConnection)Connector.open("sms://+5121234567:5000");
另一种创建方式是服务器连接,这种连接方式可以用于发送和接收短消息。
(MessageConnection)Connector.open("sms://:5000");
通过MessageConnection提供的newMessage()方法,我们可以创建Message对象,通过指定短消息类型为BINARY_MESSAGE或者TEXT_MESSAGE可分别得到二进制和文本类型的消息对象。如果我们是使用客户端连接,那么在我们创建MessageConnection的时候,传入的URL将作为Message对象的目标地址。如果我们是使用服务器连接,那么我需要使用setAddress()方法设置目标地址。下面的代码说明了如何发送短消息。
String address = destinationAddress + ":" + smsPort;
public void processMessage() {
创建MessageConnection通常有两种方式,一种是按照客户端方式创建,客户端方式创建的MessageConnection只能用于发送短消息。我们需要在URL中提供电话号码和端口,如下:
(MessageConnection)Connector.open("sms://+5121234567:5000");
另一种创建方式是服务器连接,这种连接方式可以用于发送和接收短消息。
(MessageConnection)Connector.open("sms://:5000");
通过MessageConnection提供的newMessage()方法,我们可以创建Message对象,通过指定短消息类型为BINARY_MESSAGE或者TEXT_MESSAGE可分别得到二进制和文本类型的消息对象。如果我们是使用客户端连接,那么在我们创建MessageConnection的时候,传入的URL将作为Message对象的目标地址。如果我们是使用服务器连接,那么我需要使用setAddress()方法设置目标地址。下面的代码说明了如何发送短消息。
String address = destinationAddress + ":" + smsPort;
public void processMessage() {
- 介绍J2ME可选包WMA(JSR120)
- 介绍J2ME可选包WMA(JSR120)
- 介绍J2ME可选包FileConnection
- 介绍J2ME可选包FileConnection
- 介绍J2ME可选包FileConnection
- 介绍J2ME可选包FileConnection
- 介绍J2ME可选包的概念
- 介绍J2ME可选包的概念
- J2ME可选包—PIM介绍
- J2ME可选包—PIM介绍
- PIM J2ME可选包
- J2ME可选包FileConnection
- J2ME短信处理: jsr120
- 介绍J2ME可选包——PIM OP
- 了解J2ME可选包MMAPI
- 比较J2ME多媒体可选包
- 了解J2ME可选包MMAPI
- 比较J2ME多媒体可选包
- 一些有关C++语言中的bit操作
- 从德国车和日本车看民族区别
- JAVA开发需要熟悉的工具和技术
- 翻译:java中怎样使用树结构(How to Use Trees)(二)
- 鼠标在slide控件的任意位置上点击,滑块滑动到该位置是如何实现的,有什么属性吗?
- 介绍J2ME可选包WMA(JSR120)
- 完美解决一个事件激活多个函数
- 在CSDN开辟了自己的一片小天地
- 煲汤大全(一)
- GPS卫星定位系统与手机窃听原理
- 什么是应用框架?
- 关于错误处理
- 什么是BLOG
- (转载)为什么会出现LNK2005"符号已定义"的链接错误? (CRT的学习)