吳文哲,宮利輝
(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使用率,防止服務器卡死;減少服務器的內存用量,防止程序內存泄漏帶來的系統宕機等災難性后果。
本文以在遼河石油勘探局通信公司網管維護中心工作期間開發的項目為基礎,設計了這個基于中國電信短消息網關協議開發的短信發送系統,并在實際使用中對用戶登錄、填寫短消息并提交發送、字符過濾、長短信拆分和系統管理員查看日志等功能進行測試,各項功能均能實現。希望本論文所寫的設計方案對相關方面的開發設計有所借鑒。