热门标签 | 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上层并显示出来的。

 


推荐阅读
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
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社区 版权所有