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