天天看點

WIFI DIRECT開發(三)P2P傳輸技術-WIFI Direct部分引用他人的部落格。表示感謝一.産品的體系結構二.Wi-Fi 直連(WiFi direct)三 産品設計原理 

部分引用他人的部落格。表示感謝

一.産品的體系結構

WiFi子產品主要包括三部分:WLAN Station,WiFi Direct, Mobileap(Hotspot)(熱點) ,應用主要涉及上網、列印、檔案傳輸、熱點共享、遠端控制、區域網路等方面。

我們所做的應用主要是涉及到了WiFidirect的一些API。是以在其他方面就不多做介紹了。

1關于WLAN的UI圖

幾乎所有較新的Android手機都支援WLAN直連(WiFidirect)功能,UI層主要有兩個入口,其中一個直接進入(WifiP2pSettings),是以這也是我們為什麼要開發這個軟體的原因之一。

2 UI層的分解圖:

搜尋顯示出的每一個裝置,實際上都被封裝成了一個個Preference對象。

二.Wi-Fi 直連(WiFi direct)

1.WiFi direct簡述

Wi-Fi 直連技術允許已經配備了相應硬體并預裝了Android 4.0(API level 14)或更後的作業系統的裝置在不需要Wi-Fi中間熱點的支援下通過Wi-Fi直接互聯的技術。使用這些API,你可以發現和連接配接其他支援此技術的裝置,然後以距離遠超藍牙連接配接技術且速度更快的方式進行通信。這項技術對于一些多使用者共享資料,比如多使用者聯機遊戲或者相片分享等應用非常有用。

2.WiFi direct API簡介

Wi-Fi直連技術的API包含以下主要部分:

允許使用者發現,請求然後連接配接對等裝置的各種方法,定義在WifiP2pManager類中。

允許使用者定義收到調用WifiP2pManager類中方法成功或失敗的通知的監聽器。當使用者調用WifiP2pManager類中的方法時,每一個方法都可以收到一個以參數形式傳過來的特定監聽。

通知使用者被Wi-Fi直連技術架構檢測到的特定事件的意圖,比如一個已丢掉的連接配接或者一個新的對等裝置的發現等。

你經常會同時使用這三個主要元件的相關功能。例如,你可以為去調用android.net.wifi.p2p.WifiP2pManager.ActionListener) discoverPeers()方法而提供一個WifiP2pManager.ActionListener的監聽器,這樣以後你可以收到一個ActionListener.onSuccess()或者ActionListener.onFailure()方法的通知。一個WIFI_P2P_PEERS_CHANGED_ACTION意圖同時也是當android.net.wifi.p2p.WifiP2pManager.ActionListener) discoverPeers()方法發現的對等裝置清單發生改變時的一個廣播。

3.WiFi direct API方法詳解

WifiP2pManager類提供了很多方法允許使用者通過裝置的Wi-Fi子產品來進行互動,比如做一些如發現,連接配接其他對等裝置的事情。下列的方法都是可以使用的: 表格1.Wi-Fi直連技術方法

方法名 較長的描述
initialize() 通過Wi-Fi架構對應用來進行注冊。這個方法必須在任何其他Wi-Fi直連方法使用之前調用。
connect()] 開始一個擁有特定設定的裝置的點對點連接配接。
cancelConnect() 取消任何一個正在進行的點對點組的連接配接。
requestConnectInfo() 擷取一個裝置的連接配接資訊。
createGroup() 以目前裝置為組擁有者來建立一個點對點連接配接組。
removeGroup() 移除目前的點對點連接配接組。
requestGroupInfo() 擷取點對點連接配接組的資訊。
discoverPeers() 初始化對等裝置的發現。
requestPeers() 擷取目前發現的對等裝置清單。

WifiP2pManager的方法可以讓你在一個監聽器裡傳遞參數,這樣Wi-fi直連架構就可以通知給你的窗體這個方法調用的狀态。可以被使用的監聽器接口和使用監聽器的相應的WifiP2pManager的方法的調用都将在下面這張表中有所描述:

表格 2. Wi-Fi直連監聽器方法

監聽器接口 相關聯的方法
WifiP2pManager.ActionListener connect(), cancelConnect(), createGroup(), removeGroup(), and discoverPeers()
WifiP2pManager.ChannelListener initialize()
WifiP2pManager.ConnectionInfoListener requestConnectInfo()
WifiP2pManager.GroupInfoListener requestGroupInfo()
WifiP2pManager.PeerListListener requestPeers()

Wi-Fi直連技術的API定義了一些當特定的Wi-Fi直連事件發生時作為廣播的意圖,比如說當一個新的對等裝置被發現,或者一個裝置的Wi-Fi狀态的改變。你可以在你的應用裡通過建立一個處理這些意圖的廣播接收器來注冊去接收這些意圖。

Table 3. Wi-Fi 直連意圖

意圖名稱 較長的描述
WIFI_P2P_CONNECTION_CHANGED_ACTION 當裝置的Wi-Fi連接配接資訊狀态改變時候進行廣播。
WIFI_P2P_PEERS_CHANGED_ACTION 當調用discoverPeers()方法的時候進行廣播。在你的應用裡處理此意圖時,你通常會調用requestPeers()去獲得對等裝置清單的更新。
WIFI_P2P_STATE_CHANGED_ACTION 當裝置的Wi-Fi 直連功能打開或關閉時進行廣播。
WIFI_P2P_THIS_DEVICE_CHANGED_ACTION 當裝置的詳細資訊改變的時候進行廣播,比如裝置的名稱

三 産品設計原理 

1.建立一個Wi-Fi直連意圖使用的廣播接收器

一個廣播接收器允許你接收由android系統釋出的意圖廣播,這樣你的應用就可以對那些你感興趣的事件作出響應。建立一個基本的Wi-Fi直連意圖使用的廣播接收器的步驟如下:

1.建立一個繼承自BroadcastReceiver的類。對于類的構造,一般最常用的就是以WifiP2pManager, WifiP2pManager.Channel作為參數,同時這個廣播接收器對應的窗體也将被注冊進來。這個廣播接收器可以像窗體發送更新或者在需要的時候可以通路Wi-Fi硬體或通信通道。

2.在廣播接收器裡,處理onReceive()方法裡你感興趣的意圖。執行接收到的意圖的任何需要的動作。比如,廣播接收器接收到一個WIFI_P2P_PEERS_CHANGED_ACTION的意圖,你就要調用requestPeers()方法去獲得目前發現的對等裝置清單。

2建立一個Wi-Fi直連的應用

建立一個Wi-Fi直連的應用包括建立和注冊一個廣播接收器,發現其他裝置,連接配接其他裝置,然後傳輸資料等步驟。接下來的幾個部分描述了怎麼去做這些工作。

2.1初始化設定

在使用Wi-Fi直連的API之前,你必須確定你的應用可以通路裝置的硬體并且你的裝置要支援Wi-Fi直連的通訊協定。如果Wi-Fi直連技術是支援的,你可以獲得一個WifiP2pManager的執行個體對象,然後建立并注冊你的廣播接收器,然後開始使用Wi-Fi直連的API方法。

1.為裝置的Wi-Fi硬體擷取權限并在Android的清單檔案中聲明你的應用正确使用的最低SDK版本:

2.檢查裝置是否支援Wi-Fi直連技術。一種好的解決辦法是當你的廣播接收器接收到一個WIFI_P2P_STATE_CHANGED_ACTION意圖。通知你的窗體Wi-Fi直連的狀态和相應的反應。

3.在你的窗體的onCreate()方法裡,獲得一個WifiP2pManager的執行個體并調用initialize()方法通過Wi-Fi直連架構去注冊你的應用。這個方法傳回一個WifiP2pManager.Channel對象,是被用來連接配接你的應用和Wi-Fi直連架構的。你應該再建立一個以WifiP2pManager和WifiP2pManager.Channel為參數且關聯你的窗體的廣播接收器的執行個體。這樣你的廣播接收器就可以接收到你感興趣的事件去通知你的窗體并更新它。它還可以讓你在需要的時候操縱裝置的Wi-Fi狀态。

4.建立一個意圖過濾器并把它添加在你的廣播接收器需要處理的意圖上。

5.注冊你的廣播接收器在窗體的onResume()方法,解除注冊在onPause()方法中。

6.當你擷取到一個WifiP2pManager.Channel對象并且設定好你的廣播接收器時,你的應用就可以調用Wi-Fi直連的方法并且可以接收Wi-Fi直連的意圖。

你可以現在就通過調用WifiP2pManager中的方法取實作你的應用體驗Wi-Fi直連技術的特性了。下面的章節描述了怎樣去實作一些常用的操作,比如說發現其他裝置和連接配接它們。

2.2發現對等裝置

要發現可以使用并連接配接的對等裝置,調用discoverPeers()方法去檢測在範圍内的可使用裝置。這個方法的調用是異步的同時如果你建立了一個WifiP2pManager.ActionListener監聽器的話你會通過onSuccess()或者onFailure()方法收到發現成功或失敗的消息。onSuccess()方法隻能通知你發現的過程是否成功而不能提供任何關于發現裝置的資訊:

如果發現過程成功且檢測到了對等裝置,系統将會廣播出一個WIFI_P2P_PEERS_CHANGED_ACTION意圖,這樣你就可以利用廣播監聽器監聽并獲得發現裝置的清單。當你的應用接收到WIFI_P2P_PEERS_CHANGED_ACTION意圖時,你就可以調用requestPeers()方法來擷取發現裝置的清單

2.3連接配接到裝置

當你已經找到你要連接配接的裝置在獲得發現裝置清單之後,調用connect()方法去連接配接指定裝置。這個方法的調用需要一個包含待連接配接裝置資訊的WifiP2pConfig對象。你可以通過WifiP2pManager.ActionListener接收到連接配接是否成功的通知。下面的代碼展示了怎樣去連接配接一個想得到的連接配接:

2.4資料傳輸

一旦連接配接已經建立,你可以通過套接字來進行資料的傳輸。基本的資料傳輸步驟如下:

1.建立一個ServerSocket對象。這個服務端套接字對象等待一個來自指定位址和端口的用戶端的連接配接且阻塞線程直到連接配接發生,是以把它建立在一個背景線程裡。

2.建立一個用戶端Socket.這個用戶端套接字對象使用指定ip位址和端口去連接配接服務端裝置。

3.從用戶端給服務端發送資料。當用戶端成功連接配接服務端裝置後,你可以通過位元組流從用戶端給服務端發送資料。

4.服務端等待用戶端的連接配接(使用accept()方法)。這個調用阻塞服務端線程直到用戶端連接配接上,是以叫這個過程一個新的線程。當連接配接建立時,服務端就可以接受來自用戶端的資料。