分享
 
 
 

使用jsmsengine发送短信息(SMS)使用心得!(原创)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

领导要求在开发的系统中添加发送短信的功能,但又不想使用人家的短信服务器(想省钱,哈哈),只好自己开发。上网找了很久,最好找到了一个不错的发送短信的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过程中遇到的问题和解决办法,虽然现在能够发送短信了,但是为什么会出现这个问题我还不甚了解。在这里写出来与大家分享,希望能够相互交流一下。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有