介绍J2ME可选包WMA(JSR120)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

作者: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,SMSReceiveCBSReceive。我们最应该关注的是两个MIDlet-Push实体,他们可以使得应用程序监听SMSCBS消息,当收到消息后AMS将激活相关的MIDlet来进行处理,套件需要使用MIDP2.0的新特性——Push。因此如果想正确运行这个应用程序,必须通过OTA定购的模式进行安装。具体Push实体的属性含义这里不过多进行解释。

       WTK提供了WMA Console工具,可以和模拟器配合使用来调试基于无线短消息服务的应用程序。首先我们打开Ktoolbar选择SMSDemo项目,编译并打包后,从Project>Run via OTA开始安装应用程序,按照提示一步一步进行安装。安装后运行应用程序,系统为它分配手机号码为5550000

然后我们从WTK中选择UtilitiesWMA 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中选择UtilitiesWMA 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的主要组件包括:MessageTextMessageBinaryMessageMessageConnectionMessageListener。其中Message接口定义了不同类型短消息的基础部分,它的两个子类BinaryMessageTextMessage分别代表了文本类型和二进制类型的消息,通过调用BinaryMessagesetPayloadData()TextMessagesetPayloadText()方法可以把有效负载数据添加到数据容器中,然后进行发送。MessageConnection接口是扩展了GCF中定义的Connection接口,MessageConnection接口提供了newMessage()send()receive()方法来创建、发送和接受消息对象。MessageListener实现了监听器设计模式用于异步接受消息,当等待消息到来的时候系统不用堵塞。每次有消息到来的时候,平台会调用MessageListener中定义的notifyIncomingMessage()方法。

       使用WMA非常简单,下面我们进行简单的讲述:

1.        创建MessageConnection
创建MessageConnection通常有两种方式,一种是按照客户端方式创建,客户端方式创建的MessageConnection只能用于发送短消息。我们需要在URL中提供电话号码和端口,如下:

(MessageConnection)Connector.open("sms://+5121234567:5000");
另一种创建方式是服务器连接,这种连接方式可以用于发送和接收短消息。
(MessageConnection)Connector.open("sms://:5000");

2.        发送短消息
通过MessageConnection提供的newMessage()方法,我们可以创建Message对象,通过指定短消息类型为BINARY_MESSAGE或者TEXT_MESSAGE可分别得到二进制和文本类型的消息对象。如果我们是使用客户端连接,那么在我们创建MessageConnection的时候,传入的URL将作为Message对象的目标地址。如果我们是使用服务器连接,那么我需要使用setAddress()方法设置目标地址。下面的代码说明了如何发送短消息。
   String address = destinationAddress + ":" + smsPort;

   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的类型是二进制还是文本,只有这样才可以调用正确的方法来接收数据。
public void processMessage() {

        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
创建MessageConnection通常有两种方式,一种是按照客户端方式创建,客户端方式创建的MessageConnection只能用于发送短消息。我们需要在URL中提供电话号码和端口,如下:

(MessageConnection)Connector.open("sms://+5121234567:5000");
另一种创建方式是服务器连接,这种连接方式可以用于发送和接收短消息。
(MessageConnection)Connector.open("sms://:5000");

2.        发送短消息
通过MessageConnection提供的newMessage()方法,我们可以创建Message对象,通过指定短消息类型为BINARY_MESSAGE或者TEXT_MESSAGE可分别得到二进制和文本类型的消息对象。如果我们是使用客户端连接,那么在我们创建MessageConnection的时候,传入的URL将作为Message对象的目标地址。如果我们是使用服务器连接,那么我需要使用setAddress()方法设置目标地址。下面的代码说明了如何发送短消息。
   String address = destinationAddress + ":" + smsPort;

   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的类型是二进制还是文本,只有这样才可以调用正确的方法来接收数据。
public void processMessage() {

        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

JAR破解原理 JAR破解原理首先来了解下利用java实现短信发送的原理,这个使用的是j2me可选Wireless Messaging API(WMA,JSR120)来进行操作的,这是个敏感API,在未取得授权或认证,使用之前必须提示使用者是否要进行操作。对于有的型号的手机可以直接设置程序是否可以进行短信操作。所以一般来说,不会出现无缘无故发出短信而扣费的情况,除非你设置了总是允许操作这项(相信没几个人会这么 阅读详情

相关推荐

J2ME规范体系介绍(JCP & JSR)

来源: Porting Fans — 手机软件开发与移植   在国际上,有一个由Sun主导的标准化组织JCP(Java Community Process),该组织根据领域的不同,分为三个大的工作方向,即J2EE,J2SE和J2ME。而J2ME领域的标准的制定者,括业界知名的运营商,如Vodafone,Orange,中国移动等;终端制造商,如Nokia,Motorola,Sumsung等;提供J

李锐歆的专栏 1082

J2ME概念解析

J2ME,即Java 2 Micro Edition,是SUN公司推出的在移动设备上运行的微型版Java平台,常见的移动设备有手机,PDA,电子词典,以及各式各样的信息终端如机顶盒等等。由于移动终端的类型成千上万,而且计算能力差异非常大,不可能像桌面系统那样仅仅两三个版本的JVM即可满足Windows,Linux和Unix系统,因此,J2ME不是一个简单的微型版的JVM。为了满足千差万别的移动

明军的专栏 947

J2ME短信处理: jsr120

1. JSR120: http://jcp.org/aboutJava/communityprocess/final/jsr120/index.htmljsr120规定的受限SMS Port Numbers 下面的表格给出了jsr120规定的受限SMS Port NumbersPort number Description2805 WAP WTA secure connec

风流浪子的专栏 2821

J2ME内定义的各种规范介绍

CLDC 规范:目前分为 v1.0 JSR 30,v1.1 JSR 139CDC 规范:目前分为 v1.0 JSR 36,v1.1 JSR 218MIDP 规范:分为 v1.0 JSR 37,v2.0 JSR 118IMP 规范:JSR 195FP 规范:JSR 46PP 规范:JSR 62 适用于CLDC设备的规范:Connected Limited Devi

dodream的专栏 1261

J2ME概念解析(转)

J2ME,即Java 2 Micro Edition,是SUN公司推出的在移动设备上运行的微型版Java平台,常见的移动设备有手机,PDA,电子词典,以及各式各样的信息终端如机顶盒等等。由于移动终端的类型成千上万,而且计算能力差...

cuankuangzhong6373的博客 194

SonyEricsson发布更好支持企业级应用的新JSR

作者:mingjava 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=559 J2ME并非只括游戏开发,通过2004年的Java手机游戏大赛和今年的移动Java 3D游戏大赛,索尼爱立信已经确立了自己在游戏开发领域的领导者地位。现在是时候关注J2ME用于企业级应用开发了。        今年索尼爱立信发布了支持四个新J

mobilechannel的专栏 1348

J2ME 参数属性

J2ME 参数属性  记录在这里,方便查阅 部分参数适用于特定平台,供参考。 Basic values: microedition.platform = Nokia7650 microedition.encoding = ISO8859_1 microedition.configuration = CLDC-1.0 microedition.profiles = MIDP-1.

322

[转载]J2ME Wireless Toolkit 2.2 新改进

J2ME Wireless Toolkit 2.2 新改进屡获殊荣的 J2ME Wireless Toolkit 已经成为 J2ME 开发应用程序的事实标准工具。自从 2000 年初次亮相以来,该工具一直在发展以赶上移动 J...

congji3817的博客 195

J2ME Wireless Toolkit 2.2 新改进

屡获殊荣的 J2ME Wireless Toolkit 已经成为 J2ME 开发应用程序的事实标准工具。自从 2000 年初次亮相以来,该工具一直在发展以赶上移动 Java 技术外观上快速改变的步伐。不要被从 2.1 版本以来的小改变所误导。新的工具在四个重要的领域支持 Java Community Process (JCP) 所指定的新的可选 API:3D 图形、多媒体通信、蓝牙连网(Bl

mobilechannel的专栏 1933

如何在J2ME程序里发送和接收MMS

Wireless Messaging API (JSR-120 or WMA) 允许访问J2ME设备上的无线通讯资源来发送文本、二进制和MultiPart消息,MMS 属于MultiPart消息.下边的例子代码说明了如何在J2ME程序里发送和接收MMSpublic void sendMMS()String appID = getAppProperty("MMS-Applicatio

1168

JSR

官网:http://www.jcp.org/en/home/index JSR是Java Specification Requests的缩写,意思是Java 规范请求。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。 有超过300

it_man的专栏 5215

j2me玩自己的手机(有空再改)

3月19日去协亨田林店买了一个索爱K750C,相信大家对这款机子很熟悉了吧。虽然索爱的机子的质量一直是个问题,不过用到现在,感觉还可以。 电池900mh的小了点,我充一次电一般能用两天左右,感觉还是短了点。自动对焦的功能使用效果不是很好,只能谈一般。可惜不支持操作系统现在我们来谈谈和我们有关系的,对java的支持。支持java MIDP 2.0j2me的一些感念:J

gonxi的专栏 3094

J2ME KJava的基础知识面试要点

一:整型(byte,short,int,long) byte 类型为8 位,存储范围为 –2(7)~~~ 2(7)-1,及-128~~127(经过测试的),如果数值超出-128~127这个范围,则 数值会转为-128~127中的一个数值,特别适合于表示网络和文件的字节流. short类型为16位,存储范围为 –2(15)~~~ 2(15)-1,及-32768~~32767,为了节省内存,可使用sh...

jardownload的博客 155

Nokia J2ME系统属性

摘录:Nokia的J2ME系统属性定义    部分参数适用于特定平台,供参考。Basic values:microedition.platform = Nokia7650microedition.encoding = ISO8859_1microedition.configurati

风流浪子的专栏 1515
上一篇: J2ME蓝牙实战入门
下一篇: FC API(JSR 75)简单讲解
mobilechannel
博客等级 码龄22年 36粉丝 431原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值