本文转载自:http://blog.csdn.net/liuhaomatou/article/details/40398753

在了解WIFI模块的系统架构之前。我心中就有一个疑问,那么Android的系统架构是怎样的呢。其实现在网络中有很多关于android系统架构的描述和解释,在这里我不做详细的研究了,只是贴张图重新温故一下。具体细节还要查看android源码,多问度娘和google大神。



 


 

一、wpa_supplicant是什么?

wpa_supplicant本是开源项目源码,被谷歌修改后加入android移动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。 简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。

Android WiFi系统架构如下图所示:

wpa_supplicant 进程实现的入口函数为:external/wpa_supplicant_8/wpa_supplicant/main.c中的main函数, 此程序在hardware/libhardware_legacy/wifi/wifi.c中的wifi_start_supplicant_common中被启动(property_set("ctl.start", daemon_cmd))。

二:Android Wifi 系统架构

Android WiFi系统引入了wpa_supplicant,它的整个WiFi系统以wpa_supplicant为核心来定义上层用户接口和下层驱动接口。整个WiFi系统架构如下图所示:

下面对上图部分细节做出详细分析

1.1 WifiService

由SystemServer启动的时候生成的ConnecttivityService创建,负责启动关闭wpa_supplicant,启动和关闭WifiMonitor线程,把命令下发给wpa_supplicant以及更新WIFI的状态。

处理其它模块通过IWifiManager接口发送过来的远端WiFi操作。

1.2 WifiMonitor

负责从wpa_supplicant接收事件通知。

1.3 wpa_supplicant

1) 读取配置文件
  2) 初始化配置参数,驱动函数
  3) 让驱动scan当前所有的bssid
  4) 检查扫描的参数是否和用户设置的相符
  5) 如果相符,通知驱动进行权限和认证操作
  6) 连上AP

1.4 Wifi驱动模块

厂商提供的source,主要进行load firware和kernel的wireless进行通信

1.5 Wifi电源管理模块

主要控制硬件的GPIO和上下电,让CPU和Wifi模组之间通过sdio接口或USB接口通信

1.6 Wifi工作步骤

1) Wifi启动
  2) 开始扫描
  3) 显示扫描的AP
  4) 配置AP
  5) 连接AP
  6) 获取IP地址
  7) 上网

1.7 Wifi模块代码

   1) Wifi Settings应用程序
       packages/apps/Settings/src/com/android/settings/wifi

2) Wifi Framework
       frameworks/base/wifi/Java/android/net/wifi (UI通过android.NET.wifi package
发送命令给wifi.c)

frameworks/base/core/java/android/net(更高一级的网络管理)
       frameworks/base/services/java/com/android/server

   3) Wifi JNI
       frameworks/base/core/jni/android_net_wifi_Wifi.cpp
   4) Wifi Hardware (wifi管理库)
       hardware/libhardware_legacy/wifi/wifi.c

   5) wpa_supplicant(wifi  tool)

external/wpa_supplicant8
       (1) wpa_client (生成库libwpaclient.so)

external/wpa_supplicant_8/wpa_supplicant/src/common/wpa_ctrl.c

(2) wpa_server (生成守护进程wpa_supplicant)

external/wpa_supplicant_8/wpa_supplicant/main.c
   6) Wifi kernel
       net/wireless     drivers/wlan_xxx       arch/arm/mach-xxx/wlan_pm.c

三:WifiService和wpa_supplicant启动流程。

WifiService和wpa_supplicant启动流程如下图所示:


2.1 状态变化

• 加载wifi驱动的状态变化流程如下:

初始状态:mInitialState

|
          mDriverUnloadedState

|
      mWaitForP2pDisableState

|
mDriverLoadingState(其enter中调用WifiNative.loadDriver)

• 启动wpa_supplicant的状态变化如下:
   在DriverLoadedState状态的processMessage中调用WifiNative.startSupplicant

3. 生产时自动打开Wifi

在生产时, 默认Wifi是关闭的,如果需要默认打开,可修改wifiservice.java中的如下代码:

  1. /**
  2. * Check if Wi-Fi needs to be enabled and start
  3. * if needed
  4. *
  5. * This function is used only at boot time
  6. */
  7. public void checkAndStartWifi() {
  8. mAirplaneModeOn.set(isAirplaneModeOn());
  9. mPersistWifiState.set(getPersistedWifiState());
  10. /* Start if Wi-Fi should be enabled or the saved state indicates Wi-Fi was on */
  11. boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState();
  12. Slog.i(TAG, "WifiService starting up with Wi-Fi " +
  13. (wifiEnabled ? "enabled" : "disabled"));
  14. setWifiEnabled(wifiEnabled); //强制设置为true
  15. mWifiWatchdogStateMachine = WifiWatchdogStateMachine.
  16. makeWifiWatchdogStateMachine(mContext);
  17. }

四:Android WiFi 应用程序例子

在Android里,所有的wifi操作都在android.Net.wifi包里,而常用的类也就只用几个,对于一般的开发人员来说,常用的操作也是有限的,不需要刻意的去记,用的时候现查就ok了。以下是官方API 网址:

https://developer.android.com/reference/android/net/wifi/package-summary.html

https://developer.android.com/guide/topics/connectivity/wifip2p.html

以下是一些wifi应用的常用功能代码:

  1. package com.yarin.android.Examples_08_08;
  2. import java.util.List;
  3. import android.content.Context;
  4. import android.net.wifi.ScanResult;
  5. import android.net.wifi.WifiConfiguration;
  6. import android.net.wifi.WifiInfo;
  7. import android.net.wifi.WifiManager;
  8. import android.net.wifi.WifiManager.WifiLock;
  9. public class WifiAdmin
  10. {
  11. //定义WifiManager对象
  12. private WifiManager mWifiManager;
  13. //定义WifiInfo对象
  14. private WifiInfo mWifiInfo;
  15. //扫描出的网络连接列表
  16. private List<ScanResult> mWifiList;
  17. //网络连接列表
  18. private List<WifiConfiguration> mWifiConfiguration;
  19. //定义一个WifiLock
  20. WifiLock mWifiLock;
  21. //构造器
  22. public  WifiAdmin(Context context)
  23. {
  24. //取得WifiManager对象
  25. mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
  26. //取得WifiInfo对象
  27. mWifiInfo = mWifiManager.getConnectionInfo();
  28. }
  29. //打开WIFI
  30. public void OpenWifi()
  31. {
  32. if (!mWifiManager.isWifiEnabled())
  33. {
  34. mWifiManager.setWifiEnabled(true);
  35. }
  36. }
  37. //关闭WIFI
  38. public void CloseWifi()
  39. {
  40. if (!mWifiManager.isWifiEnabled())
  41. {
  42. mWifiManager.setWifiEnabled(false);
  43. }
  44. }
  45. //锁定WifiLock
  46. public void AcquireWifiLock()
  47. {
  48. mWifiLock.acquire();
  49. }
  50. //解锁WifiLock
  51. public void ReleaseWifiLock()
  52. {
  53. //判断时候锁定
  54. if (mWifiLock.isHeld())
  55. {
  56. mWifiLock.release();
  57. }
  58. }
  59. //创建一个WifiLock
  60. public void CreatWifiLock()
  61. {
  62. mWifiLock = mWifiManager.createWifiLock("Test");
  63. }
  64. //得到配置好的网络
  65. public List<WifiConfiguration> GetConfiguration()
  66. {
  67. return mWifiConfiguration;
  68. }
  69. //指定配置好的网络进行连接
  70. public void ConnectConfiguration(int index)
  71. {
  72. //索引大于配置好的网络索引返回
  73. if(index > mWifiConfiguration.size())
  74. {
  75. return;
  76. }
  77. //连接配置好的指定ID的网络
  78. mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true);
  79. }
  80. public void StartScan()
  81. {
  82. mWifiManager.startScan();
  83. //得到扫描结果
  84. mWifiList = mWifiManager.getScanResults();
  85. //得到配置好的网络连接
  86. mWifiConfiguration = mWifiManager.getConfiguredNetworks();
  87. }
  88. //得到网络列表
  89. public List<ScanResult> GetWifiList()
  90. {
  91. return mWifiList;
  92. }
  93. //查看扫描结果
  94. public StringBuilder LookUpScan()
  95. {
  96. StringBuilder stringBuilder = new StringBuilder();
  97. for (int i = 0; i < mWifiList.size(); i++)
  98. {
  99. stringBuilder.append("Index_"+new Integer(i + 1).toString() + ":");
  100. //将ScanResult信息转换成一个字符串包
  101. //其中把包括:BSSID、SSID、capabilities、frequency、level
  102. stringBuilder.append((mWifiList.get(i)).toString());
  103. stringBuilder.append("/n");
  104. }
  105. return stringBuilder;
  106. }
  107. //得到MAC地址
  108. public String GetMacAddress()
  109. {
  110. return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();
  111. }
  112. //得到接入点的BSSID
  113. public String GetBSSID()
  114. {
  115. return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();
  116. }
  117. //得到IP地址
  118. public int GetIPAddress()
  119. {
  120. return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
  121. }
  122. //得到连接的ID
  123. public int GetNetworkId()
  124. {
  125. return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
  126. }
  127. //得到WifiInfo的所有信息包
  128. public String GetWifiInfo()
  129. {
  130. return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();
  131. }
  132. //添加一个网络并连接
  133. public void AddNetwork(WifiConfiguration wcg)
  134. {
  135. int wcgID = mWifiManager.addNetwork(wcg);
  136. mWifiManager.enableNetwork(wcgID, true);
  137. }
  138. //断开指定ID的网络
  139. public void DisconnectWifi(int netId)
  140. {
  141. mWifiManager.disableNetwork(netId);
  142. mWifiManager.disconnect();
  143. }
  144. }

转自:http://blog.csdn.net/myarrow/article/category/1269709

 

Android WiFi系统架构【转】的更多相关文章

  1. android——wifi系统架构

    1. 系统架构 Android WiFi系统引入了wpa_supplicant,它的整个WiFi系统以wpa_supplicant为核心来定义上层用户接口和下层驱动接口.整个WiFi系统架构如下图所示 ...

  2. Android WiFi系统【转】

    本文转载自:http://blog.csdn.net/gabbzang/article/details/10584587 一.wpa_supplicant是什么? wpa_supplicant本是开源 ...

  3. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  4. Android入门(二):Android的系统架构

    android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层.   从技术方面看,An ...

  5. Android 的系统架构

    Android 的系统架构 Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所 ...

  6. Android的系统架构

    转自Android的系统架构 从上图中可以看出,Android系统架构为四层结构,从上层到下层分别是应用程序层.应用程序框架层.系统运行库层以及Linux内核层,分别介绍如下:     1)应用程序层 ...

  7. Android之系统架构

    Android 是Google开发的基于Linux平台的开源手机操作系统.它包括操作系统.用户界面和应用程序 —— 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍.Andr ...

  8. Android面试题3之描写叙述下Android的系统架构

    描写叙述下Android的系统架构: Android系统从下往上分为Linux内核层(linux kerner),执行库(runtime library),应用程序框架层,应用程序层 linuxker ...

  9. 「Android」系统架构概述

    目录: 1.Android系统架构 2.Android类库 3.四大组件 --------------------------------------------------------------- ...

随机推荐

  1. CentOS7.0修改主机名(hostname)

    Linux中的hostname在大多数应用中至为重要,例如有些应用强制使用主机名称而不能使用IP地址,如果默认主机名称都为localhost.localdomain 的话那一定会出现问题,而且看起来也 ...

  2. ClassPathXmlApplicationContext和FileSystemXmlApplicationContext区别

    ClassPathXmlApplicationContext 默认文件路径是src下那一级classpath:和classpath*:的区别: classpath: 只能加载一个配置文件,如果配置了多 ...

  3. 2016.7.12 去除mybatis-generator生成的class里的注释

    用mybatis-generator自动生成代码会出现很多没必要的注释.     在配置文件里加上: 是否去除所有自动生成的文件的时间戳: 是否去除所有自动生成文件的注释: <commentGe ...

  4. Android开发有用的三方网站

    聚合数据-免费数据调用 https://www.juhe.cn/ 有赞- 免费的微商城 http://youzan.com/ 秀米微信图文编辑器 http://xiumi.us/ 禅道项目管理软件 h ...

  5. UNP学习笔记(第五章 TCP客户/服务程序实例)

    我们将在本章使用前一章中介绍的基本函数编写一个完整的TCP客户/服务器程序实例 这个简单得例子是执行如下步骤的一个回射服务器: TCP回射服务器程序 #include "unp.h" ...

  6. IP、操作系统、移动OS

    IP IP地址 = 网络地址 + 主机地址/IP地址 = 网络地址 + 子网地址 + 主机地址. DNS :进行域名解析的服务器.             比如,sina.com(是域名).其实是一个 ...

  7. node.js ----NPM使用介绍

    NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从 ...

  8. 高阶函数:map()/reduce()

    Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clus ...

  9. linux - console/terminal/virtual console/pseudo terminal ...

    http://en.wikipedia.org/wiki/System_console System console Knoppix system console showing the boot p ...

  10. jquery中this和$(this)使用的地方

    插件中this代表$('元素')选择器 on()函数中this代表单个元素,$(this)代表单个选择器 反正有时代表整体,有时代表单个,代表单个时可以用$(this)来把他变成jquery对象