热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

wifi架构

wifi的层次结构wifi分为以下几个层次:wifisetting,UI界面wififrameworkwifi硬件抽象层wifi服务层wifi驱动层

wifi的层次结构

wifi分为以下几个层次:

  1. wifi setting,UI界面
  2. wifi framework
  3. wifi 硬件抽象层
  4. wifi 服务层
  5. wifi驱动层

wifi setting

wifi的ui界面主要在如下的目录中:packages\apps\Settings\src\com\android\settings\wifi.

  • WifiSettings.java负责显示wifi的设置界面。
  • WifiEnabler.java主要是wifi的开关逻辑
  • WifiDialog.java负责wifi的对话框显示
  • AdvancedSettings.java负责wifi的高级选项的显示
  • AccessPoint.java表示一个ap所有属性的一个类
  • WifiInfo.java主要是wifi的一些配置信息,列如鉴权方式,密码,ssid等

wifi界面的编译输出是在settings.apk中。为什么要说每层的编译输出结果呢,因为在调试中,你可能只是修改了某一层的某几个文件而已,这时候,你没必要重新编译整个文件系统,而只要编译这一层对应的输出,然后通过adb或其他的途径替换原有的包,再重起目标板,就可以生效了。

wifi framework

wifi的framework主要有如下几个类:

  • framework/base/wifi/java/android/net/wifi/wifiManager.java
  • framework/base/services/java/com/android/wifiService.java
  • framework/base/wifi/java/android/net/wifi/wifiMonitor.java
  • framework/base/core/jni/android_net_wifi_wifi.cpp

他们的编译输出主要有两个类:一个framework.jar,另一个是services.jar,由于这一层的修改要编译整个framework 或services,所以编译时间长,调试花费时间长。但理论上,可以只编译修改的类,然后替换framework.jar或services.jar对应的类即可。该过程可以通过java的perl脚本来实现,可以大大节省编译的时间,加快调试的进度,好言归正传!

wifiManager.java是通过ibinder调用到wifiservice.java的,wifiManager.java只是封装了一些供sdk开发用的api接口,如果要了解当前sdk关于wifi相关的api,可以查看android文件系统的current.xml文件,wifiManager.java现实的主要功能都是在wifiservice.java中实现的,所以wifisercie.java是我们研究wifi的主要对象。

wifiservice.java主要是执行一些wifi的命令,如扫描,连接ap,断开ap等,更详细的就没必要说了,看代码。但需要知道,这个类主要就是用来执行wifi的命令的,wifi是有两条路的,一条是执行命令的路径,一条是接口事件的路径。而wifiservice.java正是用来执行命令的。

而wifiMonitor.java就是用来接收服务层上来的事件的,例如:断开,连接,有扫描结果等事件,也就是刚说的wifi的另一条路径。

而android_net_wifi_wifi.cpp就是典型jni接口了,通过它来直接调用到wifi的硬件抽象层。

wifi 硬件抽象层

wifi的硬件抽象层就是:hardware/libharedware_legacy/wifi/wifi.c,该层居于wifi framework与wifi wpa_supplicant服务层之间,起着承上启下的作用,具体是:android_net_wifi_wifi.cpp中的大部分接口都是直接有wifi.c文件来实现,该文件通过socket接口来跟wifi服务层来通讯。

wifi 服务层

wifi的服务层就是wpa_supplicant层,该层是wifi framework层的基石,该层与上层的wifi.c通过socket通讯方式来实现控制接口,同样也是通过socket通讯方式实现了事件接口,控制接口对应用于wifiservice.java的命令的发送;而事件接口对应用wifimonitor.java的事件的接收。从而实现了命令和事件两条通路。

该层的代码路径是:external/wpa_supplicant/目录下。

wpa_supplicant的功能很强大,在目前的android机器里,wifi除了传输应用数据不会经过wpa_supplicant这一层以外,其他上层所有相关的功能都会间接的调用的wpa_supplicant这一层。譬如:点击扫描按钮,连接ap,断开ap,信号强度的动态改变,获取扫描结果,鉴权,等等都是要通过wpa_supplicant来执行实际的功能。

而这一层跟wifi的驱动就典型的socket系统调用了,大家都知道使用socket,得指定所使用的协议族,在这里,PF_INET协议就是我们通用的tcp/ip协议;而PF_NETLINK协议族是用于wpa_supplicant获取内核上来的事件的;而PF_PACKET协议族是说用于接收基于链路层上的裸数据的,该协议主要用来做鉴权的,诸如wpa,wpa2,wapi等。

wifi驱动层

该层是在内核目录下,有两种存在形式,一个是模块驱动方式,此时代码就可能不在内核里,一种是内核内建(buit-in)方式,就是包含在内核里,linux内核已经支持了很多的wifi网卡的驱动。通常在目录内核根目录:drivers\net\wireless下面。

wifi驱动从某种意义上将可以分为两种:一种是硬件mac,就是mac协议由硬件实现,当然省时又省力了。另一种是软mac,就是由软件来实现mac,软件复杂些,但可以节省硬件成本。软mac在linux下的目录如下:net/mac80211。

wifi从硬件接口上将,分为sdio接口,usb接口,pcmcia接口。目前嵌入式上主流是sdio接口和usb接口。分别需要硬件资源有sdio控制器和usb主控制器及相应的驱动的支持。

wifi驱动架构遵循一般的网络设备驱动模型的架构,当然又不同于一般的有线网络驱动模型。具体的鉴于篇幅在这里就不详细讨论了,因为这一篇是讨论架构的,不拘泥于细节的。

最后:讲了这么多层次结构,怎么样把他们串起来呢?这个要留给读者了,但我可以给你一个不坏的建议(如果你不能提供更好的建议的话):你可以在手机上点击扫描操作,看扫描命令时怎么样发送下去,直止驱动里是怎么驱动的,而后wifi网卡接收到驱动里的扫描命令后,开始努力的扫描,扫描完后,如果有扫描结果,会通过事件又是怎么样将扫描结果上传给wifi上层并显示出来的。

 


推荐阅读
  • 应用链时代,详解 Avalanche 与 Cosmos 的差异 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 未定义的打字稿记录:探索其成因与解决方案 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文探讨了在使用 Outlook 时遇到的一个常见问题:无法加载 SAVCORP90 插件,导致软件功能受限。该问题通常表现为在启动 Outlook 时会收到错误提示,影响用户的正常使用体验。文章详细分析了可能的原因,并提供了多种解决方法,包括检查插件兼容性、重新安装插件以及更新 Outlook 版本等。通过这些步骤,用户可以有效解决这一问题,恢复 Outlook 的正常运行。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
author-avatar
哭着说再见0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有