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。

转载于:https://www.cnblogs.com/xiongbo753/p/10062373.html

你可能感兴趣的:(WifiP2p点对点连接的详解)