吳文哲,宮利輝
(1.遼河油田信息工程公司信息化技術部,盤錦 124010;2.遼河油田信息工程公司網絡管理維護中心,盤錦 124010)
由于公司要與盤錦電信合作實現(xiàn)小靈通轉網及電信號碼虛擬運營業(yè)務,因此需要開發(fā)一個短信系統(tǒng)實現(xiàn)公司負責運營的電信號碼的短信發(fā)送服務。公司的短信平臺服務器通過網絡防火墻,利用專線實現(xiàn)與盤錦電信短信網關的對接,進而實現(xiàn)對公司所負責的電信號碼提供短信發(fā)送服務。
圖1 系統(tǒng)業(yè)務結構圖
將系統(tǒng)分為系統(tǒng)管理、系統(tǒng)監(jiān)控和系統(tǒng)報表三大模塊:系統(tǒng)管理包括資源管理、角色管理、機構管理、用戶管理、號碼管理、群組管理和短信管理七個模塊;系統(tǒng)監(jiān)控包括項目監(jiān)控、數據源監(jiān)控、Action映射監(jiān)控和用戶登錄歷史監(jiān)控四個模塊;系統(tǒng)報表包括注冊時間分布和用戶角色分布兩個模塊。
為了解決系統(tǒng)對權限方面的要求,結合了RBAC(基于角色的權限控制)思想,引入role(角色)的概念,使得用戶和權限分離,一個用戶擁有多個角色,一個角色擁有多個相應的權限。同時引入resource(資源)的概念,資源可分為URL和FUNCTION(功能)兩種,一個權限可以對應多個資源。整個系統(tǒng)中涉及權限管理的數據庫部分包括10個表:分別為用戶表、角色表、資源表、部門表、用戶角色表、用戶部門表、部門資源表、角色資源表、資源類型和日志表。
服務器兩臺:1臺數據庫服務器,1臺業(yè)務管理及WEB服務器;網絡交換機1臺;網絡防火墻1臺統(tǒng)硬件需要服務器。
表1 硬件配置表
硬件網絡拓撲圖如圖2所示:
本系統(tǒng)開發(fā)時選用的集成開發(fā)環(huán)境是Eclipse,該軟件環(huán)境是面向對象的、可視化的,簡單易學,功能強大,在編寫和調試B/S結構的應用程序時非常方便。
圖2 硬件網絡拓撲圖
Jetty目前的是一個比較被看好的Servlet引擎,它的架構比較簡單,是一個可擴展性強而且非常靈活的應用服務器。結合Jetty的性能特點和本系統(tǒng)使用特性,系統(tǒng)使用Jetty做業(yè)務服務中間件。
從安全性、開放性、可伸縮性、應用模式及客戶端支持等多方面考慮,本系統(tǒng)選擇了目前比較流行的Microsoft SQL Server數據庫。
Maven是Apache提供的一款基于項目對象模型(POM)的開源項目管理工具,是Ant的進化,為項目提供包管理、編譯和發(fā)布等一系列功能,可以有效地進行分工協(xié)作。
界面實現(xiàn)是系統(tǒng)實現(xiàn)的一個尤其重要的環(huán)節(jié)。因為人機交互界面提供了一個人機對話的有效窗口,一個友好的交互界面不僅能夠使用戶方便快捷的應用這個系統(tǒng),而且還可以幫助用戶形象地了解系統(tǒng)所具有的各個功能。
根據電信短信網關的要求,企業(yè)分配的下發(fā)速率最大值是10條/秒,所以在短信發(fā)送服務的實現(xiàn)類的實現(xiàn)方法中,我們在短信的循環(huán)發(fā)送中使用了線程休眠(Thread.sleep(100);)來控制發(fā)送速度,來匹配網關的限制。
超長短信拆分,每條短信按140個字節(jié)來拆,帶上正確的UDH頭,終端會自行識別合并,UDH頭就是短信內容的前六個字節(jié),所以實際上一條短信扣掉UDH頭后實際就只有134個字節(jié),拆分后只要在最后一條短信UDH頭后面跟上企業(yè)簽名,拆分后的第一條或其他條就不需要再跟企業(yè)簽名了。
在UCS2編碼下,每個中文、字母和數字都算成2個字節(jié)長度。企業(yè)簽名“[遼河石油勘探局通信公司]”這26字節(jié),計算在一條短信字節(jié)數(140字節(jié))之內,在電信計費服務中記錄的實際發(fā)送短信條數計算方法如下:
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;
}
在短信發(fā)送服務實現(xiàn)類的發(fā)送方法中,當有短信需要發(fā)送時,打開本地服務到電信網關服務的socket連接,發(fā)送后保持長連接,實時接收網關的消息包(短信應答、短信狀態(tài)報告等),同時將已經發(fā)送的短信標識字段入庫,利用Runnable線程實現(xiàn)類的run方法,循環(huán)接收短信狀態(tài)報告,當所有已經發(fā)出的短信狀態(tài)報告全部接收完畢或者客戶端連接斷開(session關閉)后(以兩個時間最早者計算),關閉socket連接。這樣做的好處是,及時關閉短信發(fā)送狀態(tài)循環(huán)檢測,及早降低服務器的cpu使用率,防止服務器卡死;減少服務器的內存用量,防止程序內存泄漏帶來的系統(tǒng)宕機等災難性后果。
本文以在遼河石油勘探局通信公司網管維護中心工作期間開發(fā)的項目為基礎,設計了這個基于中國電信短消息網關協(xié)議開發(fā)的短信發(fā)送系統(tǒng),并在實際使用中對用戶登錄、填寫短消息并提交發(fā)送、字符過濾、長短信拆分和系統(tǒng)管理員查看日志等功能進行測試,各項功能均能實現(xiàn)。希望本論文所寫的設計方案對相關方面的開發(fā)設計有所借鑒。