负责⼈:Allan Zhang
完成时间:8月8日
原文链接:http://developer.android.com/guide/topics/connectivity/wifip2p.html
Wi-Fi 直连技术允许已经配备了相应硬件并预装了Android 4.0(API level 14)或更后的操作系统的设备在不需要Wi-Fi中间热
点的支持下通过Wi-Fi直接互联的技术。使用这些API,你可以发现和连接其他支持此技术的设备,然后以距离远超蓝牙连接
技术且速度更快的方式进行通信。这项技术对于⼀些多用户共享资料,比如多用户联机游戏或者相片分享等应用非常有
用。
Wi-Fi直连技术的API包含以下主要部分: * 允许用户发现,请求然后连接对等设备的各种方法,定义在WifiP2pManager类
中。 * 允许用户定义收到调用WifiP2pManager类中方法成功或失败的通知的监听器。当用户调用WifiP2pManager类中的
方法时,每⼀个方法都可以收到⼀个以
参数
转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应
形式传过来的特定监听。 * 通知用户被Wi-Fi直连技术框架
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
到的特定事件的
意图,比如⼀个已丢掉的连接或者⼀个新的对等设备的发现等。
你经常会同时使用这三个主要组件的相关功能。例如,你可以为去调
用android.net.wifi.p2p.WifiP2pManager.ActionListener) discoverPeers()
discoverPeers()](http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html#discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel,)
方法发现的对等设备列表发生改变时的⼀个广播。
API 概述概述
WifiP2pManager类提供了很多方法允许用户通过设备的Wi-Fi模块来进行交互,比如做⼀些如发现,连接其他对等设备的
事情。下列的方法都是可以使用的: 表格1.Wi-Fi直连技术方法
{|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-top:1px solid #ccc; "
|-style="background:#DEE8F1; " ! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" |
方法名 ! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | 详细描述
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
initialize() | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 通过Wi-Fi框架对应用
来进行注册。这个方法必须在任何其他Wi-Fi直连方法使用之前调用。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
connect()] | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 开始⼀个拥有特定设
置的设备的点对点连接。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
cancelConnect() | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 取消任何⼀个
正在进行的点对点组的连接。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
requestConnectInfo() | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 获取⼀个
设备的连接信息。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
createGroup() | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 以当前设备为组
拥有者来创建⼀个点对点连接组。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
removeGroup() | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 移除当前的点
对点连接组。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
requestGroupInfo() | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 获取点对点
连接组的信息。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
discoverPeers() | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 初始化对等设
备的发现。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
requestPeers() | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 获取当前发现
的对等设备列表。
|}
WifiP2pManager的方法可以让你在⼀个监听器里传递参数,这样Wi-fi直连框架就可以通知给你的窗体这个方法调用的状
态。可以被使用的监听器接⼝和使用监听器的相应的WifiP2pManager的方法的调用都将在下面这张表中有所描述:
表格 2. Wi-Fi直连监听器方法 {|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid
#ccc;border-top:1px solid #ccc; "
|-style="background:#DEE8F1; " ! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" |
监听器接⼝ ! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | 相关联的方法
2/6
www.eoe.cneoe 移动开发者社区
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
WifiP2pManager.ActionListener | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; "
| connect(), cancelConnect(), createGroup(), removeGroup(), and discoverPeers()
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
WifiP2pManager.ChannelListener | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;
" | initialize()
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
WifiP2pManager.ConnectionInfoListener | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc;
padding:5px 15px; " | requestConnectInfo()
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
WifiP2pManager.GroupInfoListener | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px
15px; " | requestGroupInfo()
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
WifiP2pManager.PeerListListener | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;
" | requestPeers()
|} Wi-Fi直连技术的API定义了⼀些当特定的Wi-Fi直连事件发生时作为广播的意图,比如说当⼀个新的对等设备被发现,或
者⼀个设备的Wi-Fi状态的改变。你可以在你的应用里通过创建⼀个处理这些意图的广播接收器来注册去接收这些意图。
Table 3. Wi-Fi 直连意图 {|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-
top:1px solid #ccc; "
|-style="background:#DEE8F1; " ! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" |
意图名称 ! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | 详细描述
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
WIFI_P2P_CONNECTION_CHANGED_ACTION | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc;
padding:5px 15px; " | 当设备的Wi-Fi连接信息状态改变时候进行广播。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
WIFI_P2P_PEERS_CHANGED_ACTION | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc;
padding:5px 15px; " | 当调用discoverPeers()方法的时候进行广播。在你的应用里处理此意图时,你通常会调用
requestPeers()去获得对等设备列表的更新。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
WIFI_P2P_STATE_CHANGED_ACTION | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc;
padding:5px 15px; " | 当设备的Wi-Fi 直连功能打开或关闭时进行广播。
|- style=" vertical-align:top;" | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
WIFI_P2P_THIS_DEVICE_CHANGED_ACTION | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc;
padding:5px 15px; " | 当设备的详细信息改变的时候进行广播,比如设备的名称
|}
创建⼀个创建⼀个Wi-Fi直连意图使用的广播接收器直连意图使用的广播接收器
⼀个广播接收器允许你接收由android系统发布的意图广播,这样你的应用就可以对那些你感兴趣的事件作出响应。创建⼀
个基本的Wi-Fi直连意图使用的广播接收器的步骤如下:
1.创建⼀个继承自BroadcastReceiver的类。对于类的构造,⼀般最常用的就是以WifiP2pManager,
WifiP2pManager.Channel作为参数,同时这个广播接收器对应的窗体也将被注册进来。这个广播接收器可以像窗体发送
更新或者在需要的时候可以访问Wi-Fi硬件或通信通道。
2.在广播接收器里,处理onReceive()方法里你感兴趣的意图。执行接收到的意图的任何需要的动作。比如,广播接收器接
收到⼀个WIFI_P2P_PEERS_CHANGED_ACTION的意图,你就要调用requestPeers()方法去获得当前发现的对等设备列
表。
下面的代码展示了怎样去创建⼀个典型的广播接收器。广播接收器接收⼀个WifiP2pManager对象和⼀个窗体对象作为参
数然后利用这两个类去处理接收到的意图的特定的动作需求。
/* * * A BroadcastReceiver that notifies of important Wi-Fi p2p events. * / public class WiFiDirectBroadcastReceiver
extends BroadcastReceiver {
}
创建⼀个创建⼀个Wi-Fi直连的应用直连的应用
创建⼀个Wi-Fi直连的应用包括创建和注册⼀个广播接收器,发现其他设备,连接其他设备,然后传输数据等步骤。接下来
的⼏个部分描述了怎么去做这些⼯作。
3/6
www.eoe.cneoe 移动开发者社区
初始化设置初始化设置
在使用Wi-Fi直连的API之前,你必须确保你的应用可以访问设备的硬件并且你的设备要支持Wi-Fi直连的通讯
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
。如果
Wi-Fi直连技术是支持的,你可以获得⼀个WifiP2pManager的实例对象,然后创建并注册你的广播接收器,然后开始使用
Wi-Fi直连的API方法。
1.为设备的Wi-Fi硬件获取权限并在Android的清单文件中声明你的应用正确使用的最低SDK版本:
2.检查设备是否支持Wi-Fi直连技术。⼀种好的解决
办法
鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载
是当你的广播接收器接收到⼀个
WIFI_P2P_STATE_CHANGED_ACTION意图。通知你的窗体Wi-Fi直连的状态和相应的反应。
@Override public 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 Direct is enabled } else { // Wi-Fi Direct is not enabled } } ... }
3.在你的窗体的onCreate()方法里,获得⼀个WifiP2pManager的实例并调用initialize()方法通过Wi-Fi直连框架去注册你的
应用。这个方法返回⼀个WifiP2pManager.Channel对象,是被用来连接你的应用和Wi-Fi直连框架的。你应该再创建⼀个
以WifiP2pManager和WifiP2pManager.Channel为参数且关联你的窗体的广播接收器的实例。这样你的广播接收器就可以
接收到你感兴趣的事件去通知你的窗体并更新它。它还可以让你在需要的时候操纵设备的Wi-Fi状态。
WifiP2pManager mManager; Channel mChannel; BroadcastReceiver mReceiver; ... @Override protected void
onCreate(Bundle savedInstanceState){ ... mManager = (WifiP2pManager)
getSystemService(Context.WIFI_P2P_SERVICE); mChannel = mManager.initialize(this, getMainLooper(), null);
mReceiver = new WiFiDirectBroadcastReceiver(manager, channel, this); ... }
4.创建⼀个意图过滤器并把它添加在你的广播接收器需要处理的意图上。
IntentFilter mIntentFilter; ... @Override protected void onCreate(Bundle savedInstanceState){ ... mIntentFilter = new
IntentFilter(); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); ... }
5.注册你的广播接收器在窗体的onResume()方法,解除注册在onPause()方法中。 /* register the broadcast receiver with
the intent values to be matched * / @Override protected void onResume() { super.onResume();
registerReceiver(mReceiver, mIntentFilter); } /* unregister the broadcast receiver * / @Override protected void
onPause() { super.onPause(); unregisterReceiver(mReceiver); }
当你获取到⼀个WifiP2pManager.Channel对象并且设置好你的广播接收器时,你的应用就可以调用Wi-Fi直连的方法并且
可以接收Wi-Fi直连的意图。
你可以现在就通过调用WifiP2pManager中的方法取实现你的应用体验Wi-Fi直连技术的特性了。下面的章节描述了怎样去
实现⼀些常用的操作,比如说发现其他设备和连接它们。
发现对等设备发现对等设备
要发现可以使用并连接的对等设备,调用discoverPeers()方法去检测在范围内的可使用设备。这个方法的调用是异步的同
时如果你创建了⼀个WifiP2pManager.ActionListener监听器的话你会通过onSuccess()或者onFailure()方法收到发现成功
或失败的消息。onSuccess()方法只能通知你发现的过程是否成功而不能提供任何关于发现设备的信息:
manager.discoverPeers(channel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { ... }
});
如果发现过程成功且检测到了对等设备,系统将会广播出⼀个WIFI_P2P_PEERS_CHANGED_ACTION意图,这样你就可
以利用广播监听器监听并获得发现设备的列表。当你的应用接收到WIFI_P2P_PEERS_CHANGED_ACTION意图时,你就
可以调用requestPeers()方法来获取发现设备的列表,代码如下: PeerListListener myPeerListListener; ... if
(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
}
连接到设备连接到设备
当你已经找到你要连接的设备在获得发现设备列表之后,调用connect()方法去连接指定设备。这个方法的调用需要⼀个包
含待连接设备信息的WifiP2pConfig对象。你可以通过WifiP2pManager.ActionListener接收到连接是否成功的通知。下面
的代码展示了怎样去连接⼀个想得到的连接: //obtain a peer from the WifiP2pDeviceList WifiP2pDevice device;
WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = device.deviceAddress;
manager.connect(channel, config, new ActionListener() {
4/6
www.eoe.cneoe 移动开发者社区
});
数据传输数据传输
⼀旦连接已经建立,你可以通过套接字来进行数据的传输。基本的数据传输步骤如下:
1.创建⼀个ServerSocket对象。这个服务端套接字对象等待⼀个来自指定地址和端⼝的客户端的连接且阻塞线程直到连接
发生,所以把它建立在⼀个后台线程里。
2.创建⼀个客户端Socket.这个客户端套接字对象使用指定ip地址和端⼝去连接服务端设备。
3.从客户端给服务端发送数据。当客户端成功连接服务端设备后,你可以通过字节流从客户端给服务端发送数据。
4.服务端等待客户端的连接(使用accept()方法)。这个调用阻塞服务端线程直到客户端连接上,所以叫这个过程⼀个新的线
程。当连接建立时,服务端可以接受来自客户端的数据。执行关于数据的任何动作,比如保存数据或者展示给用户。
下来的例⼦,从Wi-Fi直连示例改编而来,展示了怎样去创建服务端和客户端的连接和通信,并且使用⼀个客户端到服务端
的服务来传输了⼀张JPEG图像。如需要得到⼀个完整的商业例⼦,请移步Wi-Fi直连示例。 public static class
FileServerAsyncTask extends AsyncTask {
}
在客户端,使用客户端套接字连接服务端套接字并传输数据。这个例⼦从客户端的文件系统里传输了⼀张JPEG的图像到
服务端。
Context context = this.getApplicationContext(); String host; int port; int len; Socket socket = new Socket(); byte buf[] =
new byte[1024]; ... try { /* * * Create a client socket with the host, * port, and timeout information. * / socket.bind(null);
socket.connect((new InetSocketAddress(host, port)), 500);
} catch (FileNotFoundException e) { //catch logic } catch (IOException e) { //catch logic }
/* * * Clean up any open sockets when done * transferring or if an exception occurred. * / finally { if (socket != null) { if
(socket.isConnected()) { try { socket.close(); } catch (IOException e) { //catch logic } } } }
贡献者:
iceskysliceskysl
©eoe移动开发者社区
本文链接: http://wiki.eoe.cn/page/Wi-Fi_Direct
5/6
www.eoe.cneoe 移动开发者社区
6/6
www.eoe.cneoe 移动开发者社区
API 概述
创建一个Wi-Fi直连意图使用的广播接收器
创建一个Wi-Fi直连的应用
初始化设置
发现对等设备
连接到设备
数据传输
贡献者: