科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Push信息自动启动JAVA移动程序

Push信息自动启动JAVA移动程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

摘 要 有些时候,对于一个企业级移动应用程序,从服务器将信息推向移动设备,并且自动激活一个已安装的移动应用程序使其进行必要的处理是非常重要的。由短信服务(SMS)作为推信息的协议。

作者:中国IT实验室 来源:中国IT实验室 2007年9月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

按照如下的步骤来完成服务器的编码和部署:

1.从SMSLib网站下载SMSLib代码。下载时,确保你下载的是SMSLib-Java-v1.0.1.zip。SMSLib for Java可以跟Java通信API或RxTx一起使用。最近,Sun撤消了了对Java通信API Windows版的支持,所以使用RxTx会更好。但如果你已经有了Java通信API,你同样可以用它和SMSLib一起运行。在这篇文章中,我将详述以上两种运行实例程序的方法。

2.以Java通信API 2.0作为开始,首先,确保你已经正确安装了API。解压javacomm20-win32.zip。在commapi子目录中,你将找到如下文件:
        javax.comm.properties
        win32com.dll
        comm..jar

把javax.comm.properties拷贝到你的Java运行时环境的lib目录中。把win32com.dll拷贝到你的JRE的bin目录中。当运行任何使用SMSLib的程序时,确保comm.jar在classpath中。

为了保证Java通信API被正确的安装了,从命令框中进入到commapi\samples\BlackBox目录中。按如下方式设置PATH变量:以我为例,JRE的家目录为C:\j2sdk1.4.2_03\jre。根据你的JRE设置做相应的改变。

设置PATH=.;c:\j2sdk1.4.2_03\jre\bin;。现在,使用如下命令来运行Java 黑盒程序:
java -classpath .;../../comm..jar;BlackBox.jar; BlackBox。

如果Java通信API被正确的安装了,那么如图15所示,会出现一个显示你机器的可用串口(COM端口)的Swing窗口。关闭窗口之后,命令框将会包含一些跟你可用的COM端口相关的行,如下面的示例命令提示输出所示。记住,依赖于你的PC上的可用端口,Swing窗口和命令行提示的内容可能会有变化。但重要的是,如果你能够看到GUI和在命令提示框中的如下行(就象下面所示),你可以假设Java通信API已经正确安装了。在这个测试之后,关闭Swing窗口来中止黑盒程序。

image
图15. 测试Java通信API的安装

实例命令提示框输出:
COM1:  PORT_OWNED
COM2:  PORT_OWNED
Closing port 1 (COM2)
Closing COM2
Closing port 0 (COM1)
Closing COM1


3.现在,是时候把GSM调制解调器连接到你的电脑上了。我使用一部Nokia 6600移动电话作为GSM调制解调器。Nokia 6600没有串口连接器(COM端口连接器)。但是,它提供了红外线技术连接到电脑,然后作为GSM调制解调器。如果你有一部有串口直接连接器的电话,那样使用起来会更简单。一般地,        实际的GSM调制解调器会提供串口连接器。但是如果你的设备缺少串口连接器,但包含一个内置的GSM调制解调器并能使用红外线或蓝牙技术连接,这种选择也能起作用。

为了在没有物理COM端口的情况下,在功能上实现COM端,你必须将一个虚拟的COM端口映射到你的红外线或蓝牙连接上。SMSLib需要一个兼容的GSM电话或GSM调制解调器。如果提供了调制解调器的能力,大多数GSM电话都能被使用。SMSLib使用串行连接(物理或模拟,比如蓝牙,红外线,USB等)来与GSM调制解调器通信。通过Nokia 6600, 你可以使用SMSLib来发送SMS消息,但是因为Nokia 6600把传入的消息储存在记忆卡里而不是SIM卡中,使用这种模式将不能接受到这些消息。同样,Nokia 6600不允许从记忆卡中使用AT指令来读取消息。但是,我们仅仅需要发送SMS消息来激活我们的MIDlet,Nokia 6600能够成功的完成这些(不需要接收SMS消息)。对于使用红外线或蓝牙技术连接的电话来说,最重要的是将红外线或蓝牙连接映射到一个虚拟COM端口。参考你的移动电话的文档,查明它是否支持虚拟COM端口映射。

以我为例,我在我的PC上安装了Nokia PC 套件。为了从我的PC连接Nokia 6600,我使用一个外部USB红外适配器。因此,为了这种情况,我也在PC上安装了红外线驱动。

现在,我用PC上的USB端口连接到外部红外适配器。在Nokia 6600设备上,我选择菜单,然后连接,然后调制解调器。通过红外线连接的选项在调制解调器下面。现在,我选择选项“连接”,并把移动电话放在红外适配器的有效范围之内。

4.下一步是验证从PC,我们能够使用AT指令访问GSM调制解调器。为此,选择开始菜单,然后程序,然后附件,然后通信,然后超级终端。会打开一个对话框,并请求一个逻辑名称。提供任何你愿意提供的名字。为了方便,我提供名字“GSM Modem”。选择OK。

image
图16. 打开超级终端

5.另一个弹出窗口出现。在使用连接的下拉菜单中,选择COM端口名称(虚拟的或实际的),GSM调制解调器将通过此端口连接到PC。以我为例,是COM4。

image
图17. 在超级终端中选择COM端口

6.在下一个对话框中(COM端口的属性),只需单击OK。

7.现在,你会被带到一个窗口,你将在此窗口中输入一些命令(以我们为例,我们将输入AT指令)。输入如下命令来测试连通性-但是记住,当你输入指令的时候,不会在控制台中写入任何东西:AT+CPMS=?。

要点:不要在超级终端中输入任何未知的命令。这可能会永久性损坏你的移动设备或擦去所有的数据。

如果一切顺利,你将能看到一些输出,如图18所示。输出可能会不尽相同,但是没有输出,输出错误,或终端没有响应都代表这连通性的错误。

image
图18. 在超级终端中执行AT指令

8.现在从呼叫菜单,使用断开连接命令从超级终端断开连接。

9.完成了如上的步骤后,我们可以准备写Java示例程序了。此程序将发送SMS消息到我们刚才配置的的GSM调制解调器的指定端口上:

import org.smslib.*;

public class SendMessageWithPortsSMSLib {
   public static void main(String[] args) {
      CService srv = new CService("COM4", 9600, "", "");
      System.out.println("SendMessage(): sample application.");
      System.out.println("  Using " + srv._name + " v" + srv._version);
      try {
         srv.setSimPin("0000");
         srv.connect();
         srv.setSmscNumber("");
         COutgoingMessage msg =
            new COutgoingMessage("+9198301...", "Message from smslib API.");
         msg.setMessageEncoding(CMessage.MESSAGE_ENCODING_7BIT);
         msg.setSourcePort(0);
         msg.setDestinationPort(50001);
         srv.sendMessage(msg);
         srv.disconnect();
      }
      catch (Exception e) {
         e.printStackTrace();
      }
      System.exit(0);
   }
}


在如上的代码片断中,我们首先使用4个参数来创建类CService的一个实例。第一个参数为COM端口的名称。(以我为例,这里是COM4,因为我的GSM调制解调器是连接到一个虚拟的COM端口的。确保根据你的COM端口名称来改变这里的值。)第二个参数指定波特率。当调制解调器连接时你会发现这一限制。第三个参数指定移动/GSM调制解调器的构成。第四个参数指定模式。在一个特定的构成和模式需要不同的AT指令集来与GSM调制解调器交互的地方,第三和第四参数有时启动很重要的作用。例如,对于Sony Ericsson模式,需要一个不同的AT指令集和逻辑;因此,伴随着jSMSEngine发行版,你能找到一个单独的对于Sony Ericsson的处理包。对于特定类型的构成和模式,jSMSEngine有不同的处理包。对于Nokia,缺省的处理包对于Nokia 6600 和我们的目的已经足够好了。因此,我没有对第三和第四个参数指定任何值。

CService被初始化之后,我们使用connect()方法连接到GSM调制解调器。我们设置SMSC数字(SMS中心数字)为空。这会被SIM卡得到。在那之后,我们使用类CoutgoingMessage()创建一个发出的消息。COutgoingMessage()的构造函数需要两个参数:发送消息的设别数字和消息本身。在一个典型的实际的应用程序中,一些类似于数字代码的指示符会被作为SMS消息发送;根据那个代码,在MIDlet端会发生一些动作。另外一个要点是setDestinationPort()方法,在这里我们设定目标端口。

图19展示了详细的建立过程。

image
图19. 详细的建立过程

重要注解:SMSLib在CLogger.java中使用了J2SE 5.0的API。CLogger.java中有一行使用PrintStream的构造函数,并用java.io.File类型作为参数。这个PrintStream类中的构造函数从J2SE 5.0才有支持。但是由于我使用J2SE 1.4,我把那一行从:stream = new PrintStream(new File(filename)); 改成:stream = new PrintStream(new FileOutputStream(filename));

改变之后,我构建了SMSLib提供的源代码,并创建了新的JAR使用JRE 1.4.2。

10.为了编译示例程序,确保在你的classpath中有新的JAR(是你在修改CLogger代码后生成的)和comm.jar。然后编译示例应用程序。

11.编译完成之后,运行应用程序。确保之前步骤提到的JAR在classpath中。如果一切顺利,你能够看到你安装在另外一个设备中MIDlet已经自动启动了,并显示你的消息。

现在,让我们看看如何使用RxTx来代替Java通信API 2.0。你可以从SMSLib下载RxTx。当使用RxTx的时候,我们需要注意如下几点:

1.拷贝RXTXComm.jar到(JDKDIR)\jre\lib\ext目录,拷贝rxtxSerial.dll文件到(JDKDIR)\jre\bin目录。
2.为了使用,SMSLib同Java通信API一起打包,但是进行一小部分的代码修改,我们也能让它跟RxTx一起使用。为了让SMSLib同RxTx一起使用,修改CSerialDriver.java并删除行javax.comm.*;。添加行import gnu.io.*;。然后重新生成。
3.RxTx也支持Win32。当我写这篇文章的时候,RxTx能很好的支持物理串行连接,但是对于“虚拟”串行端口则有些例外,例如,通过蓝牙/红外线/USB连接模拟串行端口。但是,在显示生活的情况中,你不会使用一个移动电话作为调制解调器,而是一个真实的GSM调制解调器,它将通过真实的COM(串行)端口来连接。这将不会成为问题。现在,以我为例,在发送SMS消息时我接受到了一些错误,因为我的红外线连接有一个虚拟的端口映射。为了消除那些错误,我在CSerialDriver中注释掉了一些行。特别的,找到outStream.flush();,注释掉,然后重新生成。
4.现在,按照上面列表中的步骤3开始。在步骤11中,确保当运行SendMessageWithPortsSMSLib的时候,在你的classpath中有最近生成的JAR(对于RxTx的改变),同时保证使用RXTXcomm.jar和rxtxSerial.dll文件代替Java通信API的comm.jar和相应的dll文件。

注意的要点:因为SMSLib使用Java通信API,或者RxTx,这些会对操作系统进行本地调用,我建议不要将这些代码直接嵌入到应用程序服务器或Web服务器。一个可选的解决方案是将这些代码嵌入到一个单独的RMI(远程方法调用)服务器或Web service服务器,然后从应用服务器来访问他。但是,因为我们使用GSM调制解调器,SMS的发送速度很低;所以如果我们直接调用接口(RMI或Web service),最好使用异步设计。例如,当你试着发送一条消息到设备,将必须的信息(移动号码,端口,消息等)放到一个Java消息服务队列中。写一个消息驱动的bean来采集消息,然后使用一个Web service来调用服务(嵌入在SMS发送代码中)。

我谈到了一种可行的方式;你可以选择任何最适合你的架构的设计。但是当做任何决定的时候,紧记如下两点:

使用GSM调制解调器,发送SMS消息的速度不是很快(依赖与你选择的GSM调制解调器和SMS服务提供商)
SMSLib使用Java通信API或RxTx,这将对操作系统发生本地调用

虽然我建议使用两个Nokia 6600移动设置(一个作为GSM调制解调器,另一个作为Java ME客户端),你可以仅仅使用一个来测试此行为。首先,把MIDlet安装在设备上。然后使用相同的设备作为GSM调制解调器。当发送SMS消息时,把消息发送到与你作为发送消息的GSM调制解调器的移动设备相同的移动号码上。在这中情况下,发送者和接收者移动电话是相同的。

总 结
在这篇文章中,你学到了如何使用push注册特征来写Java ME应用程序。同时,你也学到了如何从服务器发送一条SMS消息,然后自动启动MIDlet。为了仅仅测试push注册特征,你可以使用两部支持MIDP 2.0和WMA1.1的手机(不需要服务器端SMS push),和Sun Java Wireless Toolkit提供的SMSSend和SMSRecieve示例程序。但是在实际应用程序中,你可能需要从服务器发送SMS消息,而不是从另一个MIDlet。

在本文中展示的代码片断不是很复杂;搭建环境的步骤却很复杂。但是一旦正确地搭建了环境,你会很兴奋的看到使用服务器端SMS push,push注册特征在真实的设备上运行。如果你在使用SMSLib时遇到任何问题,你总是可以发布问题和向SMSLib用户组请求帮助。最后,我要感谢SMSLib项目的所有者Thanasis Delenikas分享了一些关于SMSLib最近开发中的有价值的信息。

关 于 作 者
Srijeeb Roy拥有印度加尔各答Jadavpur大学计算机科学和工程学的学士学位。他目前作为技术架构师,在Tata Consultancy Services Limited公司的一个基于Java EE的项目中工作。他在Java/Java EE的领域中工作了6年以上,在IT工业拥有总共多余7年的经验。他为他的公司和客户开发了多个Java的内部框架。他也工作在多个其他的领域,比如Forte,CORBA和Java ME。

资  源
下载文章中的源代码:
http://www.javaworld.com/javaworld/jw-04-2006/push/jw-0417-push.zip
下载Sun Java Wireless Toolkit:
http://java.sun.com/products/sjwtoolkit/
下载SMSLib:
http://smslib.org/
RxTx主页:
http://rxtx.org/

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章