其实现在已经到了android-9了。但是这篇文档写的是android-8而且android-9的变化不是非常大,所以也懒得修改。

一、模块功能分解

老架构,网上找的。8.0以后不一样了。

1. wifi.c没了,所有驱动相关的操作都通过treble架构移交厂商了

2.IPC方式变了,之前是socket与supplicant通信,现在是HIDL抽象的binder方式

3.扫描功能从supplicant中转移到android原生实现。

4.wpa_supplicant.conf去除,保存ap使用wificonfig.xml由android原生管理。(热点也是)

(1)STA

主要功能:

开启->扫描->连接->断开->关闭

显示扫描结果->添加/删除保存AP->AP详细信息显示

间歇扫描->选取连接过的AP->自动重连

次要功能:

降低功耗:修改扫描间隔,自动断开->自动连接

多卡切换->在wifi自动重连(仅在EAP-SIM方式下)

复杂的UI显示

(2)P2P

主要功能:

开启->扫描->连接->断开->关闭

显示永久组

次要功能:

UI相关

(3)SoftAp

主要功能:

开启->扫描->连接->断开->关闭

显示连接设备数量

禁止某AP连接

次要功能:

自动关闭

UI相关

二、wifistatemachine

谷歌在新发布的android-O平台上对framework进行了大量的更改,从wifi部分来看,主要体现在两个部分:

分离部分代码,加强对framework的管制.这有利于降低android系统的碎片化,保证系统性能.

将framework从Java向C++迁移,提升系统整体运行效率.

(1)WifiStatemachine在android-O实现架构变化:

在android-O之前,framework上一共维护了20个状态.其中softAp相关的状态未列出.Android-O上删除了加载驱动相关的状态,将这部分实现迁移到C++部分.驱动加载成功后,会启动wpa_supplicant.图画的不好,凑合看吧

注:

红色部分为在android-O中删除的状态,下面会说这部分的处理在O中的变化,并且讨论变化的原因.

(2)Wifi enable

这部分的状态切换个刚开始没有看懂,因为ConnectModeState没有被显示的切换,调查发现状态机在切换过程中已经执行过ConnectModeState中的Enter和EXT,并且相应的在子状态DisconnectedState中无法处理的,会交给ConnectModeState(父状态)处理.

代码调用流程:

InitialState:

setOperationalMode->InitialState::ProcessMessage(CMD_START_SUPPLICANT)

->setupForClientMode()

->enableSupplicant()

->startMonitoring()

->transitionTo(mSupplicantStartingState)

加载驱动,启动wpa_supplicant,启动Monitor...

SupplicantStartingState:

setOperationalMode->InitialState::ProcessMessage(CMD_START_SUPPLICANT)

->setupForClientMode()

->enableSupplicant()

->startMonitoring()

->transitionTo(mSupplicantStartingState)

设置mac地址,初始化wps(Wi-Fi Protected Setup),发送wpa_supplicant状态变化广播...

SupplicantStartedState:

Enter()->setWifiState(WIFI_STATE_ENABLING)

->transitionTo(mDisconnectedState)

->setPowerSave();

设置相关参数,切换至DisconnectedState进行定期扫描...

DisconnectedState:

Enter()->processMessage(CMD_NO_NETWORKS_PERIODIC_SCAN)

->startScan()

->SupplicantStartedState::processMessage(CMD_START_SCAN)

->checkOrDeferScanAllowed()

->processMessage(CMD_START_SCAN)

->handleScanRequest()

->startScanNative()

进行定期扫描操作...

O的变化:

个人认为android-O的主要变化在于加载驱动这部分.按照逻辑,wifi启动先后顺序为:WifiService->load driver->start wpa_supplicant。所以认定driver的启动必然在wpa_supplicant启动之前完成.

setupForClientMode()->setupDriverForClientMode()

->Server::createClientInterface()

->SetupInterface()

(3)Wifi connect

根据上图,wifi在链接过程中先切换到ConnectModeState处理连接相关的消息,后直接切换至ObtainingIpState启动DHCP,后切换至同级状态ConnectedState.表示连接已经建立.

代码调用流程:

DisconnectedState:

connect->ConnectModeState::ProcessMessage(CONNECT_NETWORK)

->addOrUpdateNetwork()

->connectToUserSelectNetwork()

->getConfiguredNetwork()

->enableNetwork()

->startConnectToNetwork()

->ConnectModeState::ProcessMessage(CMD_START_CONNECT)

->connectToNetwork()

->ConnectModeState::ProcessMessage(NETWORK_CONNECTION_EVENT)

->sendNetworkStateChangeBroadcast()

->transitionTo(mObtainingIpState)

触发add_network,set_network,enable_network等一系列命令...

ObtainingIpState:

L2ConnectedState::Enter()->ObtainingIpState::Enter()

->StoppedState::ProcessMessage(CMD_START)

->StartedState::Enter()

->transitionTo(mRunningState)

->startIPv4()

->processMessage(CMD_START_DHCP)

->L2ConnectedState::ProcessMessage(

CMD_IP_CONFIGURATION_SUCCESSFUL)

->handleIPv4Success()

->transitionTo(mConnectedState)

L2已经链接成功,接下来启动DHCP分配IP地址.成功后切换至ConnectedState

O的变化:

根据对android-O的代码研究,google改变了wifi的连接方式:

传统方式:

add_network

set_network

enable_network

select_network

现在的方式(目前的连接方式和之前的方式的差别):

add_network

select_network

Framework与wpa_supplicant直接的通信方式也有所变化.如下所示:

在之前的android版本中,framework和wpa_supplicant之间是通过socket进行通信而不是现在的binder通信方式.

个人认为这样修改有如下好处:

从framework和wpa_supplicant的交互来看,双方信息交互频率用binder就可以满足,并且binder更加节省资源.

增加了代码的易读性,binder的函数直接调用比以往的命令发送、字符串解析这种方式更加直观.

(4)Wifi disconnect

在ConnectedState下收到断开链接请求,交由父状态L2ConnectedState处理并切换至同级别状态DisconnectingState,在进入enter函数时发送延时消息,收到后切换至DisconnectedState.

代码调用流程:

L2ConnectedState:

disconnect->L2ConnectedState::ProcessMessage(CMD_DISCONNECT)

->disconnect()

->mSupplicantStaIfaceHal.disconnect()

->transitionTo(mDisconnectingState)

断开L2链接,切换至DisconnectingState.

DisconnectingState:

DisconnectingState::Enter()->ProcessMessage(CMD_DISCONNECTING_WATCHDOG_TIMER)

->handleNetworkDisconnect()

->stopRssiMonitoringOffload()

->stopIpManager()

->clearLinkProperties()

->transitionTo(mDisconnectedState);

停止RSSI,停止IPMananger,回收底层资源并切换到DisconnectedState.

三、驱动架构

根据结构所示, firmware部分完成了硬件射频的工作.根据调查,驱动程序主要是负责传递消息,将上层发送的消息和数据封装为固件消息发送给固件并反馈结果.此部分参考了broadcom的实现。

(1)网络设备

Linux设备驱动分为:字符设备,块设备,网络设备. 在WLAN模块中,wifi自然属于网络设备之列.

下图为网络设备在Linux系统中的层次结构.

在让人耳熟能详的TCP/IP协议栈之下就是网络设备的地盘.这里首先说明一下net_device中几个重要的属性.

struct net_device

{

//用于存放网络设备的设备名称;

char name[IFNAMSIZ]; --> wlan0

//网络设备的接口索引值,独一无二的网络设备标识符;

int ifindex; ---> ioctl的索引

//网络设备接口的最大传输单元;

unsigned mtu; --->1500

//硬件接口头长度;

unsigned short hard_header_len;

//网络设备接口的MAC地址;

unsigned char *dev_addr;

}

(2)命令处理

在android-O的最新架构中,scan命令不再由wpa_supplicant发送给driver,而是直由上层的netlinkMananger发送,这样省略了通过wpa这个中间件.个人理解google这次修改的原因是因为scan命令是一个十分频繁并且要求实时反馈的命令,总是通过wpa_supplicant发送该信息在内存和时间上都没有好处.并且scan命令不同于assoc, disassoc, reassoc等需要封装完整的数据包给driver,所以scan命令也具备从wpa_supplicant中独立出来的条件.

(3)数据收发

作为网络设备, 最重要的功能就是保证数据收发的稳定和高速。所有网络设备的数据收发如下

下图简要说明了数据收发过程中的代码调用.

DHCP

DHCP为ipv4的NAT地址控制提供了有效的帮助,使得局域网内的ip地址可以精确的分配。

上图为DHCP的架构,其中还有ip地址租赁延长的消息没有体现出来。这里先不赘述。

总结

这里不介绍wpa_supplicant的内容,出于一下原因:

1. Wpa_supplicant代码体积大, 但是很少出现问题

2. Wpa_supplicant是开源项目,可以从网上得到资料

3. 深入理解android wifi模块这本书对wpa_supplicant进行了系统的讲解.

Wifi的内容很多,不仅设计了802.11协议还夹杂了各类rfc安全协议.所以这里仅仅介绍STA功能中简单的代码架构,具体的每一处代码还需要继续研究.此外,在驱动程序中可以看到,数据收发数据无差别的适应方式应该涵盖了STA,P2P,SoftAp.而前期的交互中,SoftAp部分代码基本与STA和P2P独立, 而STA和P2P之间有着相近的函数调用.

Android-O的变化可以看出google在接下来的版本中会继续将framework中java部分的实现向C++迁移,同时java8的特性也在这一版本中体现.不仅体现了google对android不遗余力的优化.

参考资料

http://weiguozhihui.blog.51cto.com/3060615/1584894

深入理解android WiFi、NFC、GPS卷

802.11权威指南

wifip2p重连 android,Android Wifi实现分析相关推荐

  1. Android系统WIFI显示已保存但不会自动重连

    问题描述 使用Android设备,已经连接过的WIFI不会自动重连,且显示已保存 问题分析 显示已保存说明连接的WIFI信息已经保存,Android 11连接的WIFI信息保存在该文件/data/mi ...

  2. 【Android 12.0】Android S WiFi启动业务流程分析(UML图)

    以下两张为Android S的WiFi启动(start)业务流程UML图,业务流程的过程详情因公司规定不可复制源码出来,所以想看业务流程详情的同学可以参考其他博主所发的博客.业务流程参考内容链接我会放 ...

  3. (五十三) Android O wifi 状态机消息处理及状态切换流程分析-以WifiController为例

    前言:最近写了几篇wifi状态机相关的博客,但是状态转换方面一直是囫囵吞枣,感觉代码对的上流程就开始梳理了,没有真正关注过状态切换和消息处理流程,现在梳理一下. 1. wifi 状态机消息处理及状态切 ...

  4. android wifi模块分析

    声明:本文纯属网上资料收集,版权归源作者所有,转载时请标明为转载文章 现在对android平台的wifi模块了解了一段时间,现在做一些简要总结,以便以后查阅和与修正,上正文. [Wifi模块学习流程] ...

  5. 【WLAN】Wi-Fi Direct---从 Android 13 supplicant 视角分析 Go端代码

    以下代码是基于Android 13基线上分析 在讲解这边之前,建议大家先看下我写的这篇文章 [WLAN]Wi-Fi Direct 用户指南_专业开发者的博客-CSDN博客 接下来主要根据P2p的Go端 ...

  6. android wifi的进程,Android wifi简要分析

    这里列了很多,但是大致可以分为四个主要的类ScanResult wifiConfiguration WifiInfo WifiManager (1)ScanResult,主要是通过wifi 硬件的扫描 ...

  7. android移动停车车位管理系统的分析与设计,基于Android与WiFi的智能停车管理系统的设计与实现...

    摘要: 伴随着我国人民平均收入的不断提高,汽车已经成为人们出行的主流交通工具,城区商业金融和医疗服务中心的"停车难"成为阻碍城市交通发展的一大难题.传统的停车引导方式缺乏高效的停车 ...

  8. 全志平台Android系统WIFI架构工作流程分析

    1. 前言 记录个人最近对Android wifi的了解和使用感受, 并为想入门.学习Android wifi的人员提供一定的参考 2. Android系统中的WIFI架构 wifi在Android中 ...

  9. Android卡顿优化分析

    本篇包含的主要内容如下所示: 1.卡顿优化分析方法与工具 2.自动化卡顿检测方案及优化 在某个 App 的时候,有时我们会看到某个 App 运行起来,即出现了卡现象,如何去定义发生了卡现象呢?马上来了 ...

  10. Android以太网框架情景分析之NetworkFactory与NetworkAgent深入分析

    Android以太网框架情景分析之NetworkFactory与NetworkAgent深入分析 Android网络框架分析系列文章目录: Android P适配以太网功能开发指南 Android以太 ...

最新文章

  1. 上海考研计算机专业院校排名,2018考研:计算机专业全球院校排名公布,上海交通大学竟排第一?...
  2. mysql pom依赖关系_常用的POM依赖
  3. 大二暑假周进度报告(三)
  4. Python面向对象进阶及类成员
  5. php windows图片路径问题,解决PHP在Windows IIS 上传的图片无法访问的问题
  6. 6 步搭建数据平台—从指标体系到相关技术 | 周四话数据
  7. android点击弹出滑动条,IndicatorSeekBar Android自定义SeekBar,滑动时弹出气泡指示器显示进度...
  8. lucene简介_Lucene简介
  9. 特斯拉接连出闹剧?一次比一次渗人...
  10. 啤酒与尿布,咩叔原创基于图论简单到爆的实时关联性算法
  11. opencv裁剪图片_前端智能化实践——从图片识别UI样式
  12. 虚拟主机如何创建svn服务器,虚拟主机搭建svn
  13. install openni2 on ubuntu
  14. 开发人员速查表-收集
  15. spring 定时任务表达式正确性校验
  16. 2019年11月中华人民共和国县以上行政区划代码(用于身份证前六位判断户籍所在地)
  17. 服务器appcrash的问题怎么修复,ghost win7出现appcrash的问题怎么修复
  18. 俄罗斯方块的设计思路
  19. 动态绘制图形的基本思路
  20. php files 转数组,转 PHP文件上传$_FILES数组各键值含义说明

热门文章

  1. 不适合创业的10种人
  2. 苹果台式机忘记开机密码怎么办
  3. 学校开展计算机培训活动,我校举办学生高级领导力专题培训活动
  4. 计算机表格列宽怎么设置,excel自动调整列宽在哪?excel中怎么自动调整各行宽度...
  5. vmware win7 iso 镜像文件下载
  6. XCTF练习题---MISC---Cephalopod
  7. 项目笔记:EGO商城
  8. 网友自制的谷歌输入法皮肤及制作方法
  9. 更改OneDrive网页版OneNote笔记使用桌面应用打开时的默认应用
  10. 快速搭建python文件服务器,上传下载文件,快速搭建。