吴文哲,宫利辉
(1.辽河油田信息工程公司信息化技术部,盘锦 124010;2.辽河油田信息工程公司网络管理维护中心,盘锦 124010)
由于公司要与盘锦电信合作实现小灵通转网及电信号码虚拟运营业务,因此需要开发一个短信系统实现公司负责运营的电信号码的短信发送服务。公司的短信平台服务器通过网络防火墙,利用专线实现与盘锦电信短信网关的对接,进而实现对公司所负责的电信号码提供短信发送服务。
图1 系统业务结构图
将系统分为系统管理、系统监控和系统报表三大模块:系统管理包括资源管理、角色管理、机构管理、用户管理、号码管理、群组管理和短信管理七个模块;系统监控包括项目监控、数据源监控、Action映射监控和用户登录历史监控四个模块;系统报表包括注册时间分布和用户角色分布两个模块。
为了解决系统对权限方面的要求,结合了RBAC(基于角色的权限控制)思想,引入role(角色)的概念,使得用户和权限分离,一个用户拥有多个角色,一个角色拥有多个相应的权限。同时引入resource(资源)的概念,资源可分为URL和FUNCTION(功能)两种,一个权限可以对应多个资源。整个系统中涉及权限管理的数据库部分包括10个表:分别为用户表、角色表、资源表、部门表、用户角色表、用户部门表、部门资源表、角色资源表、资源类型和日志表。
服务器两台:1台数据库服务器,1台业务管理及WEB服务器;网络交换机1台;网络防火墙1台统硬件需要服务器。
表1 硬件配置表
硬件网络拓扑图如图2所示:
本系统开发时选用的集成开发环境是Eclipse,该软件环境是面向对象的、可视化的,简单易学,功能强大,在编写和调试B/S结构的应用程序时非常方便。
图2 硬件网络拓扑图
Jetty目前的是一个比较被看好的Servlet引擎,它的架构比较简单,是一个可扩展性强而且非常灵活的应用服务器。结合Jetty的性能特点和本系统使用特性,系统使用Jetty做业务服务中间件。
从安全性、开放性、可伸缩性、应用模式及客户端支持等多方面考虑,本系统选择了目前比较流行的Microsoft SQL Server数据库。
Maven是Apache提供的一款基于项目对象模型(POM)的开源项目管理工具,是Ant的进化,为项目提供包管理、编译和发布等一系列功能,可以有效地进行分工协作。
界面实现是系统实现的一个尤其重要的环节。因为人机交互界面提供了一个人机对话的有效窗口,一个友好的交互界面不仅能够使用户方便快捷的应用这个系统,而且还可以帮助用户形象地了解系统所具有的各个功能。
根据电信短信网关的要求,企业分配的下发速率最大值是10条/秒,所以在短信发送服务的实现类的实现方法中,我们在短信的循环发送中使用了线程休眠(Thread.sleep(100);)来控制发送速度,来匹配网关的限制。
超长短信拆分,每条短信按140个字节来拆,带上正确的UDH头,终端会自行识别合并,UDH头就是短信内容的前六个字节,所以实际上一条短信扣掉UDH头后实际就只有134个字节,拆分后只要在最后一条短信UDH头后面跟上企业签名,拆分后的第一条或其他条就不需要再跟企业签名了。
在UCS2编码下,每个中文、字母和数字都算成2个字节长度。企业签名“[辽河石油勘探局通信公司]”这26字节,计算在一条短信字节数(140字节)之内,在电信计费服务中记录的实际发送短信条数计算方法如下:
private int getMessageCount(Symessagesend symessagesend)
{
int CdmaMaxLen=140;
int CdmaSplitLen=134;
String msg=StringUtil.stringReplace(symessagesend.getSmscontent());
byte[]b=new byte[0];
try {
b=msg.getBytes(“ISO-10646-UCS-2”);
} catch(UnsupportedEncodingException e){
e.printStackTrace();
}
int msgLen=b.length;
int msgCount=1;
int total=0;
int last=0;
//按分割长度[134]计算
if(msgLen <=CdmaMaxLen){
msgCount=((msgLen+26)> 140)? 2:1;
}
else{
total=(msgLen/CdmaSplitLen)+1;
last=msgLen-(total-1)* CdmaSplitLen ;
if(last+26 <=CdmaSplitLen){
msgCount=total;
}
else{
if(last==0){
msgCount=total-1;
}
else {
msgCount=total;
}
}
}
return msgCount;
维生素A:应注意维生素A的适量补充,过量有中毒的危险。摄入普通食物一般不会引起维生素A过多,绝大多数是因为过多摄入维生素A浓缩制剂引起。我国孕妇维生素A的推荐摄入量,孕早期为每天700微克视黄醇当量(2333国际单位),孕中晚期为每天770微克视黄醇当量(2566国际单位),可耐受最高摄入量为每天3000微克视黄醇当量(10000国际单位)。
}
编辑短信时输入的常用特殊字符(主要是标点符号),需要在后台把以&开头的字母组合或以开头的数字组合转换为特殊字符,部分处理代码如下:
public static String stringReplace(String srcString){
srcString=srcString.replaceAll(“ ;”,” “);//空格
srcString=srcString.replaceAll(“&;”,”&”);//&符号
srcString=srcString.replaceAll(“";”,”””);//”符号
srcString=srcString.replaceAll(“© ;”,”@”);//版权符号
srcString=srcString.replaceAll(“&apos;”,”’”);//单引号符号
srcString=srcString.replaceAll(“&ul;”,”_”);//下划线符号
srcString=srcString.replaceAll(“&shap;”,”#”);//#符号
srcString=srcString.replaceAll(“&ques;”,”?”);//?符号
srcString=srcString.replaceAll(“&ldquo ;”,”““);//“符号
srcString=srcString.replaceAll(“&rdquo ;”,”””);//”符号
srcString=srcString.replaceAll(“&hellip ;”,”…”);//…符号
srcString=srcString.replaceAll(“&mdash;”,”—”);//-符号
srcString=srcString.replaceAll(“&lsquo ;”,”‘“);//‘符号
srcString=srcString.replaceAll(“&rsquo ;”,”’”);//’符号
srcString=srcString.replaceAll(“' ;”,”’”);//’符号
……
return srcString;
}
在短信发送服务实现类的发送方法中,当有短信需要发送时,打开本地服务到电信网关服务的socket连接,发送后保持长连接,实时接收网关的消息包(短信应答、短信状态报告等),同时将已经发送的短信标识字段入库,利用Runnable线程实现类的run方法,循环接收短信状态报告,当所有已经发出的短信状态报告全部接收完毕或者客户端连接断开(session关闭)后(以两个时间最早者计算),关闭socket连接。这样做的好处是,及时关闭短信发送状态循环检测,及早降低服务器的cpu使用率,防止服务器卡死;减少服务器的内存用量,防止程序内存泄漏带来的系统宕机等灾难性后果。
本文以在辽河石油勘探局通信公司网管维护中心工作期间开发的项目为基础,设计了这个基于中国电信短消息网关协议开发的短信发送系统,并在实际使用中对用户登录、填写短消息并提交发送、字符过滤、长短信拆分和系统管理员查看日志等功能进行测试,各项功能均能实现。希望本论文所写的设计方案对相关方面的开发设计有所借鉴。