1. 程式人生 > >WiFi Direct的Android端呼叫說明

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即可。