• 17、Wi-Fi Direct


    Wi-Fi Direct简介

           从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

    Wi-Fi Direct API主要包含如下几部分。

    # WifiP2pManager类。该类中提供了允许用户发现、请求和连接其它支持Wi-Fi Direct设备的API。
    # 用于监听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状态变化。
     
    广播接收器的授权

    <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进行通信,首先要搜索周围有没有其它的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 }
    连接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 
    14 客户端用Socket连接、服务端用ServerSocket.accept等待客户端连接
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    IconRes提供免费高质量的Material风格android官方图标库
    android中的所谓观察者模式
    Android总结篇——Intent机制详解及示例总结
    SpringMVC注解@initbinder解决类型转换问题
    ubuntu16.04上安装tomcat7
    ImportError: No module named corsheaders
    linux 网卡
    工控机安装Ubuntu14.04
    python2安装django
    Ubuntu14.04 terminal添加右键
  • 原文地址:https://www.cnblogs.com/androidsj/p/3857273.html
Copyright © 2020-2023  润新知