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