Android中的WiFi P2P

來源:互聯網
上載者:User

Android中的WiFi P2P

Android中的WiFi P2P能夠允許一定範圍內的裝置通過Wifi直接互連而不必通過熱點或互連網。

使用WiFi P2P需要Android API Level >= 14才可以,而且不要忘記在Manifest檔案中加入下面5個許可權:

● android.permission.ACCESS_WIFI_STATE

● android.permission.CHANGE_WIFI_STATE

● android.permission.ACCESS_NETWORK_STATE

● android.permission.CHANGE_NETWORK_STATE

● android.permission.INTERNET (WiFi P2P並不需要串連互連網,但是因為要用到Java Socket,所以要加這個許可權)

 

關於WiFi P2P的操作幾乎都靠WifiP2pManager來進行,所以如果你的程式要用到WiFi P2P功能,可以設定一個全域變數wifiP2pManager,然後在onCreate()生命函數中擷取系統WifiP2pManager對象:

 

wifiP2pManager = (WifiP2pManager) getApplicationContext().getSystemService(Context.WIFI_P2P_SERVICE);

WifiP2pManager有如下方法可以很方便的進行P2P操作:

 

 

方法 功能
initialize() 在使用WiFi P2P功能時必須先調用這個方法,用來通過WiFi P2P架構註冊我們的應用
connect() 根據配置(WifiP2pConfig對象)與指定裝置(WifiP2pDevice對象)進行P2P串連
cancelConnect() 關閉某個P2P串連
requestConnectInfo() 擷取裝置的串連資訊
createGroup() 以當前的裝置為組長建立P2P小組
removeGroup() 移除當前的P2P小組
requestGroupInfo() 擷取P2P小組的資訊
discoverPeers() 初始化peers發現操作
requestPeers() 擷取當前的peers列表(通過discoverPeers發現來的)
每當WifiP2pManager執行某個P2P操作時,可以通過不同的監聽器來檢測這些操作的反饋結果,這些監聽器的類型如下:

 

 

監聽器 關聯的行為
WifiP2pManager.ActionListener connect(), cancelConnect(), createGroup(), removeGroup()discoverPeers()
WifiP2pManager.ChannelListener initialize()
WifiP2pManager.ConnectionInfoListener requestConnectInfo()
WifiP2pManager.GroupInfoListener requestGroupInfo()
WifiP2pManager.PeerListListener requestPeers()

 

那麼接下來就可以講解如何使用WiFi P2P了。

 

 

一. 準備工作

準備階段需要讓我們的應用可以接受P2P訊號,這就需要一個意圖廣播接收器,要建立一個符合我們要求的廣播接收器需要準備下面3個要素:

(1) 一個意圖廣播接收器,用來接受意圖廣播。

(2) 通過WifiP2pManager的initialize()初始化操作來擷取一個Channel對象,用於以後和WiFi P2P架構保持通訊。

(3) 自己封裝BroadcastReceiver類,實現一個接收器。

 

意圖過濾器使用如下方法建立:

 

// 設定intent過濾器intentFilter = new IntentFilter();  //一個全域的intentFilter對象intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);       // WiFi P2P是否可用intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);       // peers列表發生變化intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);  // WiFi P2P串連發生變化intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); // WiFi P2P裝置資訊發生變化(比如更改了裝置名稱)

 


Channel的擷取方法:

 

channel = wifiP2pManager.initialize(getApplicationContext(), getMainLooper(), null); // channel是一個全域的Channel對象

 

意圖廣播接收器的建立需要通過繼承BroadcastReceiver類來自己實現,下面給出了一段樣本:

 

class MyBroadcastReceiver extends BroadcastReceiver {// 使用WiFi P2P時,自己定義的BroadcastReceiver的建構函式一定要包含下面這三個要素private WifiP2pManager wifiP2pManager;private Channel channel;private Activity activity;public MyBroadcastReceiver(WifiP2pManager wifiP2pManager, Channel channel, Activity activity) {this.wifiP2pManager = wifiP2pManager;this.channel = channel;this.activity = activity;}// onReceiver對相應的intent進行處理@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {// WiFi P2P 可以使用} else {// WiFi P2P 不可以使用}} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {}}}

 

 

定義完了之後就可以再需要的地方執行個體化一個意圖廣播接收器對象了:

 

broadcastReceiver = new MyBroadcastReceiver(wifiP2pManager, channel, this);

 

那麼三個要素都具備了之後就要嚮應用註冊我們的接收器,好讓它可以開始工作:

 

registerReceiver(broadcastReceiver, intentFilter);


 

 

二. 啟動peers發現

 

public void discoverPeers(View view) {peerListListener = new WifiP2pManager.PeerListListener() {@Overridepublic void onPeersAvailable(WifiP2pDeviceList peerList) {peers.clear();   // peers是一個全域ArrayList對象,用於儲存發現的peers的資訊peers.addAll(peerList.getDeviceList());// 如果你有一個控制項用來顯示這些peers的資訊,就可以再這裡更新了}};wifiP2pManager.discoverPeers(channel, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {Toast.makeText(getApplicationContext(), "discover peers!", Toast.LENGTH_SHORT);}@Overridepublic void onFailure(int arg0) {}});// discoverPeers是非同步執行的,調用了之後會立刻返回,但是發現的過程一直在進行,// 直到發現了某個裝置時就會通知你}


 

當發現了裝置之後就會觸發WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION意圖廣播,你可以再之前自己封裝的BroadcastReceiver類中加入對這一意圖的處理:

 

else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {if (wifiP2pManager != null) {wifiP2pManager.requestPeers(channel, peerListListener);}}

 


 

三. 與peers建立串連

 

public void connect() {final WifiP2pDevice device = (WifiP2pDevice) peers.get(0); //從peers列表中擷取發現來的第一個裝置WifiP2pConfig config = new WifiP2pConfig();config.deviceAddress = device.deviceAddress;config.wps.setup = WpsInfo.PBC;wifiP2pManager.connect(channel, config, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {// 串連成功Toast.makeText(getApplicationContext(), "與裝置" + device.deviceName + "串連成功", Toast.LENGTH_LONG).show();}@Overridepublic void onFailure(int arg0) {// 串連失敗Toast.makeText(getApplicationContext(), "與裝置" + device.deviceName + "串連失敗", Toast.LENGTH_LONG).show();}});}

 

 

每當有P2P串連狀態發生改變時,就會觸發WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION意圖廣播,可以在之前你自己封裝的BroadcastReceiver類中加入對這一意圖的處理:

 

else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {if (wifiP2pManager == null)return;NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);if (networkInfo.isConnected()) {// We are connected with the other device, request// connection// info to find group owner IPwifiP2pManager.requestConnectionInfo(channel, new WifiP2pManager.ConnectionInfoListener() {@Overridepublic void onConnectionInfoAvailable(WifiP2pInfo info) {// 這裡可以查看變化後的網路資訊// 通過傳遞進來的WifiP2pInfo參數擷取變化後的地址資訊InetAddress groupOwnerAddress = info.groupOwnerAddress;// 通過協商,決定一個小組的組長if (info.groupFormed && info.isGroupOwner) {// 這裡執行P2P小組組長的任務。// 通常是建立一個服務線程來監聽用戶端的請求} else if (info.groupFormed) {// 這裡執行普通組員的任務// 通常是建立一個用戶端向組長的伺服器發送請求}}});}}


 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.