一种分布式短信报警服务系统的设计

2019-09-23 06:14
无锡职业技术学院学报 2019年3期
关键词:气象部门调用指令

张 智

(无锡职业技术学院 人事处, 江苏 无锡 214121)

1 背景

为了保障社会生产和人民生命财产的安全,国家气象部门陆续在全国各地部署了几万套气象观测站,并且更多的气象观测站正在逐步按规划部署中。通过观测站输出的历史和实时信息,人们可以对各种天气情况做出预判和实时灾害预警处理。因此,设备持续正常工作对数据的及时性和准确性显得尤为重要。

在正常的气象业务值班过程中,技术人员经常需要24小时守候设备或业务应用程序的运行,当出现故障的时候立刻去排查原因并解决。一方面人员疲劳使得工作效率不高,另一方面无法保证将异常的信息及时反馈给相关的维护人员。

得益于通信技术的快速发展,手机短信服务由于其快速、稳定、可靠和准确的特点应用到各行各业的生产和生活中。在气象部门中由于许多业务需要实时监控和故障排查,因此短信服务在气象业务中被广泛地应用于报警和维修保障活动中。每个地区的气象部门短信服务功能和实现方式不尽相同,没有统一的规范并且缺乏通用性,导致重复开发和浪费资源的情况,极大地限制了短信服务的效用。为了方便省、市县各级气象局用户方便使用统一接口的短信服务,做到系统资源集约化,迫切需要一套整体规划的短信服务系统,为设备的正常运行和数据的可靠稳定接收提供保障。

2 系统结构

2.1 微服务结构

分布式服务是将不同的服务或程序部署在不同的机器上,各个服务通过Webservice接口或RPC协议实现相互通信与调用。微服务是一种特殊的分布式架构,它的粒度更小,切分后的各个服务之间的耦合性更低。每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上。

针对现有的气象业务应用,从多级行政单位的实际情况统筹考虑,基于微服务的思路将原有的短信报警系统切分成粒度更小的单元,让每一个单元专注做好一件事情。每个单元可以独立开发并独立部署,单元之间通过与语言无关的API进行集成。通过这样的设计可以尽量对以前的系统不做改动,实现了气象业务功能的精简和资源的集约化使用。

2.2 短信报警的实现

实现短信发送报警信息的功能一般有两种方案:第一,通过短信猫或类似具有短信发送功能的硬件模块进行短信发送;第二,利用互联网上提供的免费或收费短信服务接口。通过短信猫发送方案的优点是稳定、可靠、开发和使用不受限制,缺点是需要硬件和额外重复的开发成本。利用现有的互联网短信接口发送短信的优点是开发成本小并且使用方便,缺点是提供的服务和功能由服务提供方准备,扩展性不强并且需要使用方必须能够接入互联网。在气象部门中,使用第一种方案的情况较多,因为省、市、县各级部门的短信服务之间相互独立,没有交互。

2.3 分布式结构的短信服务

由于上文所述的两种方案都有一定的缺点,如果将两种方案进行整合和改进,并采用分布式部署的方式进行开发和调用,即可使得短信服务的使用方和提供方都具有很好的扩展性和易用性,极大地提高短信服务在气象部门的应用范围。图1为分布式结构的短信发布和短信使用结构图。

整个系统由3个部分组成:短信内容生产方、短信服务使用方和短信服务提供方。其中短信服务提供方由短信猫和短信服务器组成,短信服务器

图1 短信服务分布式部署

通过AT指令控制短信猫设备完成短信的收发功能,并将该功能封装为WebSevice接口供短信使用方调用。短信内容生产方为气象局内原有的各种业务程序,每种程序都有需要监控和报警的内容。短信内容生产方将需要发送的报警内容放入短信内容队列中,由短信服务使用方取出并调用短信服务方提供的接口发送短信。

在部署时,短信服务器作为一个单独的部件运行,将短信服务的生产者和短信服务的消费者分开,解除了它们之间的耦合关系。各个短信服务的使用方无需重复投资搭建短信发送框架,只需按照服务提供方规定的短信接口进行调用即可完成短信的收发服务。短信生产方只管生成短信内容即可,由谁发送,怎么发送都无需关心。

3 系统实现

3.1 系统的功能与特色

(1) 系统支持将短信发送功能作为接口发布出来供调用方使用,将短信发送功能与使用分隔开。

(2) 短信服务提供方支持向多个短信接收方发送短信,并且对调用方的身份进行认证,防止未经授权的调用方使用服务。

(3) 消息的生产方与使用方相分离,生产方无需了解消息发送的细节,只需关心自己的业务逻辑。

整个系统基于微服务的思想,将整个业务流程拆分成多个物理上相互独立的子模块。这些子模块可以部署在一台系统中,也可以分布式地部署在不同的电脑上。开发编程工具使用Java语言,选择Tomcat作为Web应用服务器(即文中的短信服务提供方)。

3.2 短信服务接口

短信服务方和短信使用方部署在不同的机器上,并且不在同一个局域网内。因此,它们之间需要通过约定的协议进行通信,短信使用方能够利用短信服务方提供的接口进行工作。

短信服务接口采用Web服务发布调用接口,支持HTTP POST和GET方式提交请求。URL格式为http://IP地址:端口号/msg/send?username=用户名&password=密码&sendto=接收短信的手机号&message=短信内容&priority=优先级&sessionID=序号。

其中IP地址和端口号是短信服务提供方暴露出的访问地址,用户名和密码在短信提供方处进行验证,验证通过后方能调用短信发送接口。为了防止用户名的泄露,在短信服务提供方处可以进行IP地址和使用次数的绑定。接收短信的手机号可以有多个,用分号隔开;短信内容采用UTF-8编码格式发送;priority表示本次短信内容的发送紧迫程度,数值越大就越紧迫;sessionID表示本次发送的序号。如访问地址“http://192.168.2.23:8080/msg/send?username=yth&password=yth&sendto=13836327980;15923247909&mess-age=网络通信故障请及时检修&priority=0&sessionID=12345678” 表示yth用户向短信服务提供方发送一个向13836327980和15923247909手机发送短信内容为“网络通信故障请及时检修”的请求。短信发送成功后返回本次sessionID对应的内容是否发送成功,由短信服务使用方决定是否再次发送。

后端采用Servlet对Http请求进行相应的处理,解析短信使用方请求中的各种参数并将参数传递给短信发送模块。Servlet的原理图如图2所示,客户端向Web服务器发送请求,Web服务器将请求发送给Servlet,Servlet容器会产生一个Servlet实例然后构建一个响应并将其传给Web服务器,Web服务器将响应结果返回给客户端。

图2 短信服务端Servlet处理流程

关键代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获得短信使用方发送来的各种参数信息

String username = request.getParameter("username");

String password = request.getParameter("password");

String sendto = request.getParameter("sendto");

String message = request.getParameter("message");

String priority = request.getParameter("priority");

String sessionID = request.getParameter("sessionID");

response.setCharacterEncoding("utf-8");

response.setHeader("Content-type", "text/html;charset=UTF-8");

//验证身份

......

//调用发送短信的模块

SendMsg(sendto,message);

......

}

3.3 短信生产接口

短信内容生产方即气象部门原有的各种业务软件,这些软件产生的各种报警及预警信息需要提交给短信服务使用方,由短信服务方再调用短信服务提供方的短信发送接口。短信内容生产方和使用方之间也是通过Web服务的形式进行交互,由生产方调用使用方提供的接口将内容放入使用方处的队列中。

URL格式为http://IP地址:端口号/msg/queue?username=用户名&password=密码&message=短信内容&priority=优先级&sessionID=序号。URL中各参数的说明同短信服务接口章节中的描述。短信服务使用方从队列中根据优先级逐个取出消息,进行后续的短信发送调用。

3.4 短信发送

服务提供方需要在串口连接短信猫设备,短信猫与PC通过GSM无线网络交互。

短信猫的操作都是通过AT指令集进行[5]。AT指令一般应用于终端设备与控制器设备之间的连接与通信。AT指令简单易懂,采用标准串口来收发AT命令,大大简化了对设备的控制,并将相应的操作转换成了简单的串口编程。AT指令是以AT开头,字符结束的字符串,指令响应数据包在其中,每个指令执行成功与否都有相应的返回。发送短消息常用Text和PDU(协议数据单元)模式。虽然使用Text模式收发短信代码简单,实现起来也十分容易,但最大的缺点是不能收发中文短信。PDU模式不仅支持中文短信,也能发送英文短信。由于短信的生产方需要发送的报警信息种类繁多,字符内容包括了英文、中文、符号等多种形式,因此本系统中需要采用PDU模式发送短信。

交互过程可以分为三个层次:第一,物理层,即无线网络通信。第二,指令层,即各种AT指令,利用AT指令与短信猫进行交互调用底层的短信发送功能。第三,应用层,短信服务程序需要与短信猫交互的内容。关键代码如下:

//设置短信格式

myport.sendAT("AT+CMGF=0 ");

......

//设置短消息中心

cmd= "AT+CSCA=+8613800510500 " ;

strReturn = myport.sendAT(cmd);

......

//设置短消息接收者

cmd= "AT+CMGS=" + commonsms.getRecver() +" ";

strReturn = myport.sendAT(cmd);

cmd=encodeHex(getSmstext()) +"26 ";

//设置短消息内容

strReturn = myport.sendAT(cmd);

if(strReturn.indexOf("OK")!=-1&& strReturn.indexOf("+CMGS") != -1) {

System.out.println("send finished!");

}

4 结语

本文基于微服务思路将气象部门原有的各种报警监控系统的短信服务拆分、解耦,实现了一种分布式的短信服务平台。利用短信猫运行稳定、功能扩展可控的特点实现了短信服务的基础短信收发功能并将之发布为服务,既不影响原有系统又实现了各部门间系统资源的集约化,有着很好的市场推广价值。

猜你喜欢
气象部门调用指令
基于 Verilog HDL 的多周期 CPU 设计与实现
基于价值链模型的气象部门增值型内部审计新模式初探
《单一形状固定循环指令G90车外圆仿真》教案设计
2018年全国气象部门政府网站测评研究
核电项目物项调用管理的应用研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
中断与跳转操作对指令串的影响
MAC指令推动制冷剂行业发展
利用RFC技术实现SAP系统接口通信
C++语言中函数参数传递方式剖析