摘 要 本文使用java串口通信技术和jsp技术,对已有的短信系统进行研究,分析系统存在的问题,改善系统提取短信方法、提高系统性能、实现定时发送短信功能,并应用于windows平台下的web系统中。
关键词 串口通信;手机短信;管理信息系统;jsp
1 引言
随着移动通讯的发展,移动办公提供随时随地服务正成为当今信息技术发展的重要方向。以短信为基本服务平台的服务渠道正被越来越多商家所采用。手机短信的行业应用越来越广泛,它具有快捷、经济、针对性强、可移动等优点。很多行业的企业用户都希望能够利用web系统提供的手机短信服务功能来发布企业信息。如:客户联络、新产品通知、会议通知、紧急通知、催费通知、发货通知、订单查询、节日问候等,从而达到提高办公效率、降低办公成本的目的。
2 问题分析
目前在pc上实现手机短信收发技术主要有三种:
(1)直接接入运营商短信网关,这种方法的实现不需要附加新的硬件,但是需要到运营商申请网关,适合于大型通信开发,如向移动、电信等公司申请,使用起来比较方便,但费用较高。
(2)通过一些网站上提供的短信发送功能来实现,如腾迅、网易等都提供这方面的服务,这种方法实现起来比较简单,所需资源较少,但缺点是对网络的依赖性太强,不利于集成到企业的mis系统中。
(3)用gsm modem技术实现pc对手机收发信息,这是目前比较适合于小项目开发的一种方法,只需要对at指令和串口编程的知识运用熟练就可以实现,但需要硬件gsm modem的支持。
当前,一些公司提供了短信开发的设备和配套的短信群发软件,用它可以在软件中集成相应的群发功能,虽然实现了发送短信的功能,但由于是单机版的,不利于远程操作和多用户的同时使用;也有一些基于web的短信系统开发出来了,实现了手机短信的发送,但在手机短信的接收方面仍存在不足:如很多系统都是通过不断刷新页面来判断是否收到有新的信息,这种方式使得系统效率下降,需要改进。另外,在目前已开发出的短信系统中尚缺乏定时发送短信功能,此功能的实现,可以为用户的日程安排提供短信提醒服务。
基于以上因素,可以设计并实现一种b/s模式的短信系统,此系统在一种能通过输入设备与服务器直接通信的mvc体系结构下构架,使用gsm modem以串口监听方式触发事件的方式接收短信以提高系统的性能,实现定时发送短信功能以满足更多用户的需求。
3 系统体系结构
基于j2ee的web式信息管理系统技术现已比较成熟,如struts框架、model i体系结构、model ii体系结构都可实现。本文体系结构是基于j2ee的mvc结构,实现一种能通过串口设备实现向系统进行输入输出的系统结构,如图1所示。
图1 系统体系结构
在传统的web系统中,服务器的响应都是由客户端经http协议传输的数据服务请求,实现对web资源的使用。本文的系统体系结构构架web系统,除了能响应基于http的数据请求外,还可通过与该服务器连接的gsm modem实现服务的请求,使得系统的信息传递更快捷,实现可移动性特点。
采用该体系结构构架web系统,用户可以通过http协议向应用服务器请求数据处理,当服务器得到客户端的请求数据后,控制器(servlet)进行事务处理,模型(javaben)执行操作,如信息的查询和保存等操作,最后通过视图页面传回给用户。
同时,用户也可以通过手机发送数据给服务器,实现数据的处理。用户发送信息向服务器请求服务,首先将信息给gsm modem,然后服务器通过与该设备连接的串口获取数据,实现事件的响应。实质上,gsm modem就是服务器的一个输入设备,相当于键盘,起数据输入的作用。信息的接收,就是设计程序让服务器自动检测这个输入设备是否“输入”了数据。
同理,对该体系结构应用的推广,所有输入设备与服务器作为一体构架网络服务器,实现web服务,如应用于基于web的工业控制系统、电压测试系统等。
4 系统功能
短信系统的主要功能有写短信、发件箱、收件箱、电话簿、统计查询和常用语的插入等,其功能模块如图2所示。
图2 系统功能模块
写短信可以实现短信的单发和群发功能,无论是单发还是群发,发送对象都可以自由选择,当发送对象选定后,系统查找数据库中该号码多对应的记录信息自动生成称呼,然后将其要发送的内容一起发送给所选对象。
发件箱用来存储用户所发的所有短信信息,以便用户以后查看自己发送的短信,可实现对短信的管理,如转发、删除等。
收件箱用来存储用户所接收到的短信,该模块除了实现短信的管理,如对短信的删除、查询等功能外,还提供短信回复功能,实现系统自动回复,在服务器收到用户短信后对数据进行处理,然后自动回复给用户;另外是用户回复,通过系统身份验证后,用户可对收到的短信进行回复。
电话簿实现用户对联系人的管理,如新增联系人、实现联系人的分组等操作。
定时发送短信功能,可为用户的日程安排提供帮助,如通过短信提醒参加会议、为朋友发送生日祝福短信等。用户设定短信发送的具体时间,输入将发送的信息并保存,在到达这个时间时,服务器自动将信息发送出去。
查询统计是管理员实现查看指定用户发送信息的数量等操作。
常用语管理实现快捷的输入,用户可编辑常用的短信内容并保存,在发送时可直接调出。
5 系统实现
jsp、servlet技术和数据库技术在web应用程序开发中的大量普及和应用,使得系统中写短信、查询统计、常用语等模块的实现变得非常容易。
5.1 收发短信
当前,采用的收发短信方法主要是在服务器端使用定时刷新页面或通过定时器来实现。此方法是在每间隔一定时间,服务器扫描串口并读取串口中的数据,然后确认是否解收到新数据。这虽然实现了信息的接收,但增加了服务器的开销,无论是串口有无新数据,服务器都定时读取数据,这便增加系统的负担,从而将低了系统的性能。
基于串口监听的方法接收数据,即当串口有新数据接收时产生监事件,通过事件驱动来“通知”服务器,然后取得手机发送过来的信息,从而进行处理和响应事件。这种方式的实现,其优势主要体现在节省系统资源和数据接收的及时响应。
对串口监听,即当收到数据立即响应事件,这与java application程序中的动作监听(actionlistener)类似。在实现手机信息的接收过程中,可由类serialport中addeventlistener (this)方法侦听,当收到数据时产生事件,主要代码如下:
public void serialevent(serialportevent e) {
stringbuffer inputbuffer = new stringbuffer();
int newdata = 0;
switch (nttype()){
//data_available - 有数据到达,
case _available :
//读取数据信息,使用javabean中的模型进行数据处理
while (newdata != -1){
try{
newdata = ();
if (newdata == -1){
break; }
if ('\r' == (char) newdata){
('\n'); }
else {
((char) newdata);}
}catch (ioexception ex) {
n(ex);
return;}
}
operatemsg(new string(inputbuffer));//调用对数据进行处理的方法,
//new string(inputbuffer)为接收到的内容
break;
case ://bi - 通讯中断.
}
}
向手机发送信息,调用sendmsg()方法,在此方法的设计中,使用serialport类中的getoutputstream()初始化outputstream类的对象outstream,该对象的write()方法将数据写入串口。
public void sendmsg(string msg, string phonenumber){
getserialport(); //打开串口
setupserialport(); //初始化串口
try{
("ate 0\r"); //测试modem
("at+cmgf=1\r"); //将信息设置为text模式
("at+cscs=\"gsm\"\r",); //将字符设置为ucs2模式
("at+csmp=17,167,0,240\r");//设置短信发送的相关参数
if(!("") && !("")){
("at+cmgs=" + phonenumber + "\r",);
(messagestring);
((char) 26);
}
}catch (ioexception ioe){}
closeiostream();
closeserialport();
settonull();
}
以上两个函数分别实现了短信的收发功能,但在进行数据接收时,由于短信编码与字符编码不同,所以需要将编码进行转换。本文采用短信编码的text模式
[1]。
5.2 定时功能的实现
收发短信的实现,虽然为信息管理系统增加了新的功能,但还不能满足其应用的需要,尚需要在系统中新增更多功能。以下实现的是在系统中定时发送短信功能,如定时为某用户发送信息。
当web工程启动时,必须能让定时器宿主的存活期为整个web工程生命期,在工程启动时能自动加载运行。结合这两点,确定使用servlet上下文有关的侦听器实现定时功能,通过在工程的配置文件中加以合理配置,会在工程启动时自动运行,并在整个工程生命期中处于监听状态。
通过servlet侦听器与timer的结合,运用servlet侦听器需要实现tcontextlistener接口,同时实现它的contextinitialized(servletcontextevent event)和context destroyed(servletcontextevent event)两个接口函数。程序实现代码如下:
public class timerlistener extends httpservlet implements servletcontextlistener {
public void contextinitialized(servletcontextevent sce) {
//开始监听,在此部分编写定时功能的程序
smsmanager[] sm=new smsmanager[10000];
for(i=1;i<10000;i++);
//初始化任务
timer t=new timer();
i=0;
mytask mt = new mytask(sm); //自定义任务类
//该类run()方法执行发送短信
le(mt,0,1000); //每秒钟检测一次
}
public void contextdestroyed(servletcontextevent sce) {
//定时器的销毁
}
}
实现短信定时发送的具体方案中,将预发内容、时间、手机号码、用户等信息保存在数据库中,当预发时间与当前系统时间相同时,将内容自动发送到指定手机中。于是,在实现时,时刻都要取出数据库中的时间进行比较,这将大大地增加系统的开销。为了减少频繁的访问数据库,降低系统开销,本文是使用动态链表实现。
首先将预发的内容、时间等信息封装成类smsmanager,然后由该类创建对象数组,数组的长度可根据系统的用户量决定,并由数据库中未发标记的记录按时间对每个数组元素初始化。功能的实施,就是通过对数组元素依次访问,当数组每个元素全部访问,系统再重新自动初始化数组对象。若有在当天预发的情况,则可用插入算法,按照时间链插入在数组中。
6 结语
本系统作为某高校学生成绩管理系统的一个子系统,实现了学生的短信查分、教学通知等服务,还为教职工的日程安排、会议通知等提供短信服务,这节省了学校的日常通讯费用,也提高了教务部门的工作效率。
参考文献
[1] 潘旭兵,林中.短信收发系统[j].电脑编程技巧与维护.2007(5):44-49
[2] william crawford,jonathan kaplan著,刘绍华,毛天露译.j2ee设计模式[m].
中国电力出版社,2005
[3] deepak alur,john crupi,dan malks著,刘天北,熊节等译.j2ee核心模式(第二版).机械工业出版社,2005
[4] 郭文生,杜军平,尹怡欣,基于j2ee的旅游电子商务平台的设计研究[j].计算机应用与软件.2007(2):118-120
[5] 陈军,段良辉.基于j2ee的通用web信息系统框架设计与实现[j].计算机系统应用.2007(1):6-9
[6] liang著,王镁,李娜等译,java语言程序设计[m],机械工业出版社.2004
本文链接:http://www.qk112.com/lwfw/jsjlw/jisuanjiyingyong/244176.html