金笛后花園

金笛工業(yè)手機官方博客

金笛只為您,一切全為您

基于SMPP協(xié)議的GSM短消息增值業(yè)務(wù)接口設(shè)計與實現(xiàn)


摘要:本文首先介紹了GSM短消息點對點協(xié)議SMPP的定義、接口連接和消息處理機制;在分析GSM短消息增值業(yè)務(wù)接口的基礎(chǔ)上詳細論述了基于SMPP協(xié)議的一種GSM短消息增值業(yè)務(wù)接口通信服務(wù)程序的實現(xiàn)。

關(guān)鍵詞: 短信增值業(yè)務(wù); SMPP協(xié)議; 通信服務(wù)接口; UNIX網(wǎng)絡(luò)編程

Abstract: This paper introduce the concept and structure of GSM Short Message Value-added Service and the Short Message point-to-point protocol SMPP. Then gives a method of Design and Implementation of the GSM Short Message Value-Added Service Interface Based on Protocol SMPP in details. Some important technology items are also shows.

Keywords: Short Message Value-added Service; SMPP protocol; Communication Interface; UNIX network programming

1、 前言

短消息業(yè)務(wù)是GSM/DCS1800系統(tǒng)中唯一不需要建立端到端業(yè)務(wù)通道的業(yè)務(wù),它通過GSM系統(tǒng)的信令信道(SDCCH用戶正常時或SACCH用戶忙時)來傳送短消息,通過SMSC完成接收、存儲和轉(zhuǎn)發(fā)用戶的短消息,如何充分利用SMSC的有效資源開展方便靈活的增值業(yè)務(wù),實現(xiàn)信息的互連和共享,即為短消息業(yè)務(wù)提供更多的信息源。

目前SMSC均提供與外界的接口方式。最廣泛應(yīng)用的協(xié)議有SMPP(Short Message Peer to Peer)(含中國移動點對點協(xié)議CMPP)/CIMD (Computer Interface Message Distribution) 等。通過SMPP通信服務(wù)接口,可以向用戶提供許多應(yīng)用,為開展新業(yè)務(wù)提供了廣闊的前景。

2、 SMPP協(xié)議格式及消息交互定義

2.1 SMPP PDU定義

SMPP協(xié)議是一個開放的消息轉(zhuǎn)換協(xié)議;它定義了一系列操作的協(xié)議數(shù)據(jù)單元(PDUs)和當(dāng)SMPP運行時ESMS應(yīng)用系統(tǒng)與SMSC之間交換的數(shù)據(jù)。從而完成SMSC與ESMEs(外部短消息實體)的信息交換。SMPP是基于SMSC與ESME之間的請求和響應(yīng)協(xié)議數(shù)據(jù)單元的交換,每一個SMPP操作都由一個請求PDU和相應(yīng)的一個響應(yīng)PDU組成并且這種交換是在TCP/IP或X.25網(wǎng)絡(luò)連接之上的。因此基于SMPP短消息增值業(yè)務(wù)接口利用Socket網(wǎng)絡(luò)編程實現(xiàn)。根據(jù)SMPP協(xié)議,每個PDU的結(jié)構(gòu)定義由PDU Header和PDU Body(有些PDU沒有)組成,見下表:

PDU Header(mandatory)
PDU Body(optional)

整個PDU的長度
PDU的類型
PDU的狀態(tài)
PDU的序列號
必要參數(shù)
可選參數(shù)

Command length
Command

id
Command status
Sequence number
Mandatory parameters
Optional parameters

Unsigned long
Unsigned long
Unsigned long
Unsigned long
mixed
TLV

其中協(xié)議定義了非常復(fù)雜的可選參數(shù),每個可選參數(shù)的結(jié)構(gòu)定義如下:

可選參數(shù)標(biāo)簽
參數(shù)值的字節(jié)長度
參數(shù)的取值

Tag
Length
Value

Unsigned int
Unsigned int
變長

其定義是為擴充應(yīng)用功能,但在常見的短消息增值業(yè)務(wù)應(yīng)用中,只需使用PDU的必選參數(shù)即可,但如要實現(xiàn),也只是在PDU定義結(jié)構(gòu)中添加可選項,對系統(tǒng)的實現(xiàn)無影響。

2.2 短消息增值業(yè)務(wù)交互數(shù)據(jù)格式定義

各種業(yè)務(wù)源服務(wù)

其功能(1)將來自SMSC的協(xié)議數(shù)據(jù)進行SMPP解碼,得到的信息寫入數(shù)據(jù)庫或發(fā)給各業(yè)務(wù)服務(wù)中心;(2)將來自各業(yè)務(wù)服務(wù)中心的消息進行SMPP編碼,通過通信模塊提供的連接發(fā)往SMSC,并將必要的信息寫入數(shù)據(jù)庫。其中SMSC與通信接口之間是通過SMPP協(xié)議PDUs交互的,而通信接口與各種業(yè)務(wù)源之間的消息交互還必須確定數(shù)據(jù)幀的含義,保證消息交互的 正確性,同時因許多信息在SMPP編碼、解碼時進行了分解取舍,所以對于前端業(yè)務(wù)中心數(shù)據(jù)通信需要定義數(shù)據(jù)幀格式,如下表:

Frame Header (mandatory)
Frame Body(optional)

整個幀長度
幀類型ID
幀狀態(tài)
幀序號
必要參數(shù)

Command length
Command

id
Command status
Sequence number
Mandatory parameters

4字節(jié)
2字節(jié)
2字節(jié)
4字節(jié)
mixed

3、 通信接口服務(wù)系統(tǒng)的實現(xiàn)

3.1 系統(tǒng)完成功能需求

(1)與SMSC連接和綁定

(2)與各應(yīng)用業(yè)務(wù)中心的連接

(3)接收SMSC短消息、解碼并進行短消息應(yīng)答編碼

(4)對接收短消息合法檢查、識別所屬應(yīng)用業(yè)務(wù)并組成相應(yīng)的內(nèi)部數(shù)據(jù)幀

(5)發(fā)送內(nèi)部數(shù)據(jù)幀到所屬應(yīng)用業(yè)務(wù)中心

(6)接收各應(yīng)用業(yè)務(wù)中心發(fā)送的內(nèi)部數(shù)據(jù)幀并應(yīng)答

(7)對接受的數(shù)據(jù)幀解析并進行SMPP編碼并發(fā)送至SMSC

(8)對發(fā)送和接收的短消息計費統(tǒng)計

3.2 系統(tǒng)設(shè)計與實現(xiàn)

由上述系統(tǒng)的主要功能看出系統(tǒng)實際上是相對獨立兩個處理流程,一個是處理與SMSC的編碼、解碼和數(shù)據(jù)的收、發(fā);另一個是與前端應(yīng)用業(yè)務(wù)中心的數(shù)據(jù)幀編碼、解碼和數(shù)據(jù)收發(fā)。并且消息的到達具有隨機、快速和突發(fā)性,因此將系統(tǒng)設(shè)計為兩個主進程。分別處理SMSC消息和應(yīng)用業(yè)務(wù)中心消息。兩個進程之間采用消息隊列進行消息通信,因為在短消息增值業(yè)務(wù)中所有消息都可以認為是一條單獨的消息,沒有邏輯關(guān)系也不存在實時共享關(guān)系。為保證系統(tǒng)的安全與正確,對短消息的發(fā)送采用定時進程控制;為適應(yīng)系統(tǒng)的可擴充性,對數(shù)據(jù)庫的操作、訪問采用數(shù)據(jù)庫訪問進程單獨進行處理。

3.2.1 SMSC進程處理功能流程

首先與SMSC進行SOCKET連接并偵聽TCP端口,對SMSC發(fā)綁定消息,接收SMSC發(fā)送的短消息進行解碼并檢查其合法性,對合法正確分類的消息組成前臺業(yè)務(wù)應(yīng)用定義的內(nèi)部數(shù)據(jù)幀(格式前面已定義),將已組好的內(nèi)部數(shù)據(jù)幀發(fā)送到SMSC->SERV消息隊列;然后取SERV->SMSC消息隊列消息存包并啟動定時器,發(fā)送PDU到SMSC。

PACKET結(jié)構(gòu)數(shù)組的作用是存儲即將發(fā)送或已經(jīng)發(fā)送的PDU包,其定義如下:

typedef struct {

unsigned int seqnum;

int ordernum;

char data[MAX];

} pend_packet;

每個pend_packet結(jié)構(gòu)對應(yīng)一個PDU包,其中seqnum是與該PDU包結(jié)構(gòu)中的HEADER中的sequence_number一致的;ordernum是該PDU包存入PACKET數(shù)組的序列號,即全局變量ORDERNUM,在每次調(diào)用存包模塊時,ORDERNUM會自動遞增,則所存的PDU包的ordernum即為此ORDERNUM。但在接收到該PDU包的回應(yīng)以后,則將該PDU包在PACKET數(shù)組中的ordernum置為-1,表示將其清除。

因為每個SMSC對應(yīng)的socket有5個狀態(tài),在調(diào)用發(fā)包模塊時,只有當(dāng)對應(yīng)socket的狀態(tài)為DATA_STATUS時,才能直接將PDU包發(fā)送至對應(yīng)SMSC,否則要調(diào)用綁定模塊對該SMSC重新進行綁定。在這兩種情況下,都要將PDU包存入PACKET數(shù)組。在接收到綁定數(shù)據(jù)包的響應(yīng)包后,則將綁定數(shù)據(jù)包在PACKET數(shù)組中的狀態(tài)置為-1,將該socket在socket_smsc表中狀態(tài)置為DATA_STATUS,同時將PACKET數(shù)組中屬于該socket的PDU包發(fā)至SERV->SMSC消息隊列,SERV->SMSC消息隊列處理模塊會調(diào)用發(fā)包模塊將這些包發(fā)送至相應(yīng)SMSC。在收到數(shù)據(jù)包的響應(yīng)包后,則將該數(shù)據(jù)包在PACKET數(shù)組中的狀態(tài)置為-1。

3.2.2 SERV進程處理功能流程

SERV進程則相對較簡單,完成對SERV的數(shù)據(jù)接收、編碼并發(fā)送到SERV->SMSC消息隊列;取SMSC->SERV消息隊列中消息發(fā)送到前臺業(yè)務(wù)服務(wù)中心。實現(xiàn)結(jié)構(gòu)圖略。

3.2.3 定時器進程及數(shù)據(jù)庫的訪問

在通信軟件系統(tǒng)中,需要利用定時器來管理任務(wù)的調(diào)度和通信、通信協(xié)議的超時(提供差錯控制的機制)和系統(tǒng)數(shù)據(jù)的定時更新等多種事務(wù)。在那些對時鐘數(shù)量和種類要求不多,精度要求不高的應(yīng)用場合,可以直接使用操作系統(tǒng)提供的時鐘功能。然而,實際的通信軟件要求時鐘種類多,并發(fā)的時鐘數(shù)量龐大。有的對精度要求極為嚴格,在這種情況下可以考慮采用實時操作系統(tǒng)。LINUX中Spec1170提供了三種間隔計時器,其中一種是ITIMER_REAL 類型,它的機制是:當(dāng)該類型的間隔計時器到期時,系統(tǒng)內(nèi)核會發(fā)出SIGALARM信號,可以通過捕獲這一信號來感知間隔計時器的到期。根據(jù)這一原理,設(shè)計了基于Linux操作系統(tǒng)的spec1170軟件間隔計時器的多任務(wù)定時服務(wù)器,來對實時通信系統(tǒng)提供支持。

通信接口系統(tǒng)對Oracle 8i數(shù)據(jù)庫的訪問采用單獨進程實現(xiàn),Oracle提供Proc預(yù)編譯器,Proc可將.pc文件預(yù)編譯成.c文件,然后在Linux/UNIX中用cc或gcc鏈接oracle數(shù)據(jù)庫下的頭文件和庫文件,編譯鏈接成可執(zhí)行文件。

4、 結(jié)束語

設(shè)計的短消息增值接口通信系統(tǒng)采用結(jié)構(gòu)化模塊向客戶提供服務(wù)。在性能上采用開辟多個線程和合理協(xié)調(diào)多個進程間的優(yōu)先級及進程內(nèi)部各任務(wù)優(yōu)先級,并為降低系統(tǒng)空閑時對CPU的占有率,將系統(tǒng)的非阻塞方式改為阻塞(消息觸發(fā))方式。系統(tǒng)在SUN Solaris系統(tǒng)下運行,我們將其用在GPS車輛定位軟件系統(tǒng)中,實踐證明,它達到了預(yù)期設(shè)計目標(biāo),能夠滿足系統(tǒng)通信應(yīng)用的要求。

__________________
北京玉笛信息技術(shù)有限責(zé)任公司
地址:北京海淀區(qū)知春路23號量子銀座903(863軟件園)
淘網(wǎng)址:http://shop35321900.taobao.com
2014/12/22 0 / /
標(biāo)簽:  暫無標(biāo)簽

6 + 3 =

回到頂部
文登市| 乌兰察布市| 保靖县| 溧水县| 渑池县| 麦盖提县| 鹤山市| 遂平县| 和平县| 昭苏县| 乐亭县| 敖汉旗| 新和县| 陇西县| 达州市| 晋城| 淳安县| 日照市| 保亭| 武功县| 水城县| 东兴市| 芜湖市| 香河县| 通化市| 普安县| 霍山县| 隆林| 苏尼特右旗| 新野县| 巍山| 洛浦县| 朝阳县| 富顺县| 虞城县| 新田县| 和林格尔县| 疏勒县| 体育| 榆林市| 安泽县|