張 智
(無錫職業技術學院 人事處, 江蘇 無錫 214121)
為了保障社會生產和人民生命財產的安全,國家氣象部門陸續在全國各地部署了幾萬套氣象觀測站,并且更多的氣象觀測站正在逐步按規劃部署中。通過觀測站輸出的歷史和實時信息,人們可以對各種天氣情況做出預判和實時災害預警處理。因此,設備持續正常工作對數據的及時性和準確性顯得尤為重要。
在正常的氣象業務值班過程中,技術人員經常需要24小時守候設備或業務應用程序的運行,當出現故障的時候立刻去排查原因并解決。一方面人員疲勞使得工作效率不高,另一方面無法保證將異常的信息及時反饋給相關的維護人員。
得益于通信技術的快速發展,手機短信服務由于其快速、穩定、可靠和準確的特點應用到各行各業的生產和生活中。在氣象部門中由于許多業務需要實時監控和故障排查,因此短信服務在氣象業務中被廣泛地應用于報警和維修保障活動中。每個地區的氣象部門短信服務功能和實現方式不盡相同,沒有統一的規范并且缺乏通用性,導致重復開發和浪費資源的情況,極大地限制了短信服務的效用。為了方便省、市縣各級氣象局用戶方便使用統一接口的短信服務,做到系統資源集約化,迫切需要一套整體規劃的短信服務系統,為設備的正常運行和數據的可靠穩定接收提供保障。
分布式服務是將不同的服務或程序部署在不同的機器上,各個服務通過Webservice接口或RPC協議實現相互通信與調用。微服務是一種特殊的分布式架構,它的粒度更小,切分后的各個服務之間的耦合性更低。每個服務都有自己的處理和輕量通訊機制,可以部署在單個或多個服務器上。
針對現有的氣象業務應用,從多級行政單位的實際情況統籌考慮,基于微服務的思路將原有的短信報警系統切分成粒度更小的單元,讓每一個單元專注做好一件事情。每個單元可以獨立開發并獨立部署,單元之間通過與語言無關的API進行集成。通過這樣的設計可以盡量對以前的系統不做改動,實現了氣象業務功能的精簡和資源的集約化使用。
實現短信發送報警信息的功能一般有兩種方案:第一,通過短信貓或類似具有短信發送功能的硬件模塊進行短信發送;第二,利用互聯網上提供的免費或收費短信服務接口。通過短信貓發送方案的優點是穩定、可靠、開發和使用不受限制,缺點是需要硬件和額外重復的開發成本。利用現有的互聯網短信接口發送短信的優點是開發成本小并且使用方便,缺點是提供的服務和功能由服務提供方準備,擴展性不強并且需要使用方必須能夠接入互聯網。在氣象部門中,使用第一種方案的情況較多,因為省、市、縣各級部門的短信服務之間相互獨立,沒有交互。
由于上文所述的兩種方案都有一定的缺點,如果將兩種方案進行整合和改進,并采用分布式部署的方式進行開發和調用,即可使得短信服務的使用方和提供方都具有很好的擴展性和易用性,極大地提高短信服務在氣象部門的應用范圍。圖1為分布式結構的短信發布和短信使用結構圖。
整個系統由3個部分組成:短信內容生產方、短信服務使用方和短信服務提供方。其中短信服務提供方由短信貓和短信服務器組成,短信服務器

圖1 短信服務分布式部署
通過AT指令控制短信貓設備完成短信的收發功能,并將該功能封裝為WebSevice接口供短信使用方調用。短信內容生產方為氣象局內原有的各種業務程序,每種程序都有需要監控和報警的內容。短信內容生產方將需要發送的報警內容放入短信內容隊列中,由短信服務使用方取出并調用短信服務方提供的接口發送短信。
在部署時,短信服務器作為一個單獨的部件運行,將短信服務的生產者和短信服務的消費者分開,解除了它們之間的耦合關系。各個短信服務的使用方無需重復投資搭建短信發送框架,只需按照服務提供方規定的短信接口進行調用即可完成短信的收發服務。短信生產方只管生成短信內容即可,由誰發送,怎么發送都無需關心。
(1) 系統支持將短信發送功能作為接口發布出來供調用方使用,將短信發送功能與使用分隔開。
(2) 短信服務提供方支持向多個短信接收方發送短信,并且對調用方的身份進行認證,防止未經授權的調用方使用服務。
(3) 消息的生產方與使用方相分離,生產方無需了解消息發送的細節,只需關心自己的業務邏輯。
整個系統基于微服務的思想,將整個業務流程拆分成多個物理上相互獨立的子模塊。這些子模塊可以部署在一臺系統中,也可以分布式地部署在不同的電腦上。開發編程工具使用Java語言,選擇Tomcat作為Web應用服務器(即文中的短信服務提供方)。
短信服務方和短信使用方部署在不同的機器上,并且不在同一個局域網內。因此,它們之間需要通過約定的協議進行通信,短信使用方能夠利用短信服務方提供的接口進行工作。
短信服務接口采用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);
......
}
短信內容生產方即氣象部門原有的各種業務軟件,這些軟件產生的各種報警及預警信息需要提交給短信服務使用方,由短信服務方再調用短信服務提供方的短信發送接口。短信內容生產方和使用方之間也是通過Web服務的形式進行交互,由生產方調用使用方提供的接口將內容放入使用方處的隊列中。
URL格式為http://IP地址:端口號/msg/queue?username=用戶名&password=密碼&message=短信內容&priority=優先級&sessionID=序號。URL中各參數的說明同短信服務接口章節中的描述。短信服務使用方從隊列中根據優先級逐個取出消息,進行后續的短信發送調用。
服務提供方需要在串口連接短信貓設備,短信貓與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!");
}
本文基于微服務思路將氣象部門原有的各種報警監控系統的短信服務拆分、解耦,實現了一種分布式的短信服務平臺。利用短信貓運行穩定、功能擴展可控的特點實現了短信服務的基礎短信收發功能并將之發布為服務,既不影響原有系統又實現了各部門間系統資源的集約化,有著很好的市場推廣價值。