Android的WiFi子系统架构

X-MOVE4.0 Android子系统:低成本体感交互技术解析 体感交互技术通过传感器捕捉用户动作实现自然的人机交互,其核心在于实时处理加速度计、陀螺仪等IMU数据。X-MOVE4.0 Android子系统创新性地利用普通手机作为传感器节点,通过蓝牙/WIFI双模通信构建低成本解决方案。该系统采用三层滤波架构(硬件级采样、改进型卡尔曼滤波、动态窗口均值滤波)有效抑制传感器噪声,实测将陀螺仪漂移降低至0.3°/s。在通信协议设计上,针对Android平台特性混合使用RFCOMM模拟串口和自定义UDP协议,兼顾兼容性与实时性。典型应用场景包括体感游戏控制、空中手势识别等,特 阅读详情

转自http://www.360doc.com/content/11/1017/11/474846_156830970.shtml

本文部分内容修正自《Androd系统原理及开发要点详解》,部分内容为原创!

 

前言:

最近项目中要实现几个与WiFi相关的机能:WPS,WiFI proxy,Airplane Mode相关的小机能等。我借着这次机会,对Android的WiFi框架进行了一下学习,对其有一个初步的了解。所以特地整理了出来,以备与各位探讨,并欢迎指教。

 

一、WiFi基本框架

Android的WiFi系统自上而下包括如下一些内容:

             

 

WiFi部分在Android系统中作为网络部分使用的方法和通常的网络相同。唯一特殊的部分是在Settings程序中的WiFi相关设置内容,它们调用了WiFi提供了WiFi架构提供的Java层接口。

 

add tip:

JAVA应用层 Setting、WifiSwitcher等应用 
上下的通讯为Binder机制 

JAVA框架层 
Wifi manager 
Wifi service 

上下通讯为JNI 

C/C++ 框架层 
Wifi的JNI 
WPA适配层 
Wpa_supplicant程序 

内核空间 Wifi的内核驱动程序

 

 

二、WiFi本地实现

Android的WiFi本地部分实现主要包括wpa_spplicant以及wpa_supplicant适配层。

 

WPA是WiFi Protected Access的缩写,中文含义为“WiFi网络安全存取”。WPA是一种基于标准的可互操作的WLAN安全性增强解决方案,可大大增强现有以及未来无线局域网络的数据保护和访问控制水平。

 

1、  wpa_supplicant

wpa_supplicant是一个开源项目,已经被移植到Linux,Windows以及很多嵌入式系统上。它是WPA的应用层认证客户端,负责完成认证相关的登录、加密等工作。wpa_supplicant的源代码目录为:

./external/wpa_supplicant/

./external/wpa_supplicant_6/

 

这个工程中的内容编译后主要结果是生成动态库libwpa_client.so和可执行程序wpa_supplicant。

wpa_supplicant是一个独立运行的守护进程,其核心是一个消息循环,在消息循环中处理WPA状态机、控制命令、驱动事件、配置信息等。wpa_supplicant有很多控制接口,也提供命令行和通行界面的控制模式:而Android与wpa_supplicant的通信通过Socket完成。

关于wpa_supplicant更多的信息,请参考: http://w1.fi/wpa_supplicant/

libwpa_client.so是一个给客户单链接和调用的库,用于和wpa_supplicant守护进程进行通信。

 

2、  wpa_supplicant适配层

wpa_supplicant适配层是通用的wpa_supplicant的封装,在Android中作为WiFi部分的硬件抽象层来使用。wpa_supplicant适配层主要用于与wpa_supplicant守护进程的通信,以提供给Android框架使用,它实现了加载、控制和消息监控等功能。

wpa_supplicant适配层的源代码路径是:

./hardware/libhardware_legacy/include/hardware_legacy/wifi.h

./hardware/libhardware_legacy/wifi/

 

wpa_supplicant适配层是libhardware_legacy.so的一部分,它需要包含wpa_supplicant的头文件wpa_ctrl.h,动态链接库libwpa_client.so。通过wifi.h文件为上一层提供程序调用接口(实际上就是WiFi的JNI部分)。

wpa_supplicant适配层的构成非常的简单,除了一些加载和连接的接口,它最重要的部分是以下两个接口:

int wifi_command(const char *command, char *reply, size_t *reply_len);

int wifi_wait_for_event(char *buf, size_t len);

wifi_command()提供讲明亮发送到WiFi系统下层的功能,wifi_wait_for_event()负责事件进入的通道,这个函数将被阻塞,直到收到一个WiFi事件,并以字符串的形式返回。

 

在wifi.c的实现中:

1)、wifi_command()是wifi_send_command()的封装, wifi_send_command()通过wpa_ctrl_request()直接命令转发给wpa_supplicant进程,并返回结果。

2)、wifi_wait_for_event()仅仅调用wpa_ctrl_recv()来接受上一次wpa_supplicant上报的事件,如果没有事件则阻塞于此,上层会通过循环由此来读取每一个上报的事件。

 

本层还提供一些一些与DHCP(动态主机分配协议)相关的操作。

 

三、WiFi的JNI层

Android中的WiFi系统的JNI部分实现的源码文件为:

./frameworks/base/core/jni/android_net_wifi_Wifi.cpp

这里实现的本地函数,都是通过调用wpa_supplicant适配层的接口来实现的(包含适配层的头文件wifi.h)。

 

JNI层的接口注册到Java层的源代码文件为:

./frameworks/base/wifi/java/android/net/wifi/WifiNative.java

WifiNative将为WifiService、WifiStateTracker、WifiMonitor等几个WiFi框架内部组件提供底层操作支持。

 

四、WiFi的Java FrameWork层

WiFi系统的Java部分代码实现的目录为:

./frameworks/base/wifi/java/android/net/wifi/          // WiFi服务层的内容

./ frameworks/base/services/java/com/android/server/   // WiFi部分的接口

 

WiFi系统Java层的核心是根据IWifiManger接口所创建的Binder服务器端和客户端,服务器端是WifiService,客户端是WifiManger。

IWifiManger.aidl编译后生成了IWifiManger.java,并生成IWifiManger.Stub(服务器端抽象类)和IWifiManger.Stub.Proxy(客户端代理实现类)。WifiService通过继承IWifiManger.Stub实现,而客户端通过getService()函数获取IWifiManger.Stub.Proxy(即Service的代理类),将其作为参数传递给WifiManger,供其与WifiService通信时使用。

          

 

1.    WiFiManger是WiFi部分与外界的接口,用户通过它来访问WiFi的核心功能。WifiWatchdogService这一系统组件也是用WifiManger来执行一些具体操作。

2.    WifiService是服务器端的实现,作为WiFi部分的核心,处理实际的驱动加载、扫描、链接、断开等命令,已经底层上报的事件。对于主动的命令控制,WiFi是一个简单的封装,针对来自客户端的控制命令,调用相应的WifiNative底层实现。

一般接收到客户端的命令后,将其转换成对应的自身消息塞入消息队列中,以便客户端的调用可以及时返回,然后在WifiHandler的handleMessage()中处理对应的消息。而底层上报的事件,WifiService则通过启动WifiStateTracker来负责处理。

1)  WifiStateTracker除了负责WiFi的电源管理模式等功能外,其核心是WifiMonitor所实现的事件轮询机制,以及消息处理函数handleMessage()。

2)  WifiMonitor通过开启一个MonitorThread来实现事件的轮询,轮询的关键函数是前面提到的 阻塞式函数WifiNative.waitForEvent()。获取事件后,WifiMonitor通过一系列的Handler通知给WifiStateTracker。这里WifiMonitor的通知机制是将底层事件转换成WifiStateTracker所能识别的消息,塞入WifiStateTracker的消息循环中,最终在handleMessage()中由WifiStateTracker完成对应的处理。

注:WifiStateTracker同样是WiFi部分与外界的接口,它不像WifiManger那样直接被实例化来操作,而是通过Intent机制来发消息通知给客户端注册的BroadcastReceiver,以完成和客户端的接口。

3.    WifiWatchdogService是ConnectivityService所启动的服务,但它并不是通过Binder来实现的服务。它的作用是监控同一个网络内的接入点(Access Point),如果当前接入点的DNS无法ping通,就自动切换到下一个接入点。WifiWatchdogService通过WifiManger和WifiStateTracker辅助完成具体的控制动作。WifiWatchdogService初始化时,通过registerForWifiBroadcasts注册获取网络变化的BroadcastReceiver,也就是捕获WifiStateTracker所发出的通知消息,并开启一个WifiWatchdogThread线程来处理获取的消息。通过更改Setting.Secure.WIFI_WARCHDOG_ON的配置,可以开启和关闭WifiWatchdogService。

 

五、Setting中的WiFi设置

Android的Settings应用程序对WIFI的使用,是典型的WiFi应用方式,也是用户可见的Android WiFi管理程序。这部分源代码的目录为:

. /packages/apps/Settings/src/com/android/settings/wifi/

 

Setting里的WiFi部分是用户可见的设置界面,提供WiFi开关、扫描AP、链接/断开的基本功能。另外i,通过实现WifiLayer.Callback接口提供了一组回调函数,用以相应用户关心的WiFi状态的变化。

WifiEnabler和WifiLayer都是WifiSettings的组成部分,同样通过WifiManger来完成实际的功能,也同样注册一个BroadcastReceiver来响应WifiStateTracker所发出的通知消息。WifiEnabler其实是一个比较简单的类,提供开启和关闭WiFi的功能,设置里面的外层WiFi开关菜单,就是直接通过它来做到的;而WifiLayer则提供更复杂的一些WiFi功能,如AP选择等以供用户自定义。

Android框架WiFi架构 动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_spplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调试来对wifi芯片操作,简单的说,二、android wifi 系统架构:andtoid wifi 系统引入了wpa_supplicant,它的整个wifi系统。 阅读详情

相关推荐

Android Wi-Fi 核心架构

Wi-Fi框架层(Wi-Fi Framework):包括Wi-Fi管理器(WifiManager)和Wi-Fi配置(WifiConfigStore)等组件,提供了对Wi-Fi连接的管理和配置能力。Wi-Fi Service(WifiService):作为Android系统中的核心服务之一,负责管理设备的Wi-Fi连接和配置,处理与Wi-Fi相关的各种操作。Wi-Fi扫描器(WifiScanner):负责执行Wi-Fi网络的扫描操作,获取周围可用的Wi-Fi网络列表。Android Wi-Fi 核心架构。

HackSquad的博客 630

Android WIFI架构

App 与 system_server 通过Binder通信,但Binder本身只实现了IPC,即类似socket通信的能力。从功能上来说,WifiNative是system_server 和 wpa_supplicant 对话的窗口,实际上主要依靠wpa_supplicant项目编译出来的动态库libwpa_client.so。当WIFI处在AP模式。如果说Binder是连接 App 和 system_server 的桥梁,那么WifiManager和WiFiService就是桥梁的两头。

weixin_45030234的博客 2557

android wifi的整体架构以及架构下的模块细分

本文主要介绍wifi的整体架构,我们在学习一个模块时,不能一开始就去坑代码,要先从整体的看待这个模块,不然我们两眼一抹黑,就进入到代码的时间的时候,发现这里不懂哪里不懂,只有先了解事务的一个宏观情况,然后再到代码里面去深挖才能慢慢对该问题真正掌握。

changcheng00的博客 2618

buildroot 中设置 package中 makefile的编译开关项 libwpa_client.so

最近在编译配网相关东西,需要用到libwpa_client.so,但是在我的buildroot中,却编译不出这个库。在网上也没找到类似的解决办法,最后通过查看makefile发现是没有打开编译开关,导致的这个问题,现将问题总结出来,供大家参考: makefile 中需要有这个define 才可以编译出来: CONFIG_BUILD_WPA_CLIENT_SO 所以我选择的是在 buildroot/package/wpa_supplicant/wpa_supplicant.mk 这个文件中加上这个开关的 de

linan101的博客 1923

Android wifi子系统架构分析

android wifi子系统框架分析

xierong1的博客 392

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 547

wifi android 子系统架构

WiFi子系统架构   2011-06-01 17:22:02|  分类: 默认分类 |字号 订阅 Android的WiFi本地部分实现主要包括wpa_spplicant以及wpa_supplicant适配层。 wpa_supplicant是一个开源项目,已经被移植到Linux,Windows以及很多嵌入式系统上。它是WPA的应用层认证客户端,负责完成认证相关的登录

SongCdut的专栏 1174

PTA 编程题(C语言)-- 然后是几点

PTA 编程题(C语言)-- 然后是几点

LCCprogrammer 5074

android wifi子系统

orgin link is as the below: http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23602891&id=3333288 --------------------------------------------------------------------------------------

yipie的专栏 2135

多标签分类怎么做?(Python)

首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类

y1282037271的博客 1359

请尽可能地详细说明一个VLA项目的立项训练到落地的全流程

一个机器人VLA项目的全流程是一个复杂的系统工程,它深度融合了机器人学 (Robotics)计算机视觉 (CV)和自然语言处理 (NLP)。其核心挑战在于高质量数据的获取和从仿真到现实的有效迁移。与纯粹的软件AI项目相比,它增加了硬件、物理交互和安全性的维度,但其最终能让AI走出虚拟世界、在物理世界中产生实际价值,这也是其巨大的魅力所在。

具身机器人和通用AI 303

调试WIFI时的一些札记

orgin link is as the below: http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23602891&id=3333288 ------------------------------------------------------------------------------------------

2586

58.Sobel边缘检测算子

注:在梯度运算中,很可能会出现负的灰度值,我们不能再采用uint8类型作为像素的数据类型,而是采用了CV_16S或者CV_32F这种有负数范围的类型,运算结果里的负数也不能不处理,否则在显示的时候就会被截断为0,这样就会丢失边界信息。如下图所示,对中心像素Z5求取多个方向的灰度差分,对于Z5的8邻域,分为4个方向,即对角线和水平垂直4个方向对:(z1, z9) ,(z2, z8), (z3, z7), (z6, z4) 给定邻域方向梯度矢量g的幅度为:|g| = <像素灰度差分>/<相邻像素的距离>。

twnkie的博客 4884

Android Wifi子系统源代码View

本文基于Android 4.2.2+Linux 3.6.9+SAMA5D3 SoC从源代码的角度审视Android Wifi子系统。 软件平台:Linux3.6.9 + Android 4.2.2 硬件平台:Atmel SAMA5 Wifi模组:RTL8723AU(USB接口)   Android的WiFi子系统自上而下包括如下一些内容:

4912

倍福CX9020(WINCE 7)控制器使用方法和操作

CX9020系列是倍福控制器中较为经济的,操作系统为Windows Embedded Compact 7(简称WINCE7或WINEC7),相对高端控制器(WINES7以上系统),操作系统古老而简洁,上位机软件的编写困难很多,本文是笔者在使用过程中摸索的流程,旨在为CX9020系列的新用户提供参考,也可供其他CE系统的控制器参考。本文中大部分截图采用倍福中国的培训文档,这是由于笔者是在流程走通后再写这篇文章,不想再恢复出厂设置走一遍截图。因笔者在写这篇文章时使用倍福控制器经验并不丰富,难免有纰漏,请读者批评

weixin_41883890的博客 4287

淋巴结病理数字玻片读取与处理代码

Whole-slide images are generally stored in a multi-resolution pyramid structure. 首先安装openslide模块 pip install openslide-python import os.path as osp import openslide from pathlib import Path...

猫头军师兵书 1276

X-MOVE4.0 Android子系统:体感交互与多模通信技术解析

体感交互技术通过整合智能手机内置传感器(如加速度计、陀螺仪)实现自然的人机交互,其核心在于多源传感器数据融合与实时通信。X-MOVE4.0 Android子系统采用卡尔曼滤波算法处理传感器数据,误差控制在0.5度以内,满足高精度应用需求。系统支持蓝牙4.0和WIFI双通道通信,蓝牙延迟低至15-30ms适合实时控制,WIFI则适用于大数据量传输。这种模块化设计可灵活应用于体感游戏控制、智能家居等场景,特别是通过UDP协议优化和补偿算法提升了网络传输稳定性。该技术为移动互联网时代的交互方式提供了创新解决方案。

weixin_42526417的博客 239

IEC 60747-8 是由国际电工委员会(IEC)制定的标准,标题为《半导体器件 - 分立器件 - 第8部分:场效应晶体管》

IEC 60747-8 是由国际电工委员会(IEC)制定的标准,标题为《半导体器件 - 分立器件 - 第8部分:场效应晶体管》(Semiconductor devices - Discrete devices - Part 8: Field-effect transistors)。该标准详细规定了场效应晶体管(FETs)的测试方法,涵盖静态和动态特性测试,适用于多种类型的FET,包括结型场效应晶体管(JFETs)、绝缘栅场效应晶体管(MOSFETs,增强型和耗尽型)等。3. 标准其他部分(简要概述)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 572
上一篇: Android按键事件处理分析 .
下一篇: wifi详解(一)
yongheng_123
博客等级 码龄18年 23粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值