注銷(xiāo)

          注銷(xiāo)

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            112 隨筆 :: 7 文章 :: 18 評(píng)論 :: 0 Trackbacks

          短消息網(wǎng)關(guān)通信模塊的設(shè)計(jì)與實(shí)現(xiàn)

          鄧麗華 1 ,黃華 1 ,張靖宇 2

          1. 四川大學(xué)電氣信息學(xué)院 ? ?2. 時(shí)力永聯(lián)科技有限公司)

          在闡述短消息網(wǎng)關(guān)結(jié)構(gòu)的基礎(chǔ)上,提出了短消息網(wǎng)關(guān)通信模塊的設(shè)計(jì)思想,并給出了該通信模塊的具體實(shí)現(xiàn)。

          關(guān)鍵詞: 短消息 ; 短消息網(wǎng)關(guān) ; 通信

          1??????? 前言

          隨著通信技術(shù)的發(fā)展,無(wú)線(xiàn)互聯(lián)網(wǎng)短消息業(yè)務(wù)正在為用戶(hù)提供越來(lái)越多的服務(wù)。人們不僅可以通過(guò)手機(jī)點(diǎn)播定制新聞、股票信息、天氣預(yù)報(bào),還可以下載鈴聲、圖片等。無(wú)論需要什么樣的信息,我們都可以隨時(shí)隨地地通過(guò)手機(jī)接入互聯(lián)網(wǎng)絡(luò),享受各種服務(wù)。電信運(yùn)營(yíng)商要實(shí)現(xiàn)這些增值業(yè)務(wù),就必須支持網(wǎng)間的互聯(lián)互通。

          目前實(shí)現(xiàn)網(wǎng)間互聯(lián)互通的方式有四種,包括:通過(guò)移動(dòng)關(guān)口局互聯(lián)互通;通過(guò)信令轉(zhuǎn)接點(diǎn)互聯(lián)互通;通過(guò)短消息網(wǎng)關(guān)互聯(lián)互通;通過(guò)第三方運(yùn)營(yíng)商系統(tǒng)互聯(lián)互通。前兩種方式不易設(shè)置計(jì)費(fèi)點(diǎn)和引出計(jì)費(fèi)話(huà)單,因此不利于網(wǎng)間結(jié)算;最后一種方式,雖然能夠保證計(jì)費(fèi)點(diǎn)和結(jié)算點(diǎn)的統(tǒng)一,但是易受到地域條件的限制 而通過(guò)短消息網(wǎng)關(guān)實(shí)現(xiàn)互聯(lián)互通,無(wú)須對(duì) 現(xiàn)網(wǎng)運(yùn)行的設(shè)備進(jìn)行大面積的數(shù)據(jù)改動(dòng)和升級(jí)改造,能夠 合理的設(shè)置計(jì)費(fèi)點(diǎn),保證計(jì)費(fèi)的準(zhǔn)確性,實(shí)現(xiàn)業(yè)務(wù)鑒權(quán)和業(yè)務(wù)過(guò)濾的功能,保證網(wǎng)絡(luò)的安全,也能夠通過(guò)對(duì)業(yè)務(wù)流量的監(jiān)視和控制,防止網(wǎng)絡(luò)風(fēng)暴的發(fā)生,這種互聯(lián)方式具有其他三種方式不可比擬的優(yōu)點(diǎn)。目前,大部分短消息業(yè)務(wù)的互聯(lián)互通都是使用短消息網(wǎng)關(guān)來(lái)實(shí)現(xiàn)。

          2??????? 短消息網(wǎng)關(guān)結(jié)構(gòu)

          短消息網(wǎng)關(guān)( ISMG )是處于短消息中心( SMSC )和業(yè)務(wù)提供商( SP )之間的設(shè)備,它為這兩個(gè)實(shí)體的數(shù)據(jù)交換提供安全、快捷的通道。網(wǎng)關(guān)與短消息中心之間使用 SMPP 協(xié)議( Short Message Peer to Peer, 短消息點(diǎn)對(duì)點(diǎn)協(xié)議) , SP 之間使用 CMPP 協(xié)議( China Mobile Peer to Peer, 中國(guó)移動(dòng)點(diǎn)對(duì)點(diǎn)協(xié)議),因此短消息網(wǎng)關(guān)需要完成協(xié)議的轉(zhuǎn)換、計(jì)費(fèi)、路由、安全和網(wǎng)絡(luò)管理等功能。其結(jié)構(gòu)圖如圖 1 所示。

          SMPP

          CMPP

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ? 短消息網(wǎng)關(guān)( ISMG

          ?

          SMSC

          ? SMPP 通信代理系統(tǒng)

          短消息網(wǎng)關(guān)處理系統(tǒng)

          SP

          ? CMPP 通信代理系統(tǒng)

          短信網(wǎng)關(guān)計(jì)費(fèi)系統(tǒng)

          業(yè)務(wù)管理系統(tǒng)

          防火墻系統(tǒng)

          具體說(shuō)來(lái),圖 1 SMPP 通信代理系統(tǒng)主要實(shí)現(xiàn)網(wǎng)關(guān)和 GSM 網(wǎng)中短消息中心( SMSC )的連接,確保準(zhǔn)確接收和發(fā)送數(shù)據(jù),實(shí)現(xiàn)高效、可靠的數(shù)據(jù)傳輸。為了達(dá)到規(guī)范要求的不超過(guò) 0.001% 的數(shù)據(jù)丟包率, SMPP 通信代理需要支持流量控制。 CMPP 通信代理系統(tǒng)主要是實(shí)現(xiàn)和 SP 服務(wù)提供商的連接,與 SMPP 通信代理系統(tǒng)不同的是,由于協(xié)議的影響, CMPP 通信代理是服務(wù)器端,需等待 SP 的連接,而 SMPP 通信代理是客戶(hù)端,需要主動(dòng)連接 SMSC 。短消息網(wǎng)關(guān)處理系統(tǒng)是網(wǎng)關(guān)中最復(fù)雜的處理進(jìn)程,它完成的任務(wù)包括:向 GNS( 匯接網(wǎng)關(guān) ) 查詢(xún)路由,維護(hù)路由表,進(jìn)行協(xié)議轉(zhuǎn)換和數(shù)據(jù)分發(fā)。防火墻系統(tǒng)主要為網(wǎng)關(guān)系統(tǒng)提供安全保障,它包括 IP 包過(guò)濾和身份驗(yàn)證。短信網(wǎng)關(guān)計(jì)費(fèi)系統(tǒng)主要形成各種計(jì)費(fèi)話(huà)單,為計(jì)費(fèi)提供依據(jù)。業(yè)務(wù)管理系統(tǒng)主要完成對(duì)業(yè)務(wù)進(jìn)行統(tǒng)計(jì)報(bào)告,生成報(bào)表,為運(yùn)營(yíng)者對(duì)用戶(hù)數(shù)據(jù)的添加、修改、刪除以及對(duì)網(wǎng)關(guān)系統(tǒng)的監(jiān)控、查詢(xún)、操作和維護(hù)提供接口和界面。

          ?

          3??????? 短消息網(wǎng)關(guān)通信模塊的設(shè)計(jì)與實(shí)現(xiàn)

          短消息網(wǎng)關(guān)通信模塊是整個(gè)短消息網(wǎng)關(guān)的基礎(chǔ)。無(wú)論是計(jì)費(fèi)、統(tǒng)計(jì),還是超時(shí)重傳,高質(zhì)量的通信構(gòu)架是必不可少的保障。這個(gè)通信構(gòu)架不僅要完成基本的收發(fā)消息的功能,而且還要有好的結(jié)構(gòu)以支撐各種業(yè)務(wù)需求,保證良好的擴(kuò)展性。

          3.1.??????? 短消息網(wǎng)關(guān)通信模塊的設(shè)計(jì)

          在設(shè)計(jì)短消息網(wǎng)關(guān)通信模塊時(shí),我們考慮了以下幾點(diǎn):

          第一,由于短消息網(wǎng)關(guān)功能繁多,如果把通信和具體業(yè)務(wù)合在一起開(kāi)發(fā),容易顧此失彼。可能會(huì)因?yàn)殚_(kāi)始的考慮不周全,造成在增加某項(xiàng)新業(yè)務(wù)時(shí)不得不修改通信底層和原來(lái)的業(yè)務(wù)代碼,導(dǎo)致重復(fù)開(kāi)發(fā)。所以我們采用通信代理的方式把通信和具體業(yè)務(wù)分開(kāi),在增加新業(yè)務(wù)時(shí),就只需少量修改通信代理的設(shè)置,而且不必再改動(dòng)原來(lái)的業(yè)務(wù)代碼了。

          第二,通信代理需要同時(shí)偵聽(tīng)多個(gè)端口,我們選用多路復(fù)用 I/O 這種方式。雖然多線(xiàn)程能夠通過(guò)并行計(jì)算和共享內(nèi)存提高代碼效率和資源利用率,但在短消息網(wǎng)關(guān)中,處理的數(shù)據(jù)量大,多線(xiàn)程方式的并行處理會(huì)造成一些消息的邏輯混亂,資源共享也會(huì)增加代碼的復(fù)雜度。而多路復(fù)用使用簡(jiǎn)單,邏輯清晰明了,不易發(fā)生錯(cuò)誤,也不會(huì)出現(xiàn)因資源共享帶來(lái)同步和互斥問(wèn)題。因此使用多路復(fù)用 I/O 是比較合理的。

          第三,業(yè)務(wù)處理模塊與通信代理之間可以使用隊(duì)列進(jìn)行通信,對(duì)隊(duì)列的管理和參數(shù)的設(shè)置(例如對(duì)同一隊(duì)列操作的互斥,以及隊(duì)列個(gè)數(shù)的設(shè)置等)都使用專(zhuān)門(mén)的隊(duì)列內(nèi)核程序統(tǒng)一調(diào)度并封裝成函數(shù)接口,以方便業(yè)務(wù)處理模塊對(duì)隊(duì)列的使用。另外,通過(guò)隊(duì)列通信,也可以為今后增加的業(yè)務(wù)提供良好的擴(kuò)展性。

          第四,為了達(dá)到99.999%的不丟包率,通信代理需要使用流量控制機(jī)制以保證網(wǎng)關(guān)內(nèi)部不丟包。這是因?yàn)闊o(wú)論隊(duì)列設(shè)置有多大,如果出現(xiàn)消息只發(fā)不收的情況,都會(huì)造成隊(duì)列溢出而丟包。因此,為每個(gè)隊(duì)列中緩存的消息做記錄,當(dāng)某個(gè)時(shí)刻隊(duì)列消息的數(shù)量達(dá)到規(guī)定限度,隊(duì)列就不再收包,以保證到達(dá)網(wǎng)關(guān)的消息不會(huì)丟失。

          3.2.??????? 短消息網(wǎng)關(guān)通信模塊的實(shí)現(xiàn)

          基于以上設(shè)計(jì)思路,我們實(shí)現(xiàn)的短消息通信模塊包括四個(gè)父進(jìn)程: CMPP 通信代理 (cmpp_server) SMPP 通信代理 (smpp_server) 、消息分發(fā)處理 server(package_server) 和前轉(zhuǎn)消息處理 server(route_server) 。它們之間通過(guò) 6 個(gè)消息隊(duì)列相互通信。具體的軟件結(jié)構(gòu)如圖 2 所示。

          Cmpp_server 主要為 SP 和網(wǎng)關(guān)之間建立一條高質(zhì)量的傳輸通道。它同時(shí)偵聽(tīng)與它相連的多個(gè) socket ,通過(guò)隊(duì)列接口函數(shù) mqm_send( ) 把接收到的 CMPP 格式的消息送入隊(duì)列 2 中。同時(shí),它也要通過(guò)函數(shù) mqm_recv( ) 不停的從隊(duì)列 1 中獲得消息,并把它轉(zhuǎn)發(fā)到相應(yīng)的目的 SP cmpp_server 不需判斷收到的消息類(lèi)型,只負(fù)責(zé)通信,因此稱(chēng)通信代理。

          Smpp_server cmpp_server 基本一致,唯一不同的只有一點(diǎn): SMPP 協(xié)議規(guī)定 smpp_server 是客戶(hù)端,需要主動(dòng)發(fā)起建立連接的請(qǐng)求;而 CMPP 協(xié)議規(guī)定 cmpp_server 是服務(wù)器端,需等待對(duì)方連接。

          Package_server 是短消息網(wǎng)關(guān)的核心,所有的消息都要經(jīng)過(guò)它,包括協(xié)議轉(zhuǎn)換,超時(shí)重傳,計(jì)費(fèi),路由,都需要在 package_server 中完成。 package_server 同時(shí)監(jiān)聽(tīng) 2 4 6 三個(gè)隊(duì)列,根據(jù)不同的消息頭來(lái)判斷這個(gè)消息的下一個(gè)目的地。路由表也需要在 package_server 中維護(hù),以便 package_server 能得到路由信息,轉(zhuǎn)發(fā)消息。如果路由表中找不到相關(guān)的信息, package_server 就要把該消息轉(zhuǎn)發(fā)給 route_server ,由 route_server 從匯接網(wǎng)關(guān)處獲得路由信息后發(fā)送該消息。

          Route_server 主要處理需要轉(zhuǎn)發(fā)到其他網(wǎng)關(guān)的消息。當(dāng) package_server 發(fā)現(xiàn)消息的目的地不是本地網(wǎng)關(guān)所連的 SP SMSC ,那么它就會(huì)把消息轉(zhuǎn)發(fā)給 route_server 處理。 Route_server 接到消息后與匯接網(wǎng)關(guān)通信,請(qǐng)求目的地的網(wǎng)關(guān)地址,然后與目的網(wǎng)關(guān)建立 socket 連接,交付該消息并記錄前轉(zhuǎn)話(huà)單。

          ?????? 在整個(gè)通信模塊中,所有的 server 都使用隊(duì)列接口函數(shù) mqm_init( ) 初始化消息隊(duì)列并復(fù)接在隊(duì)列上。收發(fā)數(shù)據(jù)使用 mqm_send( ) mqm_recv( ) 函數(shù)完成。存儲(chǔ)消息采用固定的數(shù)據(jù)結(jié)構(gòu),其結(jié)構(gòu)如下:

          struct mqm_connection {

          unsigned int??????????? package_server_seqnum; // 由網(wǎng)關(guān)自行產(chǎn)生。若消息從隊(duì)列 4 中來(lái),該元素將是轉(zhuǎn)化后的 CMPP 協(xié)議格式的消息序列號(hào);若消息從隊(duì)列 2 中來(lái),該元素將是轉(zhuǎn)化后的 SMPP 協(xié)議格式的消息序列號(hào)。

          ?????? short?????? ????????????? mqm_sockfd; // 接收該消息的 socket;

          ?????? short?????? ????????????? mqm_seqnum; // 收到的消息序列號(hào);

          ?????? time_t???? ????????????? mqm_timeout;// 收到該消息的時(shí)間;

          ?????? int?????????? ????????????? total_length; // 該消息的長(zhǎng)度;

          ?????? char????????????? ??? mqm_buf[MAX_PACKET_SIZE]; // 該消息的內(nèi)容;

          char????????????????????? converted_buf[MAX_PACKET_SIZE]; // 轉(zhuǎn)換協(xié)議后的消息內(nèi)容;

          };

          現(xiàn)以 MO 請(qǐng)求業(yè)務(wù)為例,描述通信模塊的工作流程。

          當(dāng) SMSC SMPP 格式的 DELIVER_SM 消息發(fā)出訂閱某個(gè) SP 的言語(yǔ)傳情短消息,經(jīng)由 smpp_server 收到,從隊(duì)列4中轉(zhuǎn)發(fā)給 package_server Package_server 收到 MO 請(qǐng)求后回送給 SP 一個(gè) SMPP 格式的 DELIVER_SM_REP 應(yīng)答消息,并用 mqm_connection 結(jié)構(gòu)體存儲(chǔ)這條 MO 消息的各個(gè)信息。 之后, package_server 就把該消息轉(zhuǎn)換成 CMPP 協(xié)議的 CMPP_Deliver 消息,并通過(guò)隊(duì)列1送到 cmpp_server 中,轉(zhuǎn)發(fā)給目的 SP SP 在接收到這個(gè)消息后,會(huì)產(chǎn)生一個(gè) CMPP 格式 CMPP-_Deliver_Rep 的應(yīng)答消息返回給網(wǎng)關(guān)。當(dāng) package_server 收到了應(yīng)答信號(hào),也需要用 mqm_connection 結(jié)構(gòu)體存儲(chǔ)。這時(shí),一條 MO 短消息轉(zhuǎn)發(fā)成功, package_server 記錄 SMO 話(huà)單。

          下面給出在Linux7.2版本的操作系統(tǒng)下,用C語(yǔ)言實(shí)現(xiàn)的package_server的主要代碼:

          main ()

          {

          ??????? ?????? mqm_init( ); // 初始化隊(duì)列;

          ?????????????? ……

          ?????????????? pipe( ); // 建立管道 ;

          ?????????????? if (( child_pid = fork( ) ) ==0)

          ?????????????? {

          ????????????????????? // 通過(guò)管道通知 2 隊(duì)列有數(shù) ;

          ????????????????????? while(1){

          ?????????????? ???????????????????? get_result_msg_info(REQUEST_2,pipfd2[1]);

          ??????? ??????????????????????????? }

          ?????????????? }

          ?????????????? ……

          ?????????????? // 建立監(jiān)聽(tīng)描述符集 ;

          ?????????????? FD_ZERO ( &monit);

          ?????????????? FD_SET ( )_;

          ?????????????? ……

          ?????????????? // 處理隊(duì)列中來(lái)的數(shù)據(jù)

          ?????????????? while(1)

          ?????????????? {

          ????????????????????? ?select ( ); // 監(jiān)聽(tīng) 2,4,6 隊(duì)列 ;

          ????????????????????? if ( FD_ISSET(queue2,&read_monit ))? // 如果 2 隊(duì)列有數(shù) ;

          ????????????????????? {

          ??????????????????????????????????? handle_queue2_in( );// 處理 2 隊(duì)列來(lái)的數(shù)據(jù) ;

          ????????????????????? }

          ????????????????????? ……

          ?????????????? }//end while;

          } //end main

          4???????? 結(jié)束語(yǔ)

          短消息網(wǎng)關(guān)是 無(wú)線(xiàn)互聯(lián)網(wǎng)短消息業(yè)務(wù)中最為關(guān)鍵的一個(gè)設(shè)備, 它為手機(jī)用戶(hù)和互聯(lián)網(wǎng)的信息資源架起了一座橋梁。本文中短消息網(wǎng)關(guān)的通信模塊設(shè)計(jì)周全,結(jié)構(gòu)合理,為計(jì)費(fèi)、路由、超時(shí)重傳等模塊提供了良好的擴(kuò)展性。經(jīng)實(shí)驗(yàn)室測(cè)試,在奔 2 處理器, 64 兆內(nèi)存的機(jī)器上,收發(fā)包速率為每秒 5000 條,不丟包率達(dá)到 100% ,是一個(gè)穩(wěn)定的系統(tǒng)。

          參考文獻(xiàn)

          [1] 短消息網(wǎng)關(guān)設(shè)備規(guī)范 (V1.2). 中國(guó)移動(dòng)通信集團(tuán)公司, 2001.

          [2] 中國(guó)移動(dòng)通信短消息網(wǎng)關(guān)測(cè)試規(guī)范( V1.2 . 中國(guó)移動(dòng)通信公司, 2001.

          [3] 中國(guó)移動(dòng)通信信息資源站實(shí)體與互聯(lián)網(wǎng)短消息網(wǎng)關(guān)接口協(xié)議( V1.3 . 中國(guó)移動(dòng)通信集團(tuán)公司, 2001.

          [4] Short Message Peer to Peer Protocol Specification v3.4 .SMPP Developers Forum 1999.

          [5] W.Richard Stevens.UNIX 網(wǎng)絡(luò)編程 . 施振川,周利民,孫宏暉等譯 . 清華大學(xué)出版社, 1999.

          ?



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=268295

          posted on 2006-10-19 10:36 注銷(xiāo)..... 閱讀(367) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 宁安市| 西贡区| 尉氏县| 庄浪县| 蓬莱市| 铜川市| 鲁山县| 内江市| 焉耆| 新丰县| 固安县| 翁牛特旗| 上栗县| 衡阳县| 广饶县| 本溪市| 正蓝旗| 青河县| 榆社县| 台湾省| 陕西省| 南丹县| 于都县| 招远市| 灵台县| 利辛县| 奇台县| 宝应县| 志丹县| 四子王旗| 儋州市| 金塔县| 鄂伦春自治旗| 东港市| 定安县| 富顺县| 澎湖县| 庆阳市| 叙永县| 澄江县| 墨竹工卡县|