張 智
(無錫職業(yè)技術(shù)學(xué)院 人事處, 江蘇 無錫 214121)
為了保障社會(huì)生產(chǎn)和人民生命財(cái)產(chǎn)的安全,國家氣象部門陸續(xù)在全國各地部署了幾萬套氣象觀測站,并且更多的氣象觀測站正在逐步按規(guī)劃部署中。通過觀測站輸出的歷史和實(shí)時(shí)信息,人們可以對(duì)各種天氣情況做出預(yù)判和實(shí)時(shí)災(zāi)害預(yù)警處理。因此,設(shè)備持續(xù)正常工作對(duì)數(shù)據(jù)的及時(shí)性和準(zhǔn)確性顯得尤為重要。
在正常的氣象業(yè)務(wù)值班過程中,技術(shù)人員經(jīng)常需要24小時(shí)守候設(shè)備或業(yè)務(wù)應(yīng)用程序的運(yùn)行,當(dāng)出現(xiàn)故障的時(shí)候立刻去排查原因并解決。一方面人員疲勞使得工作效率不高,另一方面無法保證將異常的信息及時(shí)反饋給相關(guān)的維護(hù)人員。
得益于通信技術(shù)的快速發(fā)展,手機(jī)短信服務(wù)由于其快速、穩(wěn)定、可靠和準(zhǔn)確的特點(diǎn)應(yīng)用到各行各業(yè)的生產(chǎn)和生活中。在氣象部門中由于許多業(yè)務(wù)需要實(shí)時(shí)監(jiān)控和故障排查,因此短信服務(wù)在氣象業(yè)務(wù)中被廣泛地應(yīng)用于報(bào)警和維修保障活動(dòng)中。每個(gè)地區(qū)的氣象部門短信服務(wù)功能和實(shí)現(xiàn)方式不盡相同,沒有統(tǒng)一的規(guī)范并且缺乏通用性,導(dǎo)致重復(fù)開發(fā)和浪費(fèi)資源的情況,極大地限制了短信服務(wù)的效用。為了方便省、市縣各級(jí)氣象局用戶方便使用統(tǒng)一接口的短信服務(wù),做到系統(tǒng)資源集約化,迫切需要一套整體規(guī)劃的短信服務(wù)系統(tǒng),為設(shè)備的正常運(yùn)行和數(shù)據(jù)的可靠穩(wěn)定接收提供保障。
分布式服務(wù)是將不同的服務(wù)或程序部署在不同的機(jī)器上,各個(gè)服務(wù)通過Webservice接口或RPC協(xié)議實(shí)現(xiàn)相互通信與調(diào)用。微服務(wù)是一種特殊的分布式架構(gòu),它的粒度更小,切分后的各個(gè)服務(wù)之間的耦合性更低。每個(gè)服務(wù)都有自己的處理和輕量通訊機(jī)制,可以部署在單個(gè)或多個(gè)服務(wù)器上。
針對(duì)現(xiàn)有的氣象業(yè)務(wù)應(yīng)用,從多級(jí)行政單位的實(shí)際情況統(tǒng)籌考慮,基于微服務(wù)的思路將原有的短信報(bào)警系統(tǒng)切分成粒度更小的單元,讓每一個(gè)單元專注做好一件事情。每個(gè)單元可以獨(dú)立開發(fā)并獨(dú)立部署,單元之間通過與語言無關(guān)的API進(jìn)行集成。通過這樣的設(shè)計(jì)可以盡量對(duì)以前的系統(tǒng)不做改動(dòng),實(shí)現(xiàn)了氣象業(yè)務(wù)功能的精簡和資源的集約化使用。
實(shí)現(xiàn)短信發(fā)送報(bào)警信息的功能一般有兩種方案:第一,通過短信貓或類似具有短信發(fā)送功能的硬件模塊進(jìn)行短信發(fā)送;第二,利用互聯(lián)網(wǎng)上提供的免費(fèi)或收費(fèi)短信服務(wù)接口。通過短信貓發(fā)送方案的優(yōu)點(diǎn)是穩(wěn)定、可靠、開發(fā)和使用不受限制,缺點(diǎn)是需要硬件和額外重復(fù)的開發(fā)成本。利用現(xiàn)有的互聯(lián)網(wǎng)短信接口發(fā)送短信的優(yōu)點(diǎn)是開發(fā)成本小并且使用方便,缺點(diǎn)是提供的服務(wù)和功能由服務(wù)提供方準(zhǔn)備,擴(kuò)展性不強(qiáng)并且需要使用方必須能夠接入互聯(lián)網(wǎng)。在氣象部門中,使用第一種方案的情況較多,因?yàn)槭?、市、縣各級(jí)部門的短信服務(wù)之間相互獨(dú)立,沒有交互。
由于上文所述的兩種方案都有一定的缺點(diǎn),如果將兩種方案進(jìn)行整合和改進(jìn),并采用分布式部署的方式進(jìn)行開發(fā)和調(diào)用,即可使得短信服務(wù)的使用方和提供方都具有很好的擴(kuò)展性和易用性,極大地提高短信服務(wù)在氣象部門的應(yīng)用范圍。圖1為分布式結(jié)構(gòu)的短信發(fā)布和短信使用結(jié)構(gòu)圖。
整個(gè)系統(tǒng)由3個(gè)部分組成:短信內(nèi)容生產(chǎn)方、短信服務(wù)使用方和短信服務(wù)提供方。其中短信服務(wù)提供方由短信貓和短信服務(wù)器組成,短信服務(wù)器
圖1 短信服務(wù)分布式部署
通過AT指令控制短信貓?jiān)O(shè)備完成短信的收發(fā)功能,并將該功能封裝為WebSevice接口供短信使用方調(diào)用。短信內(nèi)容生產(chǎn)方為氣象局內(nèi)原有的各種業(yè)務(wù)程序,每種程序都有需要監(jiān)控和報(bào)警的內(nèi)容。短信內(nèi)容生產(chǎn)方將需要發(fā)送的報(bào)警內(nèi)容放入短信內(nèi)容隊(duì)列中,由短信服務(wù)使用方取出并調(diào)用短信服務(wù)方提供的接口發(fā)送短信。
在部署時(shí),短信服務(wù)器作為一個(gè)單獨(dú)的部件運(yùn)行,將短信服務(wù)的生產(chǎn)者和短信服務(wù)的消費(fèi)者分開,解除了它們之間的耦合關(guān)系。各個(gè)短信服務(wù)的使用方無需重復(fù)投資搭建短信發(fā)送框架,只需按照服務(wù)提供方規(guī)定的短信接口進(jìn)行調(diào)用即可完成短信的收發(fā)服務(wù)。短信生產(chǎn)方只管生成短信內(nèi)容即可,由誰發(fā)送,怎么發(fā)送都無需關(guān)心。
(1) 系統(tǒng)支持將短信發(fā)送功能作為接口發(fā)布出來供調(diào)用方使用,將短信發(fā)送功能與使用分隔開。
(2) 短信服務(wù)提供方支持向多個(gè)短信接收方發(fā)送短信,并且對(duì)調(diào)用方的身份進(jìn)行認(rèn)證,防止未經(jīng)授權(quán)的調(diào)用方使用服務(wù)。
(3) 消息的生產(chǎn)方與使用方相分離,生產(chǎn)方無需了解消息發(fā)送的細(xì)節(jié),只需關(guān)心自己的業(yè)務(wù)邏輯。
整個(gè)系統(tǒng)基于微服務(wù)的思想,將整個(gè)業(yè)務(wù)流程拆分成多個(gè)物理上相互獨(dú)立的子模塊。這些子模塊可以部署在一臺(tái)系統(tǒng)中,也可以分布式地部署在不同的電腦上。開發(fā)編程工具使用Java語言,選擇Tomcat作為Web應(yīng)用服務(wù)器(即文中的短信服務(wù)提供方)。
短信服務(wù)方和短信使用方部署在不同的機(jī)器上,并且不在同一個(gè)局域網(wǎng)內(nèi)。因此,它們之間需要通過約定的協(xié)議進(jìn)行通信,短信使用方能夠利用短信服務(wù)方提供的接口進(jìn)行工作。
短信服務(wù)接口采用Web服務(wù)發(fā)布調(diào)用接口,支持HTTP POST和GET方式提交請(qǐng)求。URL格式為http://IP地址:端口號(hào)/msg/send?username=用戶名&password=密碼&sendto=接收短信的手機(jī)號(hào)&message=短信內(nèi)容&priority=優(yōu)先級(jí)&sessionID=序號(hào)。
其中IP地址和端口號(hào)是短信服務(wù)提供方暴露出的訪問地址,用戶名和密碼在短信提供方處進(jìn)行驗(yàn)證,驗(yàn)證通過后方能調(diào)用短信發(fā)送接口。為了防止用戶名的泄露,在短信服務(wù)提供方處可以進(jìn)行IP地址和使用次數(shù)的綁定。接收短信的手機(jī)號(hào)可以有多個(gè),用分號(hào)隔開;短信內(nèi)容采用UTF-8編碼格式發(fā)送;priority表示本次短信內(nèi)容的發(fā)送緊迫程度,數(shù)值越大就越緊迫;sessionID表示本次發(fā)送的序號(hào)。如訪問地址“http://192.168.2.23:8080/msg/send?username=yth&password=yth&sendto=13836327980;15923247909&mess-age=網(wǎng)絡(luò)通信故障請(qǐng)及時(shí)檢修&priority=0&sessionID=12345678” 表示yth用戶向短信服務(wù)提供方發(fā)送一個(gè)向13836327980和15923247909手機(jī)發(fā)送短信內(nèi)容為“網(wǎng)絡(luò)通信故障請(qǐng)及時(shí)檢修”的請(qǐng)求。短信發(fā)送成功后返回本次sessionID對(duì)應(yīng)的內(nèi)容是否發(fā)送成功,由短信服務(wù)使用方?jīng)Q定是否再次發(fā)送。
后端采用Servlet對(duì)Http請(qǐng)求進(jìn)行相應(yīng)的處理,解析短信使用方請(qǐng)求中的各種參數(shù)并將參數(shù)傳遞給短信發(fā)送模塊。Servlet的原理圖如圖2所示,客戶端向Web服務(wù)器發(fā)送請(qǐng)求,Web服務(wù)器將請(qǐng)求發(fā)送給Servlet,Servlet容器會(huì)產(chǎn)生一個(gè)Servlet實(shí)例然后構(gòu)建一個(gè)響應(yīng)并將其傳給Web服務(wù)器,Web服務(wù)器將響應(yīng)結(jié)果返回給客戶端。
圖2 短信服務(wù)端Servlet處理流程
關(guān)鍵代碼如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲得短信使用方發(fā)送來的各種參數(shù)信息
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");
//驗(yàn)證身份
......
//調(diào)用發(fā)送短信的模塊
SendMsg(sendto,message);
......
}
短信內(nèi)容生產(chǎn)方即氣象部門原有的各種業(yè)務(wù)軟件,這些軟件產(chǎn)生的各種報(bào)警及預(yù)警信息需要提交給短信服務(wù)使用方,由短信服務(wù)方再調(diào)用短信服務(wù)提供方的短信發(fā)送接口。短信內(nèi)容生產(chǎn)方和使用方之間也是通過Web服務(wù)的形式進(jìn)行交互,由生產(chǎn)方調(diào)用使用方提供的接口將內(nèi)容放入使用方處的隊(duì)列中。
URL格式為http://IP地址:端口號(hào)/msg/queue?username=用戶名&password=密碼&message=短信內(nèi)容&priority=優(yōu)先級(jí)&sessionID=序號(hào)。URL中各參數(shù)的說明同短信服務(wù)接口章節(jié)中的描述。短信服務(wù)使用方從隊(duì)列中根據(jù)優(yōu)先級(jí)逐個(gè)取出消息,進(jìn)行后續(xù)的短信發(fā)送調(diào)用。
服務(wù)提供方需要在串口連接短信貓?jiān)O(shè)備,短信貓與PC通過GSM無線網(wǎng)絡(luò)交互。
短信貓的操作都是通過AT指令集進(jìn)行[5]。AT指令一般應(yīng)用于終端設(shè)備與控制器設(shè)備之間的連接與通信。AT指令簡單易懂,采用標(biāo)準(zhǔn)串口來收發(fā)AT命令,大大簡化了對(duì)設(shè)備的控制,并將相應(yīng)的操作轉(zhuǎn)換成了簡單的串口編程。AT指令是以AT開頭,字符結(jié)束的字符串,指令響應(yīng)數(shù)據(jù)包在其中,每個(gè)指令執(zhí)行成功與否都有相應(yīng)的返回。發(fā)送短消息常用Text和PDU(協(xié)議數(shù)據(jù)單元)模式。雖然使用Text模式收發(fā)短信代碼簡單,實(shí)現(xiàn)起來也十分容易,但最大的缺點(diǎn)是不能收發(fā)中文短信。PDU模式不僅支持中文短信,也能發(fā)送英文短信。由于短信的生產(chǎn)方需要發(fā)送的報(bào)警信息種類繁多,字符內(nèi)容包括了英文、中文、符號(hào)等多種形式,因此本系統(tǒng)中需要采用PDU模式發(fā)送短信。
交互過程可以分為三個(gè)層次:第一,物理層,即無線網(wǎng)絡(luò)通信。第二,指令層,即各種AT指令,利用AT指令與短信貓進(jìn)行交互調(diào)用底層的短信發(fā)送功能。第三,應(yīng)用層,短信服務(wù)程序需要與短信貓交互的內(nèi)容。關(guān)鍵代碼如下:
//設(shè)置短信格式
myport.sendAT("AT+CMGF=0 ");
......
//設(shè)置短消息中心
cmd= "AT+CSCA=+8613800510500 " ;
strReturn = myport.sendAT(cmd);
......
//設(shè)置短消息接收者
cmd= "AT+CMGS=" + commonsms.getRecver() +" ";
strReturn = myport.sendAT(cmd);
cmd=encodeHex(getSmstext()) +"26 ";
//設(shè)置短消息內(nèi)容
strReturn = myport.sendAT(cmd);
if(strReturn.indexOf("OK")!=-1&& strReturn.indexOf("+CMGS") != -1) {
System.out.println("send finished!");
}
本文基于微服務(wù)思路將氣象部門原有的各種報(bào)警監(jiān)控系統(tǒng)的短信服務(wù)拆分、解耦,實(shí)現(xiàn)了一種分布式的短信服務(wù)平臺(tái)。利用短信貓運(yùn)行穩(wěn)定、功能擴(kuò)展可控的特點(diǎn)實(shí)現(xiàn)了短信服務(wù)的基礎(chǔ)短信收發(fā)功能并將之發(fā)布為服務(wù),既不影響原有系統(tǒng)又實(shí)現(xiàn)了各部門間系統(tǒng)資源的集約化,有著很好的市場推廣價(jià)值。