博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WifiP2p点对点连接的详解
阅读量:6907 次
发布时间:2019-06-27

本文共 4248 字,大约阅读时间需要 14 分钟。

一.WifiP2p的描述

wifiP2p是不需要联网的,只需要手机打开wlan就可以连接通信的;底部的通信原理是Binder通信

二.WifiP2p的操作流程

   1.权限申请

   2.设置广播,用来获取WIfiP2p各种变化时候的信息

   3.获取WifiP2pManager和WifiP2pManager.channel

   4.开启扫描,两台手机都需要开启扫描

   5.通过广播的回调获取到搜索的手机列表

   6.连接;因为当两台手机连接的时候,会生成一个组,我们可以通过广播回调获取组的owner信息

   7.socket通信,将组的owner做完服务端,其它做完客户端

 三.权限申请

四.设置广播用来获取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
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
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

你可能感兴趣的文章
【js】性能问题
查看>>
JS引擎线程的执行过程的三个阶段(一)
查看>>
Spark RDD Transformation 简单用例(三)
查看>>
ES6(1)
查看>>
成为Java GC专家(5)—Java性能调优原则
查看>>
作业——05 理解爬虫原理
查看>>
泛型算法的一些总结
查看>>
python 列表操作
查看>>
ServletContext和ServletConfig
查看>>
moveit setup assistant
查看>>
10种常见的软件架构模式
查看>>
SpringBoot+Mybatis+ Druid+PageHelper 实现多数据源并分页
查看>>
solrr初步了解 ...
查看>>
SDNU 1279.※N
查看>>
Django之路由系统
查看>>
mysql 查询当天的数据库
查看>>
volatile 关键字
查看>>
KVM autotest
查看>>
React文档(十五)使用propTypes进行类型检查
查看>>
[六省联考2017]寿司餐厅
查看>>