WiFi Direct的Android端呼叫說明
Wifi直連API的一個說明(給linux端的說明文件)
一、 首先有幾個wifi系統狀態需要說明
WIFI_P2P_STATE_CHANGED_ACTION:當啟用或禁用裝置上的Wi-FiDirect時,發出這個廣播。
WIFI_P2P_PEERS_CHANGED_ACTION:在呼叫discoverPeers()方法時(見後文),發出這個廣播
WIFI_P2P_CONNECTION_CHANGED_ACTION: 在裝置的Wi-Fi連線狀態變化時,發出這個廣播。
WIFI_P2P_THIS_DEVICE_CHANGED_ACTION: 當裝置的細節(如裝置的名稱)發生變化時,發出這個廣播。
上面提到的這些狀態是在進行wifi直連的整個過程中,滿足要求後由系統發出的一種廣播訊息,在Android端可以收到這些訊息,並進行一些邏輯上的響應。
二、 第一步是獲取wifi直連的系統服務
在進行wifi直連之前需要先獲取wifi直連的系統服務WifiP2pManager和一個Channel物件,Channel物件用於把應用程式連線到Wi-Fi Direct框架的整個過程中。程式碼如下:
WifiP2pManager manager=(WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); Channel channel=manager.initialize(this, getMainLooper(), null) |
關於Channel的原始碼說明:A channel that connects the application to the Wifi p2pframework.Most p2p operations require a Channel as an argument.
三、 第二步需要獲取對等點裝置
這一步需要呼叫discoverPeers函式來搜尋一定的範圍內檢查有效的對等點裝置。如果發現處理成功,並檢測到對等裝置,系統會發送上文提到的WIFI_P2P_PEERS_CHANGED_ACTION廣播訊息,這樣便能呼叫函式requestPeers()以便獲得對等裝置的列表。如下面程式碼:
/** 下面的第二個引數不用管,他是Android的一個監聽器,用來返回檢測成功或者失敗的訊息,它並不提供發現的相關實際對等裝置的任何資訊,第一個引數是上文得到的一個channel*/ manager.discoverPeers(channel,newWifiP2pManager.ActionListener()) //點函式 /** 當收到WIFI_P2P_PEERS_CHANGED_ACTION訊息時呼叫此函式來獲得對等點列表,其中第二引數是一個監聽器,獲取列表的函式封裝在這個觸發器中*/ manager.requestPeers(channel, myPeerListListener); /** 此函式是系統自動呼叫的函式,它封裝在上面的myPeerListListener監聽器中,需要自己實現函式內部的邏輯來獲得點對點列表,其中點對點的列表資訊封裝在peerList變數中,呼叫其getDeviceList()函式即可返回一個List<WifiP2pDevice> 型別的列表,裡面包含每一個WifiP2pDevic型別的物件,裡面包含一些裝置資訊,如需需要可進一步檢視原始碼*/ public void onPeersAvailable(WifiP2pDeviceList peerList){ peerList.getDeviceList() } |
四、 連線對等點裝置
這一步需要通過上一步獲得的對等點裝置資訊來進行連線。首先連線前需要一個WifiP2pConfig config物件將要連線的裝置資訊封裝到裡面,其中便包括裝置的實體地址。接著就可以呼叫connect函式來進行連線。
/** 封裝裝置資訊到WifiP2pConfig config中*/ WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = device.deviceAddress; config.groupOwnerIntent=0; config.wps.setup = WpsInfo.PBC; /** 呼叫connect函式連線點對點裝置,第二個引數是一個監聽器,不用管,它只返回連線成功與否並可以讓你進行一些提示性的處理*/ manager.connect(channel, config, newActionListener()) |
五、 獲取連線資訊
上一步的connect只是在連線初始化成功與否後通知你,此時還需要獲取裝置的連線資訊。當連線資訊發生變化時系統會發出WIFI_P2P_CONNECTION_CHANGED_ACTION的廣播資訊,收到資訊後需要呼叫requestConnectionInfo()函式來獲取連線資訊,程式碼如下
/** 第二個引數是一個監聽器,當連線成功後,系統會自動呼叫,在這個監聽器中呼叫onConnectionInfoAvailable()函式來獲取連線的資訊*/ mManager.requestConnectionInfo(mChannel, connectionListener) /** 此函式是封裝在上面第二個引數裡面的函式,是系統自動呼叫的,他的引數ifno裡面包含了連線的資訊,*/ public void onConnectionInfoAvailable(final WifiP2pInfo info) { // InetAddress在WifiP2pInfo結構體中。 InetAddress groupOwnerAddress = info.groupOwnerAddress.getHostAddress()); //組群協商後,就可以確定群主。 if (info.groupFormed && info.isGroupOwner) { //針對群主做某些任務。 //一種常用的做法是,建立一個伺服器執行緒並接收連線請求。 } else if (info.groupFormed) { //其他裝置都作為客戶端。在這種情況下,你會希望建立一個客戶端執行緒來連線群主。 } } |
在onConnectionInfoAvailable函式裡面呼叫info.groupOwnerAddress.getHostAddress()函式即可得到群主ip地址,下面就可以進行通訊 了
說明:對於整個連線過程Channel的具體作用,如果需要了解得具體看原始碼。在Android端僅需要呼叫函式獲得一個Channel即可。