从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后,两部设备可以直接连接,既方便又快速,非常适合数据分享。
Wi-Fi Direct API主要包含如下几部分。
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
使用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 });
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 { 14 public void onPeersAvailable(WifiP2pDeviceList peers); 15 }
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 14 客户端用Socket连接、服务端用ServerSocket.accept等待客户端连接