(Android)Wifi-Direct直连

因项目须要Pad端和手机端交互,采用wifi直连。查阅资料,大概写下一些资料和收获吧。注:大公司的代码带不出来,我也比较懒不想再认真去写一遍了,因此大概这个意思哦。api

wifi直连也叫作wifi设备点对点链接(peer-peer),不须要链接热点或者网络,须要打开wifi,就能够查找到附近的设备。大概能够分为如下步骤:1.设置如下权限,而且注意最小sdk=14网络

2.建立一个广播接收器,经过建立IntentFilter来addAction获得各个特定事件的发生来进行回调.app

建立一个新的 BroadcastReceiver 类,用来监听系统的Wi-Fi P2P状态的改变(在 onReceive方法中,添加一个条件来处理上面列出的各类P2P状态的变动。)异步

 

最后,在主活动激活时,注册意图过滤器(Intent Filter)和广播接收器;在主活动暂停时把它们注销。最好在onResume()和onPause()方法中完成该操做。函数

3.初始化获得WifiP2pManager和Channel实例,在onCreate()方法中初始化,若是是在Fragment中,initialize参数用Looper.getMainLooper(),oop

4.初始化搜索,只初始化了对等点的搜索。discoverPeers()方法启动了搜索线程,并马上返回。系统经过调用给定的动做监听器的方法来进行初始化,并会在成功初始化对等点进程时通知你。同时,搜索也会持续进行,直到一个链接被初始化,或者一个P2P组造成。spa

5.获取搜索到设备列表, 获取对等点的列表并进行处理,首先实现 WifiP2pManager.PeerListListener 接口,它提供了Wi-Fi Direct检测到的对等点信息。注:在公司当时我是在这个方法里实现自动链接,保存到sharedPreference,而后若是有搜索到相同的设备名和地址,代码就不写出来了,有更好的想法的能够说下。线程

 

在广播onReceive()方法中以便在收到一个带有 WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION 动做的意图(Intent)时调用 requestPeers方法。把实现PeerListListener的类做为方法参数传进去进行监听器回调。设计

6.链接(后面具体说)这个是重点哦对象

为了链接一个对等点,须要先建立一个新的 WifiP2pConfig 对象,而后从表明你想链接的设备的 WifiP2pDevice 中拷贝数据进去。再调用 connect 方法。而后项目需求是Pad端必定要做为group owner,这时候config.groupOwnerIntent = 15,增长这句话并不能必定做为group owner,只是一个建议。

 

         WifiP2pConfig config = new WifiP2pConfig();
                        config.deviceAddress = device.deviceAddress;
                        config.wps.setup = WpsInfo.PBC;

 为了兼容传统的Wifi设备,Wifi_Direct其实还存在另外一种使用方 式,暂且称为兼容模式。兼容模式的特色在于,只须要担任GroupOwner的设备支持Wifi_Direct,而其余设备只须要支持传统的Wifi就能够了(我的以为其实这种使用模式很像Android的便携热点功能)。

         操做流程为:
         1. 支持Wifi_Direct的设备建立group,WifiP2pManager.createGroup(),成为GroupOwner
         2.  其余设备扫描Wifi_Direct设备建立group后产生的Wifi热点并链接便可。
  
         兼容模式存在的一个问题是:由于做为group member的设备是使用Wifi硬件接入到group中,因此会致使member进行wifi 热点切换以及网络中断,可能对正在进行的网络操做形成影响,而group owner则不存在这个问题。另外,而WifiP2p配对的使用方式,WifiP2p和Wifi能够独立运做,相互不受影响。
          可是,兼容模式由于省去了扫描和配对的过程,因此创建链接的成功率明显提高,而且创建链接的速度要快很多(具体时间比较随机)。
          从我的的使用感受来说,这WifiP2p这套API接口高度的异步化,API都须要以回调的方式获取操做结果(包内interface比较多的缘由就在于 此)。更加麻烦的是,几个关键API(例如WifiP2pManager.connect)的回调获取到的结果仅仅是执行是否开始,真正的结果还得注册 broadcast receiver,经过监听广播来得到,才能进行下一步操做。异步的设计提升了代码的逻辑复杂度。

 

7.链接信息获取要监听链接状态的变动,须要实现 WifiP2pManager.ConnectionInfoListener 接口,回调函数 onConnectionInfoAvailable将会在链接状态改变时通知。

 

回到广播接收器的onReceive方法中,修改监听WIFI_P2P_CONNECTION_CHANGED_ACTION的部分。收到该意图(Intent)时,调用 requestConnectionInfo。这是一个异步的调用,因此结果会传给做为参数的链接信息监听器。

8.断连

removeGroup是移除群组,断连全部设备。

 

cancelConnect是取消链接状态为Invited的设备

一些问题:

如何得到WifiP2pGroupInfo,它有什么用?

WifiP2pManager.requestGroupInfo()函数,能够获取GroupInfo,较为有用的api有:
1. GroupInfo.getClientList()能够得到链接到group的member列表
2. GroupInfo.getNetWorkName()能够得到group的wifi热点名称(SSID)
3. GroupInfo.getPassphrase() 能够得到链接到wifi 热点的密码
 
如何防止配对产生的提示框?
在不修改framework的状况下,本人暂时为找到可行的方案。
这个提示狂是由系统提供的,具体表现视设备而定。nexus只在第一次配对的时候弹出,而A80每一次配对都会弹出。
可是,使用兼容模式使用Wifi_Direct是没有提示框的。
 
7. WifiP2pManager.discovePeers 仅仅返回附近有哪些设备开启了wifi p2p,而app的实际使用场景,每每但愿寻找能够提供某些特定服务的设备。例如同一房间内,有A,B,C,D四台设备开启了wifi p2p,而A设备和B设备都安装了app1,C设备和D设备都安装了app2,使用者但愿A设备能和B设备配对链接,而C设备与D设备链接,运行在A设备 上的app1如何识别它应该链接的是B设备,而非C、D设备呢?

为了支持更加个性化的设备发现,WifiP2pManager支持UPNP和DNS两种方式的设备(服务?)发现。
App能够经过WifiP2pManager.addLocalService来向周边的设备广播本身支持哪些服务。
也能够经过以下步骤实现发现这些服务:
1. 经过WifiP2pManager.addServiceRequest()添加服务请求
2. 经过WifiP2pManager.discoverService()开始服务发现
3. 经过WifiP2pManager.setDnsSdResponseListener()或者WifiP2pManager.setUpnpServiceResponseListener()监听服务内容。
相关文章
相关标签/搜索