WLAN直连总体结构和相关流程概览(二)

在上一篇 WLAN直连总体结构和相关流程概览(一) 中介绍了WLAN直连UI层及StateMachine。这里继续介绍framework层及Supplicant层。

在framework层,最主要有三个类WifiP2pManager,WifiP2pService,WifiMonitor,而最核心的就是WifiP2pService了。

1. WifiP2pManager:个人理解,可以把它看做是Framework层向UI层提供的一个接口,对Framework层的所有操作通过这个接口来进行。一般的使用顺序为:

 > 调用initialize() 进行初始化

 > 调用discoverPeers() 搜索P2P设备

 > 调用connect() 连接P2P设备

 >更多其他操作

2. WifiP2pService: 在这个类里面,最主要的就是内部类P2pStateMachine了。在打开WiFi时,会启动supplicant,而在这时,WifiStateMachine会发消息给P2pStateMachine启动P2P(实际上,在启动系统的时候,就已经启动WifiP2pService了,这里主要是进行了状态机里的状态转换和启动了P2P对底层事件的监听)。

> Enable P2P

在WifiStateMachine进入P2pStartedState后,会发送消息以启动P2P。

在P2P没有启动之前,处于P2pDisabledState状态,根据前一章的介绍,会在这个状态里处理这个消息,并且启动WifiMonitor,状态转换到P2pEnablingState。

因为在开启WiFi的时候,就已经和supplicant建立连接了,所以在WifiMonitor,直接发送SUP_CONNECTION_EVENT 信息到P2pStateMachine。

在P2pEnablingState收到这个消息后,直接转到InactiveState

而InactiveState是P2pEnabledState的子状态,所以首先会调用P2pEnabledState.enter()


在这里,会进行一些初始化的操作,如set device_name, device_type, static_ip 等。

> P2P Scan

首先来看一下它的调用顺序图

下面分步详细介绍

通过调用discoverPeers() 方法,给P2pStateMachine发一个DISCOVER_PEERS 消息


通过JNI调用,给Supplicant层发送“P2P_FIND”命令,将会搜索周围P2P设备。在Supplicant启动时,会建立两个socket和底层进行通信。一个用于发送命令(ctrl_conn),一个用于接收底层返回的事件(ctrl_recv)。在搜到设备后,在WifiMonitor里通过轮询的方式得到supplicant返回的字符串,字符串格式为 P2P-DEVICE-FOUND 02:12:34:2b:7f:fe p2p_dev_addr=02:12:34:2b:7f:fe pri_dev_type=10-0050F204-5 name= 'Android_82f5' config_methods=0x188 dev_capab=0x25 group_capab=0x0。这个字符串会被转化为一个WifiP2pDevice对象,然后发送给P2pStateMachine。


> P2P Connect

搜到设备之后,就可以进行连接了。发送CONNECT 请求,在InactiveState中处理这个消息。

注:下面分析的是主动发送连接请求的设备


GC(Group Client)端,状态机里各状态流程如下


同样是GC端,下面附上接收到连接请求的设备的顺序图


还有很重要的一个功能就是多连接了。实际上多连接和单连接并没有很大的区别,在多连接中,发出请求的设备首先会建立一个Group,此设备就是GO(Group Owner)。Group成功建立后,就会按顺序邀请其他设备加入这个Group。

下面是多连接的流程图

如果选择了连接多个设备,即便一些设备拒绝了连接邀请或者连接失败(超时),它还是会邀请其他设备(通过索引mSelectedP2pConfigIndex来获取需要连接的设备的信息)。

Supplicant层

其官方网站有很详细的文档 http://hostap.epitest.fi/wpa_supplicant/devel/index.html




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>