🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
P2P规范中附录A[9]通过定义一个状态机介绍了P2P的整体工作流程,笔者觉得以此作为本章P2P理论知识的总结是最好不过了。该状态机的状态定义及切换如图7-22所示。 :-: ![](https://box.kancloud.cn/36c750d453800894beb6f72643214b0b_954x706.jpg) 图7-22 P2P状态机 图7-22中,三个黑虚线框分别是Find Phase、Group Formation Procedure和OperationalPhase,这三个Phase描述的是P2P工作流程中的一个阶段,每个阶段可包含一个或多个状态。例如Group Formation Procedure阶段包含GON、WSC Provisioning Registrar和WSC ProvisioningEnrollee三个状态。 每个状态对应的状态名位于状态框顶部,其字体格式为加粗并带下划线。注意,图中Search状态包含两个子状态,分别是Search子状态以及Service Discovery子状态。由于P2PDevice并不都支持Service Discovery功能,所以Service Discovery子状态为可选(operational)状态。 每个状态都有对应的Entry Action、Exit Action和Internal Behavior。其中,EA和EXA位于状态框图的上半部分,而Internal Behavior位于状态框图的下半部分。状态之间的切换及切换条件由数字序号及箭头线表示。 下面介绍图7-22中P2P状态机的各个状态以及状态转换条件。对此,我们重点考察每个状态的EA(Entry Action)、EXA(Exit Action)、Internal Behavior以及Transition。 一个P2P Device最初的状态是Off,然后将进入Scan状态(括号中的数字对应图7-22中的数字)。 :-: ![](https://box.kancloud.cn/0bf4881e1b53fd18377bb6a01d1afe2c_1079x375.jpg) 接着来看Find Phase,它包括Listen和Search两个状态。其中,Listen状态如下。 :-: ![](https://box.kancloud.cn/288069ebad8d19710f56128a5af78e79_1074x541.jpg) Find Phase中另外一个状态是Search状态。它包含Search子状态和Service Discovery子状态。先来看Search子状态。 :-: ![](https://box.kancloud.cn/23577448154825ce9577dc8634b66827_1075x125.jpg) 再来看Service Discovery子状态。 :-: ![](https://box.kancloud.cn/85fb2462adccf25f1384478a4d1d7dac_1071x119.jpg) Search状态(包括Search子状态和Service Discovery子状态)的Transition情况如下。 :-: ![](https://box.kancloud.cn/2329b5b53f3756c3f2ca9f4d76301cc9_1071x237.jpg) 接着来看Group Formation Procedure,该阶段包含三个状态,首先是GON。 :-: ![](https://box.kancloud.cn/45ea5b4146ffebe3e532143c454c8a0f_1074x259.jpg) Group Formation Procedure另外两个状态WSC Provisioning Registrar和WSC Provisioning Enrollee比较简单,请读者根据图7-22自行总结。 最后,来看看Operational Phase,它包含P2P GO和P2P Client两个状态,首先是P2P GO状态。 :-: ![](https://box.kancloud.cn/e1b058fe1f5e0e1b07364db0efbcbba6_1087x155.jpg) 再来看P2P Client状态,它没有EA和EXA。 :-: ![](https://box.kancloud.cn/a0d182a4282bfe278ffdb428744f5a98_1069x146.jpg) 图7-22对掌握P2P整体工作流程有重要意义,读者不妨仔细阅读。从下一节开始,将分析Android平台中P2P的代码实现。和WSC一样,首先分析的是Java层中的WifiP2pSettings以及WifiP2pService。