Wifi直连API的一个说明(给linux端的说明文档)

一、       首先有几个wifi系统状态需要说明

WIFI_P2P_STATE_CHANGED_ACTION:当启用或禁用设备上的Wi-FiDirect时,发出这个广播。

WIFI_P2P_PEERS_CHANGED_ACTION:在调用discoverPeers()方法时(见后文),发出这个广播

WIFI_P2P_CONNECTION_CHANGED_ACTION: 在设备的Wi-Fi连接状态变化时,发出这个广播。

WIFI_P2P_THIS_DEVICE_CHANGED_ACTION: 当设备的细节(如设备的名称)发生变化时,发出这个广播。

上面提到的这些状态是在进行wifi直连的整个过程中,满足要求后由系统发出的一种广播消息,在Android端可以收到这些消息,并进行一些逻辑上的响应。

二、       第一步是获取wifi直连的系统服务

在进行wifi直连之前需要先获取wifi直连的系统服务WifiP2pManager和一个Channel对象,Channel对象用于把应用程序连接到Wi-Fi Direct框架的整个过程中。代码如下

WifiP2pManager manager=(WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
Channel channel=manager.initialize(this, getMainLooper(), null)

关于Channel的源码说明:A channel that connects the application to the Wifi p2pframework.Most p2p operations require a Channel as an argument.

三、       第二步需要获取对等点设备

这一步需要调用discoverPeers函数来搜索一定的范围内检查有效的对等点设备。如果发现处理成功,并检测到对等设备,系统会发送上文提到的WIFI_P2P_PEERS_CHANGED_ACTION广播消息,这样便能调用函数requestPeers()以便获得对等设备的列表。如下面代码:

/** 下面的第二个参数不用管,他是Android的一个监听器,用来返回检测成功或者失败的消息,它并不提供发现的相关实际对等设备的任何信息,第一个参数是上文得到的一个channel*/
manager.discoverPeers(channel,newWifiP2pManager.ActionListener())   //点函数
/** 当收到WIFI_P2P_PEERS_CHANGED_ACTION消息时调用此函数来获得对等点列表,其中第二参数是一个监听器,获取列表的函数封装在这个触发器中*/
manager.requestPeers(channel, myPeerListListener);
/** 此函数是系统自动调用的函数,它封装在上面的myPeerListListener监听器中,需要自己实现函数内部的逻辑来获得点对点列表,其中点对点的列表信息封装在peerList变量中,调用其getDeviceList()函数即可返回一个List<WifiP2pDevice> 类型的列表,里面包含每一个WifiP2pDevic类型的对象,里面包含一些设备信息,如需需要可进一步查看源码*/
public  void  onPeersAvailable(WifiP2pDeviceList  peerList){
      peerList.getDeviceList()
}

四、       连接对等点设备

这一步需要通过上一步获得的对等点设备信息来进行连接。首先连接前需要一个WifiP2pConfig  config对象将要连接的设备信息封装到里面,其中便包括设备的物理地址。接着就可以调用connect函数来进行连接。

/** 封装设备信息到WifiP2pConfig  config中*/
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.groupOwnerIntent=0;
config.wps.setup = WpsInfo.PBC;
/** 调用connect函数连接点对点设备,第二个参数是一个监听器,不用管,它只返回连接成功与否并可以让你进行一些提示性的处理*/
manager.connect(channel, config, newActionListener())

五、       获取连接信息

上一步的connect只是在连接初始化成功与否后通知你,此时还需要获取设备的连接信息。当连接信息发生变化时系统会发出WIFI_P2P_CONNECTION_CHANGED_ACTION的广播信息,收到信息后需要调用requestConnectionInfo()函数来获取连接信息,代码如下

/** 第二个参数是一个监听器,当连接成功后,系统会自动调用,在这个监听器中调用onConnectionInfoAvailable()函数来获取连接的信息*/
mManager.requestConnectionInfo(mChannel, connectionListener)
/** 此函数是封装在上面第二个参数里面的函数,是系统自动调用的,他的参数ifno里面包含了连接的信息,*/
public void onConnectionInfoAvailable(final WifiP2pInfo info) {
        // InetAddress在WifiP2pInfo结构体中。  
        InetAddress groupOwnerAddress = info.groupOwnerAddress.getHostAddress());
//组群协商后,就可以确定群主。  
        if (info.groupFormed && info.isGroupOwner) {  
        //针对群主做某些任务。  
        //一种常用的做法是,创建一个服务器线程并接收连接请求。  
        } else if (info.groupFormed) {  
        //其他设备都作为客户端。在这种情况下,你会希望创建一个客户端线程来连接群主。 
        }  
}

在onConnectionInfoAvailable函数里面调用info.groupOwnerAddress.getHostAddress()函数即可得到群主ip地址,下面就可以进行通信 了

 

说明:对于整个连接过程Channel的具体作用,如果需要了解得具体看源码。在Android端仅需要调用函数获得一个Channel即可。