1. 程式人生 > >WifiP2p點對點連線的詳解

WifiP2p點對點連線的詳解

一.WifiP2p的描述

wifiP2p是不需要聯網的,只需要手機開啟wlan就可以連線通訊的;底部的通訊原理是Binder通訊

二.WifiP2p的操作流程

   1.許可權申請

   2.設定廣播,用來獲取WIfiP2p各種變化時候的資訊

   3.獲取WifiP2pManager和WifiP2pManager.channel

   4.開啟掃描,兩臺手機都需要開啟掃描

   5.通過廣播的回撥獲取到搜尋的手機列表

   6.連線;因為當兩臺手機連線的時候,會生成一個組,我們可以通過廣播回撥獲取組的owner資訊

   7.socket通訊,將組的owner做完服務端,其它做完客戶端

 三.許可權申請

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

四.設定廣播用來獲取WifiP2p的各種變化時候的資訊

  public static IntentFilter initIntentFilter(){
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);   //當WifiP2p連線狀態改變的時候回撥,注意需要分清是關閉連線還是開啟連線
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);    //當Wifi狀態發生改變的時候呼叫, 也可能是Wifi開啟和關閉
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);    //當wifi搜尋列表發生改變的時候呼叫,可以獲取Wifi搜尋到的列表資料
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); //當Wifi本身資訊發生改變的時候呼叫,可以獲取到自身Device的資訊
        return intentFilter;
    }
 @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(action.equals(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)){
            NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
            if(networkInfo.isConnected()){
                WifiP2pInfo wifiP2pInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO);
                deviceActionListener.connect(wifiP2pInfo);
                deviceActionListener.updateStatus("連線狀態中");
            }
        }else if(action.equals(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)){
            WifiP2pDeviceList wifiP2pDeviceList = intent.getParcelableExtra(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
            List<WifiP2pDevice> p2pDeviceList = new ArrayList<>();
            p2pDeviceList.addAll(wifiP2pDeviceList.getDeviceList());
            deviceActionListener.updateDeviceList(p2pDeviceList);
        }else if(action.equals(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)){
            int status = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE,-1);
            if (status == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
                deviceActionListener.updateStatus("可用的。。。");
            }else{
                deviceActionListener.updateStatus("不可用。。。");
            }
        }else if(action.equals(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)){
            WifiP2pDevice wifiP2pDevice = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
            deviceActionListener.updateDeviceInformation(wifiP2pDevice);
        }
    }

上面獲取資料的時候還可以使用WifiP2pManager.requestXXX某方法回撥,

這裡的DeviceActionListener是一個介面,這裡採用的是介面回撥與Activity進行通訊

 interface DeviceActionListener{
        void connect(WifiP2pInfo wifiP2pInfo);

        void updateDeviceList(List<WifiP2pDevice> p2pDeviceList);

        void updateStatus(String text);

        void updateDeviceInformation(WifiP2pDevice wifiP2pDevice);

    }

五.獲取WifiP2pManager和WifiP2pManager.channel

 wifiP2pManager = (WifiP2pManager) this.getSystemService(WIFI_P2P_SERVICE);
        channel = wifiP2pManager.initialize(this,getMainLooper(),null);

六.開啟掃描,兩臺手機都需要開啟掃描

   wifiP2pManager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
            @Override
            public void onSuccess() {
                Log.d("MainActivity","掃描成功了.............");
            }

            @Override
            public void onFailure(int i) {
                Log.d("MainActivity","掃描失敗......");
            }
        });

七. 通過廣播的回撥獲取到搜尋的手機列表

當獲取到搜尋列表的時候,就會觸發 WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION 的事件,在廣播中,我們可以通過   WifiP2pDeviceList wifiP2pDeviceList = intent.getParcelableExtra(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 獲取到手機列表的資料。我們可以使用一個ListView來顯示這些

手機資料。

八.連線

我們可以通過ListView的點選事件來設定連線,下面的wifiP2pDevice是你點選(ListView)某項的WifiP2pDevice

WifiP2pConfig wifiP2pConfig = new WifiP2pConfig();
        wifiP2pConfig.deviceAddress = wifiP2pDevice.deviceAddress;
        wifiP2pConfig.wps.setup = WpsInfo.PBC;
        wifiP2pManager.connect(channel,wifiP2pConfig,null);

九.socket通訊,將組的owner做完服務端,其它做完客戶端

  當連線成功的時候會呼叫廣播的Wifi連線狀態發生改變的事件,我們可以在裡面獲取到WifiP2pInfo資訊,通過該物件我們可以獲取組owner的interAddress;這個描述的程式碼都在上面的Receiver中。

然後就是將Owner做為ServerSocket,其他的作為Socket。