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

终于决定要离开***,倒计时一个月。现在基本上不给我安排活了,主要写写文档,进行工作交接的事情。想想确实有很久没写博客了,虽然以前写的也不咋地,但至少在以后能给自己一个参考。需要好好把这一年的东西好好整理一下了。

WiFi模块主要包括三部分:WLAN Station, WLAN Direct, Mobileap(Hotspot) ,应用主要涉及上网、打印、文件传输、热点共享、远程控制、局域网等方面。

前段时间总结了WLAN直连的部分流程,由于boss要求用英文写,在这里单纯的翻译出来。

注: 下面图中有些代码和文件可能和Google提供的有所不同,***在google基础上进行了一些改动。

首先附上一张WLAN直连从UI层到Supplicant层的大致框图:

几乎所有较新的***手机都支持WLAN直连功能,UI层主要有两个入口,一个直接进入(WifiP2pSettings),一个由外部模块调用进入(WifiP2pDevicePicker)。

下面分层详细介绍。

1. UI层

有些信息不便在这里细写,用一张图简单概括一下它们之间的关系:

需要说一下的是,还有一个文件WifiP2pDummyPickerActivity,从它名字也能略窥其作用了-dummy(虚拟的)。实际上,它的确就是UI Layer(WifiP2pDevicePicker)和其他模块的一个中间层。

从上图可以看出,外部模块发一个隐式intent,android系统根据这个intent,就能找到相应的需要启动的Activity。

从上图可以看出,搜索显示出的每一个设备,实际上都被封装成了一个个Preference对象。

2. Framework层

在说这一层详细信息之前,不得不先了解一下Android系统里的状态机(StateMachine)。状态机的实现还是Handler机制,google对它进行了很好的封装扩展,就成了一个功能比较强大的状态机。首先来看看它的类结构图。(此图引用自http://www.cnblogs.com/bastard/archive/2012/06/05/2536258.html)

这是一个树形层次状态机,按层级顺序来处理消息。状态机内部有一个活动状态栈,用于存储当前所有处于活动的State,并且在状态转换后,在处理下一个消息时,会更新这个栈。例如

mP0

/ \

mP1 mS0

/ \

mS2 mS1

/ \ \

mS3 mS4 mS5 ---> initial state

在初始状态下,活动状态栈中保存的状态为mP0,mP1, mS1, mS5,所以当收到消息时,处理顺序为(假设每个状态都不能处理这个消息,即返回false或NOT_HANDLED)

mS5,mS1, mP1, mP0。

如果mS5能够处理这个消息(返回true),并且状态转到mS4,那么活动状态栈会更新为mP0,mP1, mS2, mS4。各状态调用顺序为mS5.processMessage() > transitionTo(mS4) > mS5.exit() > mS1.exit() > mS2.enter() > mS4.enter()。当收到下个消息时,首先会调用mS4.processMessage()处理消息。

下面附一张P2pStateMachine的树形层次结构图

Copyright © 2022 世界杯进球_国足进世界杯了吗 - fulitb.com All Rights Reserved.