|
WIFI 直连简介
从Android4.0(API Level=14)开始,允许通过Wi-Fi模块在两个移动设备之间建立直接连接(这种技术称为Wi-Fi Direct),这种连接不需要无线路由作为中介,而只是像蓝牙一样在两个设备之间直接建立的数据传输通道。在Android SDK中提供了一些API,通过这些API可以发现其它支持Wi-Fi Direct的设备,也可以接收其它设备的Wi-Fi Direct请求。在Wi-Fi Direct出现之前,通常使用蓝牙或利用无线路由连接多部Android设备,蓝牙的有效距离比较短,而且传输速率不如Wi-Fi。不过有了Wi-Fi Direct后,两部设备可以直接连接,既方便又快速,非常适合数据分享。
WIFI 直连基本基本过程
通常WIFI 直连设备即有socket客户端,又有socket服务端.
1,搜索附近WIFI 直连设备
2,连接WIFI 直连设备,
3,用socket通信.
Wi-Fi Direct的核心API
WifiP2pManager类 | 该类中提供了允许用户发现、请求和连接其它支持Wi-Fi Direct设备的API。 | Wi-Fi Direct广播接收器类 | 用于监听Wi-Fi Direct请求的广播接收器. | 事件接口 | 被Wi-Fi Direct框架检测到的事件通知,例如,终止连接、发现新的Wi-Fi Direct设备等。 |
Wi-Fi Direct广播接收器的广播消息
WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION | 检测Wi-Fi是否可用,并且将检测结果通知相应的窗口。 | WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION | 调用WifiP2pManager.requestPeers方法获取成功连接的设备列表。
注意它是搜索完所有设备后产生一个广播消息,而蓝牙是搜到一个产生一个广播消息 | WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION | 响应Wi-Fi连接状态(连接或断开)。 | WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION | 响应设备的Wi-Fi状态变化。 |
搜索Wi-Fi Direct设备
1,开始搜索
使用Wi-Fi Direct进行通信,首先要搜索周围有没有其它的Wi-Fi Direct设备。完成这项工作需要调用WifiP2pManager.discoverPeers方法.
1 mChannel = mManager.initialize(this, getMainLooper(), null);
2 mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener()
3 {
4 // 成功发现周围有Wi-Fi Direct设备
5 @Override
6 public void onSuccess() {//只通知成功,并没有数据
7 ...
8 }
9 // 未发现周围有Wi-Fi Direct设备
10 @Override
11 public void onFailure(int reasonCode) {//只通知失败,并没有数据
12 ...
13 }
14 });
2,得到设备列表
1 PeerListListener myPeerListListener;
2 ...
3 if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
4
5 if (mManager != null)
6 {
7 // 异步获取可用的Wi-Fi Direct设备
8 mManager.requestPeers(mChannel, myPeerListListener);
9 }
10 }
11
12 public interface PeerListListener
13 {//通过这个接口得到所有direct设备列表
14 public void onPeersAvailable(WifiP2pDeviceList peers);
15 }
连接Wi-Fi 直连设备
1 WifiP2pDevice device;
2 … … // 需要从前面得到的设备列表中获取相应的设备(WifiP2pDevice对象)
3 // 创建WifiP2pConfig对象
4 WifiP2pConfig config = new WifiP2pConfig();
5 // 存储设备的MAC地址
6 config.deviceAddress = device.deviceAddress;
7 // 开始连接设备
8 mManager.connect(mChannel, config, new ActionListener() {
9 // 当成功连接设备后调用该方法
10 @Override
11 public void onSuccess() {
12 //success logic
13 }
14 连接设备失败后调用该方法
15 @Override
16 public void onFailure(int reason) {
17 //failure logic
18 }
19 });
传输数据
1 WifiP2pManager. requestConnectionInfo(...)
2
3 public void requestConnectionInfo(Channel c, ConnectionInfoListener listener);
4
5
6 public interface ConnectionInfoListener
7 {
8 public void onConnectionInfoAvailable(WifiP2pInfo info);
9 }
10
11
12 WifiP2pInfo.groupOwnerAddress.getHostAddress
13
客户端用Socket连接、服务端用ServerSocket.accept等待客户端连接 |
|
|