【Android源码 栏目提醒】:网学会员在Android源码 频道为大家收集整理了“Android_WiFi工作原理 - 计算机教材“提供大家参考,希望对大家有所帮助!
AndroidWi-Fi 工作原理 刘洋 第一部分
Android 概述 在介绍 Wi-Fi 之前,先简要介绍一下
Android 系统,主要分析一下
Android 的按层实现的原理。
Android 层次结构是整个
Android 体系中所有应用实现的基础框架,而
Android 源代码结构则与 Wi-Fi 的实现细节有关。
1.1 基础知识
Android 是一款当前最为流行的手机操作系统,它本身的开放性加上 Google公司的大力推广,使其获得了大量手机生产厂商、科研院校、软件公司以及个人开发者的青睐,它属于一个全开放的平台,因此开发者可以得到整个系统的源代码,并能对其进行修改,修改的结果可以通过互联网上传到
Android 官方网站,倘若被审核通过,就能加入到
Android 的源代码中,这绝对是一件令人兴奋的事情。
1.2
Android 层次结构
Android 系统是在 Linux 系统的基础上,经过了层层封装,最终提供给开发者的是大量的 Java API,在这里被叫做
Android API,于是,开发者就可以像开发一般的 Java 程序那样开发
Android 应用程序,这样的设计不仅降低了开发
Android应用程序的难度,还增加了
Android 系统的界面友好度。
和一般的操作系统一样,
Android 也是对硬件进行了多层的封装,使得应用程序的开发者和用户能轻松地操作硬件,完成他们所希望完成的事情。
Android所针对的硬件就是手机,这里主要指智能手机,这种智能手机与传统的手机相比电话功能被弱化,而更偏向于一台笔记本电脑,因此它的 CPU、内存等硬件配置要比传统的手机高。
它需要提供给用户一些电脑所拥有的功能,比如说 Wi-Fi 上网、鼠标或触屏控制的界面、收发电子邮件、玩大型游戏等,但同时又必须拥有传统手机所支持的电话、摄像头、蓝牙等功,这些挑战都增加了
Android 的设计难度。
Android 从下至上可以分为这样几个层次: ; (1)Linux 内核及驱动层(C 实现) (2)本地库(C 库和 C库)和 Java 运行时环境层(主要由 C、C实现); (3)Java 框架层(主要由 Java 实现); 。
(4)Java 应用程序层(Java 实现) 第 3 层和第 4 层之间就是上文所说的
Android API,这也是
Android 提供给应用程序开发人员的接口,我们只要熟悉了这些 API,就可以进行
Android 应用程序的开发工作了。
Android 手机中所有的额应用程序,包括核心应用程序和用户开发的应用程序,它们都属于第 4 层次,用户可以得到系统自带的所有程序的源代码,比如初始界面管理程序、短信程序、日历、联系人管理程序等,并能随意修改这些程序,甚至还可以删除其中的一两个,然后重新编译源代码,这样便生成了自己定制的
Android 系统。
1.3
Android 源代码结构 虽然只看 API 就可以编写
Android 的应用程序了,但是无论对
Android 系统的研究人员还是应用程序的开发者来说,
Android 的源代码都是一笔值得好好研究的财富。
Android 的源代码可以从其官方网站上下载到,在此之前,本机上需要装 Linux系统,然后根据官网上的步骤逐步执行,包括初始化系统环境、下载
源码、编译
源码,就可以在本机上下载并编译整个
Android 系统的源代码。
讲述如何下载并编 译
Android 源 代 码 的 官 网 地 址 如 下 :http://source.
android.com/source/initializing.html。
纵观整个
Android 源码的结构,在其根目录下有大约 10 多个文件夹,其中可以大致分为以下三部分: (1) 关键部分 这部分的实现代码位于根目录下除了 external 和 package 之外的所有文件夹中,这些代码实现了 Linux 内核 kernel 文件夹、核心驱动、
Android 驱动、
Android Dalvik 虚拟机 dalvik 文件夹、 和 C本地库 bionic系统的建立 build 文件夹、 C文件夹、硬件抽象、无线硬件接口 hardware/ril 文件夹、Java 运行环境的支持等功能,是整个
Android 系统的启动和运行所必须的。
(2) 扩展部分 这部分的实现代码位于 external 文件夹中,这里边存放着许多其他开源项目,这些项目都已经过修改而融入到
Android 系统中。
(3) 应用程序包 这部分代码位于 package 文件夹中,由应用程序 、 (apps) 提供器(providers)、输入法(input methods)三部分组成。
Android 手机自带的应用程序就位于./package/apps 中,这里有 Browser(浏览器) AlarmClock(闹钟) Camera(照相机) Contacts(联系人) Settings(设置) Launcher(初始界面)等,还有一些,在此不再一一罗列。
第二部分 Wi-Fi 层次结构
Android 中 Wi-Fi 驱动程序被编译成内核的模块,通过应用程序设置开关进行加载和卸载,具体来说就是 Settings -- Wireless networks -- Wi-Fi。
同时,要使Wi-Fi 正常工作,驱动中还需要实现烧写固件程序和配置信息到 Wi-Fi 的芯片中。
2.1 Wi-Fi 程序模块 在
Android 的源代码中,有多处地方涉及到 Wi-Fi,跨越了前文中所说的 1、2、3、4 层。
下面介绍几个与实现 Wi-Fi 功能密切相关的程序模块。
2.1.1 开源库 wpa_supplicant 它是一个开源的库,加入到
Android 源码中,经过修改后成为
Android 实现Wi-Fi 功能的基础。
它的代码位于./external/wpa_supplicant 文件夹中,主要用 C和 C写成,实现了从上层接到命令后,发送给硬件驱动程序,接着操作硬件完成需要的操作,这里是通过 socket 来与硬件驱动进行通信的。
下图 2-1 是wpa_supplicant 的框架图。
图 2-1 wpa_supplicant 开源项目框架图2.1.2 硬件驱动程序 前 文 所 说 的 wpa_supplicant 与 之 通 信 的 硬 件 驱 动 的 代 码 位于./hardware/libhardware_legacy/wifi/wifi.c 中。
2.1.3 JNI 部分 首先简要介绍一下 JNI,JNI 是 Java Native Interface 的缩写,它实现了 Java 代码与其他代码进行交互,使得在 Java 虚拟机中运行的 Java 代码能够与用其他语言编写的应用程序和库进行交互。
在
Android 中,JNI 可以让 Java 程序调用 C 程序。
与 Wi-Fi 相 关 的 JNI 代 码 位于./frameworks/base/core/jni/
android_net_wifi_Wifi.cpp 中。
2.1.4 Wi-FiAPI 部分 使应用程序可以使用 Wi-Fi 这部分源代码使用 Java 完成了对 Wi-Fi API 的封装,功 能 , 它 们 位 于 frameworks/base/services/java/com/
android/server/ 和frameworks/base/wifi/java/
android/net/wifi/中。
2.1.5 Wi-Fi Settings 应用程序部分 这是
Android 中自带的一个应用程序,在手机的 Settings 中,它可以让用户手动打开或关闭 Wi-Fi 功能。
当用户打开 Wi-Fi 功能后,它会自动搜索周围的无线网络,并以列表的形式显示,供用户选择,默认会连接用户上一次成功连接的无线网络。
这部分代码位于./packages/apps/Settings/src/com/
android/settings/wifi中。
2.2 Wi-Fi 层次结构关系 下图 2-2 就是
Android 中 Wi-Fi 的各模块在整个
Android 层次结构中的位置,以及它们之间的关系。
Android中Wi-Fi层次结构 Java应用 Wi-Fi Settings应 程序层 用程序 Wi-Fi API Java框架层
android.net.wifi Wi-Fi JNI 自上而下 本地库和 Wpa adaptorwpa Java运行 适配器 时环境层 开源库 wpa_supplicant linux内核 及驱动层 Wi-Fi硬件驱动 wifi.c 图 2-2
Android 中 Wi-Fi 的层次结构图第三部分 Wi-Fi 执行过程
Android 中 Wi-Fi 是使用层次结构设计的,因此执行过程基本上是在接到用户命令后,先从上到下,再从下到上,完成用户与 Wi-Fi 设备的交互。
下图 3-1 就是 Wi-Fi 功能的详细执行过程示意图。
图 3-1 Wi-Fi 执行过程示意图 如上图 3-1 所示,Wi-Fi 的执行过程主要有 4 个,下文将对这几个过程进行详细介绍。
3.1 从 Settings 中启动 Wi-Fi
Android 会调用 WifiEnabler 的 onPreferenceChange, 当用户按下 Wi-Fi 按钮后,再由 WifiEnabler 调用 WifiManager 的 setWifiEnabled 接口函数,通过 AIDL,实际调用的是 WifiService 的 setWifiEnabled 函数,WifiService 接着向自身发送一条MESSAGE_ENABLE_WIFI 消息,在处理该消息的代码中做真正的使能工作:首先装载 WIFI 内核模块(该模块的位置硬编码为/system/lib/modules/wlan.ko ),然 后 启 动 wpa_supplicant ( 配 置 文 件 硬 编 码 为/data/misc/wifi/wpa_supplicant.conf ), 再 通 过 WifiStateTracker 来 启 动WifiMonitor 中的监视线程。
当使能成功后,会广播发送 WIFI_STATE_CHANGED_ACTION 这个 Intent 通知外界 Wi-Fi 已经成功使能了。
WifiEnabler 创建的时候就会向
Android 注册接收WIFI_STATE_CHANGED_ACTION,因此它会收到该 Intent,从而开始扫描。
3.2 查找 Access Point AP 扫描的入口函数是 WifiService 的 startScan,它其实也就是往 wpa_supplicant发送 SCAN 命令。
当 wpa_supplicant 处理完 SCAN 命令后,它会向控制通道发送事 件 通 知 扫 描 完 成 , 从 而 wifi_wait_for_event 函 数 会 接 收 到 该 事件 , 由 此WifiMonitor 中的 MonitorThread 会被执行来出来这个事件,WifiStateTracker 则接着广播发 SCAN_RESULTS_AVAILABLE_ACTION 这个 Intent,WifiLayer 注册了接收SCAN_RESULTS_AVAILABLE_ACTION 这 个 Intent , 所 以 它 的 相 关 处 理 函 数handleScanResultsAvailable 会被调用,在该函数中,先会去拿到 SCAN 的结果(最 。
终是往 wpa_supplicant 发送 SCAN_RESULT 命令并读取返回值来实现的) 对 每 一 个 扫 描 返 回 的 AP , WifiLayer 会 调 用 WifiSettings 的onAccessPointSetChanged 函数,从而最终把该 AP 加到 GUI 显示列表中。
3.3 连接 AP 当用户在 AcessPointDialog 中选择好加密方式和输入密钥之后,再点击连接按钮,
Android 就会去连接这个 AP。
WifiLayer 会 先 检 测 这 个 AP 是 不 是 之 前 被 配 置 过 , 这 个 是 通 过 向wpa_supplicant 发送 LIST_NETWORK 命令并且比较返回值来实现的,如果wpa_supplicant 没 有 这 个 AP 的 配 置 信 息 , 则 会 向 wpa_supplicant 发 送ADD_NETWORK 命令来添加该 AP,ADD_NETWORK 命令会返回一个 ID ,WifiLayer 再 用 这 个 返 回 的 ID 作 为 参 数 向 wpa_supplicant 发 送ENABLE_NETWORK 命令,从而让 wpa_supplicant 去连接该 AP。
3.4 配置 IP 地址 当 wpa_supplicant 成功连接上 AP 之后,它会向控制通道发送事件通知连接上 AP 了,从而 wifi_wait_for_event 函数会接收到该事件,由此 WifiMonitor 中的MonitorThread 会被执行来处理这个事件,WifiMonitor 再调用 WifiStateTracker 的notifyStateChange,WifiStateTracker 则接着会往自身发送 EVENT_DHCP_START 消息 来 启 动 DHCP 去 获 取 IP 地 址 , 然 后 再 广 播 发 送NETWORK_STATE_CHANGED_ACTION 这个 Intent。
WifiLayer 注册了接收 NETWORK_STATE_CHANGED_ACTION 这个 Intent,所以 当它的相关处理函数 handleNetworkStateChanged 会被调用, DHCP 拿到 IP 地址之 后 , 会 再 发 送 EVENT_DHCP_SUCCEEDED 消 息 , WifiLayer 处 理EVENT_DHCP_SUCCEEDED 消 息 , 会 再 次 广 播 发 送NETWORK_STATE_CHANGED_ACTION 这个 Intent,这次带上完整的 IP 地址信息。
至此为止,整个连接过程完成。
上一篇:
58
下一篇:
电话销售英文简历范文