我是靠谱客的博主 瘦瘦酸奶,最近开发中收集的这篇文章主要介绍使用jsmsengine发送短信息(SMS)使用心得,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

领导要求在开发的系统中添加发送短信的功能,但又不想使用人家的短信服务器(想省钱,哈哈),只好自己开发。上网找了很久,最好找到了一个不错的发送短信的jar包——jsmsengine。它是一个开源的东东,你可以访问http://jsmsengine.sourceforge.net/ 来了解更详细的信息。下面就是我在使用的过程中遇到的一些问题,在这里与大家一起分享。

 

 

 

将jsmsengine_1_2_6-B1下载并解压,可以看到相关的jar包、源码、文档、例子以及一个简单的SMS服务器程序。闲话少说,赶紧在eclipse中新建一个项目将源码和例子引进来,然后又向同事借了个支持AT指令的手机(LG8390),连接到串口上。运行SendMessage.java


//下面是解压后自带的SendMessage.java的原文件


class SendMessage

 

 

 

{

 

 

 

    public static void main(String[] args)

 

 

 

    {

 

 

 

       int status;

 

 

 

       // Create jSMSEngine service.

 

 

 

       CService srv = new CService("com1", 9600);


       System.out.println();

 

 

 

       System.out.println("SendMessage(): sample application.");

 

 

 

       System.out.println("  Using " + srv._name + " " + srv._version);

 

 

 

       System.out.println();

 

 

 

       try

 

 

 

       {

 

 

 

           //  Initialize service. 

 

 

 

           srv.initialize();

 

 

 

           //  Set the cache directory.

 

 

 

           srv.setCacheDir(".\");


           //  Set the phonebook.

 

 

 

           //  srv.setPhoneBook("../misc/phonebook.xml");

 

 

 

           //  Connect to GSM device.

 

 

 

           status = srv.connect();

 

 

 

           //  Did we connect ok?

 

 

 

           if (status == CService.ERR_OK)

 

 

 

           {

 

 

 

              //  Set the operation mode to PDU - default is ASCII.

 

 

 

              srv.setOperationMode(CService.MODE_PDU);


              // Set the SMSC number (set to default).

 

 

 

              srv.setSmscNumber("");


              //  Print out GSM device info...

 

 

 

              System.out.println("Mobile Device Information: ");

 

 

 

              System.out.println(" Manufacturer  : " + srv.getDeviceInfo().getManufacturer());

 

 

 

              System.out.println(" Model         : " + srv.getDeviceInfo().getModel());

 

 

 

              System.out.println(" Serial No     : " + srv.getDeviceInfo().getSerialNo());

 

 

 

              System.out.println(" IMSI          : " + srv.getDeviceInfo().getImsi());

 

 

 

              System.out.println(" S/W Version   : " + srv.getDeviceInfo().getSwVersion());

 

 

 

              System.out.println(" Battery Level : " + srv.getDeviceInfo().getBatteryLevel() + "%");

 

 

 

              System.out.println(" Signal Level  : " + srv.getDeviceInfo().getSignalLevel() + "%");


              //  Create a COutgoingMessage object and dispatch it.

 

 

 

              //  *** Please update the phone number with one of your choice ***

 

 

 

              COutgoingMessage msg = new COutgoingMessage("此处为你要发送的手机号", "Message from jSMSEngine API.");


              //  Character set is 7bit by default - lets make it UNICODE :)

 

 

 

              //  We can do this, because we are in PDU mode (look at line 63). When in ASCII mode,

 

 

 

              //     this does not make ANY difference...

 

 

 

              msg.setMessageEncoding(CMessage.MESSAGE_ENCODING_UNICODE);


              if (srv.sendMessage(msg) == CService.ERR_OK) System.out.println("Message Sent!");

 

 

 

              else System.out.println("Message Failed!");


              // Disconnect from GSM device.

 

 

 

              srv.disconnect();

 

 

 

           }

 

 

 

           else System.out.println("Connection to mobile failed, error: " + status);

 

 

 

       }

 

 

 

       catch (Exception e)

 

 

 

       {

 

 

 

           e.printStackTrace();

 

 

 

       }

 

 

 

       System.exit(0);

 

 

 

    }

 

 

 

}


程序,出现如下错误:

 

 

 

Error loading win32com: java.lang.UnsatisfiedLinkError: no win32com in java.library.path

 

 

 

Connection to mobile failed, error: -11

 

 

 

根据错误提示,引用的一个java在windowns下访问串口的必备动态链接库——win32com.dll,找到这个东东后把它拷贝到JDK安装目录下的bin文件夹下。

 

 

 

这次我没有急于运行程序,首先确定串口是否好用,我打开了系统自带的“超级终端”,然后输入‘at’并回车,程序响应如下:

这说明串口与手机连通正常,并且手机已经可以响应AT指令。

 

 

 

    再次重新运行,等了一会,结果是“Connection to mobile failed, error: -11”。失望,仔细看看程序,首先感觉波特率“9600”是否有问题,不管它,先改了再说,我将它改成“19200”,这次再运行,出现了让人兴奋的结果:


SendMessage(): sample application.

 

 

 

  Using jSMSEngine API 1.2.6 (B1)


ME:

 

 

 

OK


ME:


OK


ME:


OK


ME:


OK


ME:


OK


ME:


LG Electronics Inc.


OK


ME:


LG-G7100 GSM Mobile Station


OK


ME:


352626000138277


OK


ME:


460000705108624


OK


ME:


Revision: (Date: Feb 19 2004, Time: 00:54:52)


OK


ME:


+CBC: 0,0

 

 

 

OK


ME:


+CSQ: 20,0


OK


ME:


OK


ME:


OK


Mobile Device Information:

 

 

 

    Manufacturer  : LG Electronics Inc.

 

 

 

    Model         : LG-G7100 GSM Mobile Station

 

 

 

    Serial No     : 352626000138277

 

 

 

    IMSI          : 460000705108624

 

 

 

    S/W Version   : Revision: (Date: Feb 19 2004, Time: 00:54:52)

 

 

 

    Battery Level : 0%

 

 

 

    Signal Level  : 0%

 

 

 

ME:


OK


ME:


ERROR


ME:

 

 

 

+CMGS: 22

 

 

 

OK


Message Sent!


这个结果令人高兴,正在高兴之余,我就问同事(短信接收人!)是否收到,回答是令人沮丧的——没有。我打开发送短信用的手机,打开发件箱,看到里面有一条为发短信,没有接收人,而且短信内容是一堆乱码。直觉告诉我,这就是刚刚发送的那条短信。但这是怎么回事呢,为什么是乱码?连试了几次都是这样。

 

 

 

没有办法,设置了断点,准备一步步调试,调试过程中没有发现什么问题,我正在纳闷的时候,同事说“收到了短信了”。我赛,高兴啊,直接再运行一遍,结果还是乱码,对方没有收到。只有再调试一遍,一步步执行,调试结束后,同事又说“收到了”。考,折磨我呢,代码一点也没有改动,调试就可以收到,直接运行就收不到。(忍住,没有砸机器)。

 

 

 

冷静下来,仔细想想,是不是执行时间上的问题(现在已经是‘有病乱投医’了),我仔细跟踪了执行过程,在CService.java文件的sendMessage方法中注意到如下代码断:

 

 

 

。。。。。。。。。

serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_SEND_MESSAGE, ""{1}"", "" + j));

 

 

 

while (serialDriver.dataAvailable()) serialDriver.skipBytes(1);

 

 

 

serialDriver.send(pdu);

 

 

 

serialDriver.send((char) 26);

 

 

 

response = serialDriver.getResponse();

 

 

 

                  

 

 

 

。。。。。。。。。


黄色标注的部分引起了我的注意,我感觉可能是这个地方出现了问题,我将代码改成如下:

 

 

 

 

 

 


。。。。。。。。

serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_SEND_MESSAGE, ""{1}"", "" + j));

 

 

 

/** 这是后添加的内容 */

 

 

 

Thread.sleep(500);

 

 

 

/** 这是后添加的内容 */

 

 

 

while (serialDriver.dataAvailable()) serialDriver.skipBytes(1);

 

 

 

serialDriver.send(pdu);

 

 

 

serialDriver.send((char) 26);

 

 

 

response = serialDriver.getResponse();

。。。。。。。。。

 

 

 

 

 

 

 

再次直接运行,成功了,没有出现乱码现象,而且对方收到内容了。终于搞定了。


以上就是我使用jsmsengine过程中遇到的问题和解决办法,虽然现在能够发送短信了,但是为什么会出现这个问题我还不甚了解。在这里写出来与大家分享,希望能够相互交流一下。

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/java_gay/archive/2005/06/22/400381.aspx

最后

以上就是瘦瘦酸奶为你收集整理的使用jsmsengine发送短信息(SMS)使用心得的全部内容,希望文章能够帮你解决使用jsmsengine发送短信息(SMS)使用心得所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部