摘 要: 移動通信技術(shù)的迅速發(fā)展使得頻譜資源日益緊缺,人們對了解附近感興趣的事物并與之通信的需求日漸增加,這些問題對現(xiàn)有的通信方式提出了挑戰(zhàn)。D2D通信在系統(tǒng)的控制下復(fù)用小區(qū)資源,能夠減小小區(qū)網(wǎng)絡(luò)的負載,實現(xiàn)端到端直接通信及資源共享。研究并設(shè)計實現(xiàn)了以JXTA協(xié)議為基礎(chǔ)、以WiFi為通信媒質(zhì)、以Android OS為運行平臺的無線D2D通信系統(tǒng)。
關(guān)鍵詞: D2D(Device to Device);JXTA;WiFi;Android
移動通信系統(tǒng)的演進和發(fā)展呈現(xiàn)許多新特點。一方面有限的帶寬資源滿足不了實際的應(yīng)用需要,另一方面社交網(wǎng)絡(luò)、朋友間近距離資源共享、本地廣告等應(yīng)用的流行使得人們對了解附近感興趣的事物并與之通信的需求逐漸增加。同時,在智能家居、安全監(jiān)控等M2M應(yīng)用中,網(wǎng)關(guān)和傳感器之間需要一種能夠令距離較近的設(shè)備之間高效通信的技術(shù)手段。D2D通信是一種在系統(tǒng)控制下復(fù)用小區(qū)資源的技術(shù)。在系統(tǒng)的控制下實現(xiàn)設(shè)備到設(shè)備直接通信而不必經(jīng)過基站,能夠減小小區(qū)網(wǎng)絡(luò)的負載,增加蜂窩通信系統(tǒng)頻譜效率,在一定程度上解決無線通信系統(tǒng)的頻譜資源匱乏的問題。同時具有干擾可控、減少移動終端的電池功耗等優(yōu)點。目前,國際標準化組織已經(jīng)開始研究D2D技術(shù),3GPP也引入了WiFi進行數(shù)據(jù)通信的方案??梢灶A(yù)見D2D技術(shù)將會有廣闊的前景。
JXTA是SUN公司推出的一組P2P組網(wǎng)規(guī)范,提供了開發(fā)基于P2P應(yīng)用程序的基本組件[1]。JXTA獨立于操作系統(tǒng)與編程語言,因此JXTA應(yīng)用能運行于所有實現(xiàn)該協(xié)議的平臺。JXTA也是網(wǎng)絡(luò)無關(guān)的,JXTA能利用TCP/IP、HTTP等傳輸協(xié)議和藍牙、WiFi等傳輸媒質(zhì)傳輸。因此位于不同平臺甚至不同網(wǎng)絡(luò)的對等體可以通過標準JXTA協(xié)議通信。利用JXTA開發(fā)D2D系統(tǒng)可以屏蔽傳輸協(xié)議和傳輸方式,從更高的層次構(gòu)建系統(tǒng)。
本文研究并設(shè)計實現(xiàn)了以JXTA協(xié)議為基礎(chǔ)、以WiFi為通信媒質(zhì)、以Android OS為運行平臺的無線D2D通信系統(tǒng),并通過網(wǎng)絡(luò)實驗驗證了其有效性。
1 D2D通信系統(tǒng)模型
本系統(tǒng)主要用來實現(xiàn)智能終端間的通信和文件共享。D2D網(wǎng)絡(luò)中實現(xiàn)了一個或多個JXTA協(xié)議的設(shè)備稱為對等體(Peer)。由于JXTA協(xié)議的平臺無關(guān)性,網(wǎng)絡(luò)中的對等體可以是手機、PC或其他智能設(shè)備。對等體之間可以相互通信,共享對方的資源。系統(tǒng)模型如圖1所示。
D2D網(wǎng)絡(luò)采用半分布式結(jié)構(gòu)。網(wǎng)絡(luò)中的集合點是一個特殊的對等體,相當于C/S模式下的服務(wù)器[2]。不同之處在于,D2D網(wǎng)絡(luò)中任何對等體都可以是集合點,其與普通對等體的比例可以人為設(shè)置。集合點負責(zé)收集和發(fā)送對等體列表和資源信息,起到系統(tǒng)調(diào)度的作用。對等體可以通過集合點獲取存在的對等體列表和資源列表。對等體獲得列表后,就可訪問D2D網(wǎng)絡(luò)中的任意對等體,向目標對等體發(fā)送聊天信息,以及獲取感興趣的資源。
系統(tǒng)主要分為對等體發(fā)現(xiàn)、聊天和文件共享3個部分。打開應(yīng)用程序后,系統(tǒng)首先檢查是否已接入WiFi網(wǎng)絡(luò),若未接入,會提醒用戶接入網(wǎng)絡(luò)。連上WiFi后開始加入JXTA網(wǎng)絡(luò),搜索網(wǎng)絡(luò)集合點RDV,讀取上面的對等體列表。聊天功能用綁定好的管道服務(wù)實現(xiàn)。文件共享時,用戶節(jié)點需向集合點請求附近節(jié)點的資源列表。集合點收到請求信息后,以xml格式反饋資源列表。這時,用戶根據(jù)列表信息向相關(guān)節(jié)點發(fā)送文件傳輸請求,經(jīng)握手后就可以傳輸文件。JXTA通信模型如圖2所示。
2 D2D通信系統(tǒng)的實現(xiàn)
與JXTA通信模型對應(yīng),通信系統(tǒng)的軟件實現(xiàn)由網(wǎng)絡(luò)配置模塊、對等體發(fā)現(xiàn)模塊、聊天模塊、文件共享模塊和用戶界面模塊5個模塊組成。
2.1 網(wǎng)絡(luò)配置
應(yīng)用程序啟動后,系統(tǒng)檢查當前網(wǎng)絡(luò)配置。若WiFi網(wǎng)絡(luò)不可用,則提醒用戶重新配置網(wǎng)絡(luò)[3-4]。
若用戶已接入WiFi網(wǎng)絡(luò),系統(tǒng)會完成檢查緩存情況、啟動JXTA網(wǎng)絡(luò)連接、搜索JXTA集合點RDV并讀取集合點上的對等體列表等初始化操作。初始化完成后進入用戶界面。判斷是否有可用WiFi網(wǎng)絡(luò)過程如下:
(1)創(chuàng)建網(wǎng)絡(luò)連接管理對象,判斷是否有網(wǎng)絡(luò)連接:
ConnectivityManager mConnectivityManager=
(ConnectivityManager)context.getSystemService
(Context.CONNECTIVITY_SERVICE);
獲取網(wǎng)絡(luò)信息:
NetworkInfo mNetworkInfo=
mConnectivityManager.getActiveNetworkInfo();
判斷網(wǎng)絡(luò)是否連接:
return mNetworkInfo.isAvailable();
若網(wǎng)絡(luò)沒有連接,則提醒用戶。
(2)判斷網(wǎng)絡(luò)是否可用:
NetworkInfo mWiFiNetworkInfo=
mConnectivityManager.getNetworkInfo
(ConnectivityManager.TYPE_WiFi);
return mWiFiNetworkInfo.isAvailable();
若網(wǎng)絡(luò)不可用,提醒用戶接入可用網(wǎng)絡(luò)。
2.2 對等體發(fā)現(xiàn)
該對等體的發(fā)現(xiàn)與查找用對等機發(fā)現(xiàn)協(xié)議(Peer Discovery Protocol)實現(xiàn)。Advertisement是對等體之間各種信息交流的基本單元,發(fā)現(xiàn)其他Peer及其資源的問題就轉(zhuǎn)換為發(fā)現(xiàn)描述各資源的Advertisement的問題,只要找到對應(yīng)的Advertisement,就相當于找到了該資源。PDP定義了發(fā)現(xiàn)其他Peer和資源的協(xié)議,該協(xié)議包括兩個方面[2],一方面用于請求獲得其他Peer的Advertisement;另一方面用于響應(yīng)其他Peer的這種請求。對等體發(fā)現(xiàn)過程如下:
(1)系統(tǒng)啟動時,先加入一個公共組來獲得對等組提供的發(fā)現(xiàn)服務(wù):
PeerGroup netPeerGroup=
PeerGroupFactory.newNetPeerGroup();
(2)發(fā)布上線Advertisement,加入D2D網(wǎng)絡(luò):
public void remotePublish(Advertisement adv,int type);
(3)利用對等體發(fā)現(xiàn)服務(wù)向集合點請求對等體列表:
discovery=netPeerGroup.getDiscoveryService();
discovery.addDiscoveryListener(this);
discovery.getRemoteAdvertisements(null,
DiscoveryService.PEER,null,null);
發(fā)現(xiàn)過程中添加了監(jiān)聽器,每當收到集合點的反饋消息時就可以立即捕獲并處理。發(fā)現(xiàn)過程每隔30 s執(zhí)行一次,用來獲取最新對等體列表。
2.3 聊天模塊
聊天模塊用來實現(xiàn)點對點的文字傳輸,文字編碼采用UTF-8。消息通過JxtaBiDiPipe、JxtaServerPipe雙向管道傳輸。待發(fā)送的消息經(jīng)XML打包后經(jīng)管道傳輸給接收方。接收方解析出該消息的內(nèi)容,根據(jù)消息內(nèi)容做相應(yīng)的處理。消息中包含有發(fā)送者信息及所有用戶都遵守的其他操作信息,若是聊天信息則把消息顯示到UI。因此可以通過擴充消息規(guī)范增強管道通信的能力。JxtaBiDiPipe、JxtaServerPipe與java JDK里的Socket和ServerSocket非常類似。聊天模塊實現(xiàn)過程如下:
(1)用戶上線后需獲得一個JxtaServerPipe實例:
JxtaServerPipe serverPipe=
new JxtaServerPipe(netPeerGroup,pipeAdv);
上述對象用來監(jiān)聽端口的連接。獲得發(fā)送方通信請求后生成用于通信的管道:
JxtaBiDiPipe bidipipe=serverPipe.accept();
accept()方法在獲得發(fā)送方連接之前都處于阻塞狀態(tài)。
(2)用戶需要發(fā)送消息時,主動獲得發(fā)送管道:
JxtaBiDiPipi bidipipe=
new JxtaBiDiPipe(peergroup,pipeAdv,20000,this,true);
(3)上述(1)中的對象監(jiān)聽到(2)中對象的連接請求,獲得接收管道,此時雙方可以互相通信。
(4)收到的消息放到接收隊列里,根據(jù)用戶的輸入及消息的內(nèi)容把消息顯示在UI或觸發(fā)其他期望的動作。聊天界面如圖3所示。
與單向管道(InputPipe、OutputPipe)的異步不可靠傳輸(類似于UDP)對應(yīng),雙向同步管道提供了安全、可靠的傳輸機制,適用于傳輸文字、圖片等小批量內(nèi)容。
2.4 文件共享
文件共享用來獲得節(jié)點共享的文件。與聊天模塊不同的是,對等體需先得到資源列表,確定所需要的資源后再建立與目標對等體的連接。文件傳輸及其資源獲取通過p2psocket開發(fā)包實現(xiàn)[5]。文件傳輸過程如下:
(1)對等體A向?qū)Φ润wB和集合點發(fā)送資源列表請求。請求信息用BaseMessage類或其子類實現(xiàn)。
(2)集合點與對等體B均有用pipeMsgEvent實現(xiàn)的接口PipeMsgListener,每當有消息傳送到輸入管道時,事件被捕獲。若捕獲到的消息是共享列表請求,則集合點與對等體B通過doFileListRequest( )函數(shù)向A發(fā)送一個包含文件共享列表的消息。
(3)對等體A通過自己的pipeMsgEvent接收到文件列表,并顯示。用戶選中感興趣的文件并向?qū)Φ润wB發(fā)送文件下載請求。如圖4所示。
(4)對等體捕獲下載共享文件的請求后,先分析出對方請求的文件名,隨后利用doFileDownloadRequest( )函數(shù)將指定文件流打包成BaseMessage,并發(fā)送給對方。
(5)對等體A捕獲包含下載文件流的消息后,先分析出下載文件的名字,然后存儲到文件中。
(6)對等體B與A握手后,調(diào)用fileTransfer( )函數(shù),以流的形式將文件傳輸給A,A也以流的形式接收文件,并通過File類及緩沖流把緩沖區(qū)的文件轉(zhuǎn)換成磁盤中的文件。
本文研究并設(shè)計實現(xiàn)了以JXTA協(xié)議為基礎(chǔ),以WiFi為通信媒質(zhì),以Android OS為運行平臺的無線D2D通信系統(tǒng)。該系統(tǒng)能以現(xiàn)有的數(shù)臺近距離的智能手機為基礎(chǔ),建立起一個無線D2D 網(wǎng)絡(luò),使得這些用戶之間能夠方便地進行通信與資源共享,這將成為諸多用戶豐富自身手機資源的有效途徑。
參考文獻
[1] BROOKSHIER D著.Java P2P程序設(shè)計[M].常曉波,李靜,譯.北京:中國電力出版社,2002.
[2] OAKS S,TRAVERSAT B,Li Gong,著.JXTA技術(shù)手冊[M]. 技橋,譯.北京:清華大學(xué)出版社,2004.
[3] 張利國,代聞,龔海平.Android移動開發(fā)案例詳解[M]. 北京:人民郵電出版社,2010.
[4] 余志龍,陳昱勛,鄭名杰,等編著.Google Android SDK開發(fā)案例大全(第2版)[M].北京:人民郵電出版社,2011.
[5] 許斌.JXTA-Java P2P網(wǎng)絡(luò)編程技術(shù)[M].北京:清華大學(xué)出版社,2003.