3系统启动后的 wifi 加载过程

Linux 添加启动服务--Service 1.1 新建.service文件 /etc/systemd/system/wificonnect.service。1.2 新建.sh文件 /home/username/wifiset.sh。本目录所有.sh文件会初当作对应service服务在Linux系统启动后直接运行。Service 服务的实际作用是开启后自动启动服务,运行一些不须要登录的程序,任务。2、目录 /etc/init.d/ 里的用户.sh文件。broadcastip.sh 脚本。1,服务配置service文件。ledrun.sh 脚本。 阅读详情

============================ Wifi 启动代码流程 ====================


1、系统启动 首先加载init.rc,这个文件 会加载所有service,init是linux启动的 第一个 用户空间 的应用(属于linux进程,不属于Android应用)。

2、init.rc里有以下这句话:

Service wpa_supplicant /system/bin/wpa_supplicant –Dwext –iwlan0 –d –c /data/misc/wifi/wpa_supplicant.conf

3、加载linux内核模块/system/lib/modules/wlan.ko 这个wifi模块定义在/hardware/libhardware_legacy/wifi/wifi.c

4、在 SystemServer 启动的时候, 会生成一个 ConnectivityService 的实例 ,
ConnectivityService 的 构造函数 会创建 WifiService,

看看是怎么启动WiFi Service的:
if (DBG) Log.v(TAG, "Starting Wifi Service.");
mWifiStateTracker = new WifiStateTracker(context, handler);
WifiService wifiService = new WifiService(context, mWifiStateTracker);
ServiceManager.addService(Context.WIFI_SERVICE, wifiService);

WifiStateTracker 会创建 WifiMonitor  接收 来自 底层 的事件, WifiService 和 WifiMonitor 是整个模块的核心 。WifiService 负责 启动关闭 wpa_supplicant、启动关闭 WifiMonitor监视线程 和把 命令下发 给 wpa_supplicant,  而WifiMonitor 则负责从 wpa_supplicant  接收 事件通知。它们与本地库的连接都是通过JNI方法,具体实现方法在android_net_wifi_Wifi.cpp中,在这个文件中可以大致看出APP会给wpa_supplicant下哪些命令。这些命令通过wifi.c的wifi_command发送给wpa_supplicant,在发送命令的过程中实际是调用wpa_ctrl_request来完成命令发送的,wpa_ctrl_request是通过socket的方式与wpa_supplicant进行通信的,然后通过wpa_ctrl_recv来接收来自wpa_supplicant的命令,并返回标识给wifi_wait_for_event。

--------------------------------------

流程图对应的源代码路径为:

 WifiEnabler,WifiSettings对应的路径如下:

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

 

WifiManager,WifiMonitor,WifiStateTracker,WifiNative.对应的源代码路径如下:

rootfs/frameworrks/base/wifi/java/android/net/wifi/

 

WifiService 对应代码的位置

rootfs/frameworks/base/services/java/com/android/server/

 

android_net_wifi_Wifi源代码路径如下:

rootfs/frameworks/base/core/jni/

 

wifi_command,wifi_wait_for_envent源代码路径如下:

/hardware/libhardware_legacy/wifi/wifi.c

 

wpa_ctrl_源代码路径如下:

rootfs/external/wpa_supplicant/wpa_ctrl.c

 

wpa_supplicant源代码路径如下:

rootfs/external/wpa_supplicant/


WIFI启动流程图:


一、 使能 WIFI
Wireless Settings 在初始化的时候配置了由 WifiEnabler 来处理 Wifi 按钮, 当用户按下 Wifi 按钮后, Android 会调用 WifiEnabler 的 onPreferenceChange, 再由 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 中的 监视线程。


代码如下:
WifiService.java (frameworks/base/services/java/com/android/server)调用 setWifiEnabled()里面的sendEnableMessage(enable, true, Binder.getCallingUid());来发送一则消息

Message msg = Message.obtain(mWifiHandler, (enable? MESSAGE_ENABLE_WIFI : MESSAGE_DISABLE_WIFI),(persist ? 1 : 0), uid);

msg.sendToTarget();发送给自身的消息。

当enable 的时候 会调用setWifiEnabledBlocking这个函数,这个函数会做setWifiEnabledState ,然后做四件事:

           1. 调用JNI的WifiNative.loadDriver  -->加载 Wifi驱动

           2. 调用JNI的WifiNative.startSupplicant  -->启动wifi_start_supplicant

   3. 启动 event loop.

   4. 更新wifi的状态

成功启动wifi之后 setWifiEnabledBlocking 运行mWifiStateTracker.startEventLoop();事件循环,来监视事件mWifiMonitor.startMonitoring();   MonitorThread().start() 一直在线程里循环调用WifiNative.waitForEvent();


当 使能 成功后, 会广播发送 WIFI_STATE_CHANGED_ACTION 这个 Intent 通知外界 WIFI已 经 成功能了。WifiEnabler创 建 的 时 候 就 会 向 Android 注册 接收WIFI_STATE_CHANGED_ACTION, 因此它会收到该 Intent, 从而开始扫描。


二、 查找 AP
扫描的入口函数
是 WifiService 的 startScan, 它其实也就是 往 wpa_supplicant 发送 SCAN 命令。
当 wpa_supplicant 处理完 SCAN 命令后, 它会向 控制通道 发送 事件 通知 扫描完成, 从而 wifi_wait_for_event函数会接收到该事件, 由此 WifiMonitor 中的 MonitorThread 会被执行来 处理 这个事件。对每一个扫描返回的 AP, WifiLayer 会调用 WifiSettings 的 onAccessPointSetChanged 函数, 从而最终把该 AP 加到 GUI 显示列表中。


         三、配置 AP 参数
当用户在 WifiSettings 界面上选择了一个 AP 后,会显示配置 AP 参数的一个对话框,此对话框会显示当前选择的AP信号强度,若此AP设置了密码则需要用户输入密码才能登录。用户配置好之后,点击 连接按钮,onClick函数会被调用。


        四、连接
当用户在 AcessPointDialog 中 选择好 加密方式 和 输入密钥 之后,再点击 连接按钮, Android就会去连接这个 AP。
WifiLayer 会先检测这个 AP 是不是之前被配置过, 这个是通过 向 wpa_supplicant 发送 LIST_NETWORK 命令 并且比较 返回值 来实现的,
// Need WifiConfiguration for the AP
WifiConfiguration config = findConfiguredNetwork(state);
如果 wpa_supplicant 没有这个 AP 的配置信息, 则会向 wpa_supplicant 发送 ADD_NETWORK  命令来添加该 AP,
if (config == null) 
{
// Connecting for the first time, need to create it
config = addConfiguration(state, ADD_CONFIGURATION_ENABLE|ADD_CONFIGURATION_SAVE);
}
ADD_NETWORK 命令 会返回一个 ID , WifiLayer 再用这个返回的 ID 作为 参数 向wpa_supplicant 发送 ENABLE_NETWORK 命令,从而让 wpa_supplicant 去连接该 AP。


        五、配置 IP 地址
当 wpa_supplicant 成功连接上 AP 之后, 它会向 控制通道 发送 事件通知连接上 AP 了,

wifi.c的wifi_wait_for_event函数阻塞调用,从而 wifi_wait_for_event 函数会 接收 到该事件,由此 WifiMonitor 中的 MonitorThread 会被执行来 处理 这个事件, WifiMonitor 再调用 WifiStateTracker 的 notifyStateChange, WifiStateTracker 则接着会往自身发送 EVENT_DHCP_START 消息 来 启动 DHCP 去获取 IP 地址, 然后再广播发送NETWORK_STATE_CHANGED_ACTION 这个 Intent, 最后由 WifiSettings类来响应,改变状态和界面信息。


注意:wpa_ctrl_request,通过socket方式向wpa_supplicant发送命令,以select模式阻塞在wpa_supplicant发送和接收。



sdio wifi驱动的加载流程 1、为何/sys中driver的uevent文件只写? 该文件用于调试udev或者人为引起uevent的发送,执行类似: $ echo add > /sys/…/driver/…/uevent 命令时,会模拟一个uevent(ADD)事件,在kernel中,该文件的属性设置为只写。 小结: bus、driver的uevent文件只写 device(包括bus设备)的uevent文件可读 阅读详情

相关推荐

Android 14.0 wifi配置信息存储的位置,wifi配置文件xml的加载流程,以及初次上电没有xml该如何处理

本篇文章主要讲解,wifi 配置信息存储的位置,以及加载的时机,包括以下几部分: 1、wifi配置信息在android14 上存储的位置。 2、wifi 配置信息xml什么时机加载到内存当中的(从Zygote开始),以及首次上电的情况。 3、代码分析,弄明白其中的函数调用关系。 4、简单画了函数之间的调用关系。

qq_15125719的博客 3988

wpa_supplicant 启动过程(android P/9.0)

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java setWifiEnabled() WifiController.sendMessage(CMD_WIFI_TOGGLED) frameworks/opt/net/wifi/service/java/com/android/serv...

kv110的专栏 1966

M1/M2 Mac用户看过来:不装VirtualBox,用PD虚拟机也能跑ENSP的保姆级教程

本文为M1/M2 Mac用户提供了一份不依赖VirtualBox,使用Parallels Desktop虚拟机运行ENSP的详细指南。通过ARM架构的Win10镜像选择、组件替代方案和网络配置优化,实现ENSP核心功能的高效运行,特别适合网络工程师在苹果芯片设备上进行网络模拟。

weixin_28683065的博客 411

1wifi 简介(框架)2系统启动后的 wifi加载 过程-图解 3系统启动后的 wifi 加载过程

http://blog.csdn.net/wh_19910525/article/details/7384480 一、wifi 组建原理:         WIFI就是一种无线联网的技术,以前通过网线连接电脑,而现在则是通过无线电波来连网;常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围都可以采用WIFI连接方式进行联网,如果无线路由器连接了一条ADSL线路或者别

Gabby 2044

【BAAS】基于supabase的知识库详细设计

为满足快速开发需要和减少开发及维护成本,使用BAAS(Backend-as-a-Service)模式可以很好的降低我们的后端维护成本,并提高前端对接效率。一般来说,BAAS是一种云服务模式,BaaS供应商会为提供一些通用的能力,例如用户身份验证、数据库管理、远程更新和推送通知(针对移动应用程序),以及云存储和自托管。BaaS最主流的是Google的firebase,具有相当完善的功能和集成方案,但他是收费的,而且在我们实际项目中,可能需要私有化部署,这时就需要一些开源的替代方案,例如主流的。

Ric的博客 1780

Fluent动网格实战:5种区域运动类型详解与配置避坑指南

本文详细解析了Fluent动网格技术中的五种区域运动类型,包括固定、刚体、变形、用户自定义和系统耦合,并提供了配置技巧与避坑指南。通过实际案例和参数优化建议,帮助工程师有效解决网格变形、计算稳定性等常见问题,提升CFD仿真效率。

weixin_28339967的博客 412

android wifi驱动加载流程

本文基于android 7.0 海思 Hi3798MV200 平台 WiFi驱动加载流程: 一、.进入高级设置,无线设置界面(WifiSettings.java)打开WiFi开关(SwitchBar),触发WifiEnabler.java中的onSwitchChanged回调。通过WifiManager.setWifiEnabled(true)打开WiFi。 二、然后通过WiFi状态机WifiStateMachine中的初始化状机(InitialState)态回调来加载驱动 三、调用Nat.

HuanWen_Cheng的博客 8687

通俗傻瓜式理清光栅化渲染和光线追踪渲染的原理

用通俗语言傻瓜式的讲清楚光栅渲染和光线追踪渲染的原理,方便没有相关理论基础的朋友理解入门。

qq_37366618的博客 2万+

android wifi 流程图_android系统启动后的 wifi 加载过程代码分析

http://blog.csdn.net/wh_19910525/article/details/73901892012=== Wifi 启动代码流程 ====================1、系统启动 首先加载init.rc,这个文件会加载所有service,init是Linux启动的 第一个 用户空间 的应用(属于linux进程,不属于Android应用)。2、init.rc里有以下这句话...

weixin_34759490的博客 835

光电转换器件PMT,APD总结

PMT和APD都属于单点探测器,只能探测光子信息,可以通过扫描方式测光谱。 1. PMT PMT:光电倍增管,是光子技术器件中的一个重要产品,它是一种具有极高灵敏度和超快时间响应的光探测器件。 原理:光电倍增管是一种真空器件。它由光电发射阴极(光阴极)和聚焦电极、电子倍增极及电子收集极(阳极)等组成。当光照射到光阴极时,光阴极向真空中激发出光电子。这些光电子按聚焦极电场进入倍增系统,并通过进一步的二次发射得到的倍增放大。然后把放大后的电子用阳极收集作为信号输出。 优点:因为采用了二次发射倍增系统,.

Ammon_Zhang的博客 1万+

【STM32 CubeMX】I2C中断方式与DMA方式

在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可以采用中断方式或DMA(Direct Memory Access)方式。中断方式通过触发中断来处理数据传输,而DMA方式则利用直接内存访问技术来实现数据传输,减轻了CPU的负担。在选择I2C通信方式时,开发者需要根据具体的应用需求和性能要求来选择合适的方式。STM32 CubeMX提供了图形化配置工具,使得配置I2C通信方式变得更加便捷。

m0_62599305的博客 7744

3系统启动后的 wifi 加载过程- http://blog.csdn.net/wh_19910525/article/details/7390189

============================ Wifi 启动代码流程 ==================== 1、系统启动 首先加载init.rc,这个文件 会加载所有service,init是linux启动的 第一个 用户空间 的应用(属于linux进程,不属于Android应用)。 2、init.rc里有以下这句话: Service wpa_supp

yada____的专栏 596

C#里使用NModbus来创建一个TCP从站服务

摘要:本文介绍了一个用C#实现的Modbus TCP从站服务器,基于.NET Framework 4.6.1开发。代码使用NModbus库创建TcpListener和ModbusSlaveNetwork,支持设置IP地址、端口号和从站ID。服务器实现了数据存储初始化功能(包括线圈和保持寄存器),并提供了启动/停止操作的UI界面和日志记录功能。该解决方案适用于需要调试Modbus TCP协议的场景,特别适合无法升级到更高版本.NET Framework的环境。

大坡3D软件开发 477

RK3399教程:wifi驱动调试技巧

疑问点? Android hal层需要配置那些东西? rk3399的wifi模组自适应支持多款wifi是什么技术原理? wpa_supplicant需要配置那些东西? 回答上面的问题我们需要一步一步往下看。 什么是VID和PID? 答:VID为厂商,PID为产品ID。 硬件接口 单wifi硬件接口 在嵌入式中wifi功能在SOC中有两种方式,一种是集成在SOC当中,芯片代表有MTK和高通的芯片,因为这两家芯片厂商的通讯技术都比较厉害所以一般都会在他们自己的SOC中添加WIFI的模块,从而降低成本和降低板子的

qq_27809619的博客 1万+

YOLO11改进 | 主干网络 | 添加Hyper-YOLO的MANet混合聚合网络

本文详细介绍了在YOLO11目标检测模型中替换C3k2模块为MANet的具体实现方法。文章首先讲解MANet模块的原理,然后分步骤指导如何在YOLO11中添加该模块,包括代码修改、文件配置和模型注册等关键环节。通过实验对比,改进后的YOLO11_MANet模型在保持8.8GFLOPs计算量的同时,参数数量达到3,820,272,网络层数增加到343层。文章还提供了完整的代码实现和网络结构图,并建议结合其他注意力机制或损失函数进一步提升检测效果。最后推荐了相关的深度学习专栏,包含更多YOLO系列改进方法。

kay_545 658

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

android4.0 WIFI的启动流程和状态机变化

android中的wifi自从3.0开始就有了一些变化,一直没有时间做整理,趁着项目不太忙把整理的东西写一下当备份吧。            直接上图            图一是wifistatemachine的状态变化图,记录了从wifiservice创建开始到通过本地库文件wifi.c加载驱动、固件以及启动wpa_supplicant的过程。 图二是系统启动后system_se

zoe的专栏 6937

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

系统启动后的 wifi 加载过程

============================ Wifi 启动代码流程 ==================== 1、系统启动 首先加载init.rc,这个文件 会加载所有service,init是linux启动的 第一个 用户空间 的应用(属于linux进程,不属于Android应用)。 2、init.rc里有以下这句话: Service wpa_supp

haokaihaohe110的专栏 1639

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

使用python3 破解wifi密码 自写程序

运行环境:win10 + python3.7 生成密码的代码如下: ---------------------------------------------------------------------------------------------------------------------------- import itertools as its if __n...

Siebelkang_j的博客 1万+

Wifi Firmware 加载原理分析

https://blog.csdn.net/menuconfig/article/details/7313061 前言 前段时间移植 wifi 驱动到 android 的内核上,发现 firmware 的加载始终出错,问了几个人,都不是很了解,没办法,只好自己研究一下。 原理分析 从本质上来说, firmware 需要做的事情包括两件: 1, 通知用户态程序,我需要下载 firmware 了; ...

hbcbgcx的博客 2755

wifi移植全过程记录【转】

<br />【转】 一篇移植WIFI的步骤文档,具体架构还需要分析把握i~<br /> <br /> <br />手动加载驱动<br />####16th,Jul<br />驱动加载<br />modprobe libertas<br />modprobe libertas_sdio<br />加载第二行时出错拉<br /># modprobe libertas_sdio<br />libertas_sdio: Libertas SDIO driver<br />libertas_sdio: Copyrig

lightsoure的专栏 3903

[RK3288][Android6.0] WiFi的HAL层加载问题

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92背景:几年前做高通平台到现在,我一直认为hardware下面目录都是只跟用哪个vendor相关,比如现在用的是rk,那么就是rockchip目录有用,现在才发现broadcom也会在WiFi中被用到,还好偷懒没把此git从仓库中删除…过程:WiFi开启的时候会调用如下流程来加载HAL WifiN

Kris Fei's blog 5756

Android14 WiFi 架构及开机过程wifi相关的初始化

前面提到, wificond是一个独立的进程,主要负责wifi扫描相关功能,通过标准的 nl80211 命令(基于netlink)与 wifi驱动进行通信。可以看到,启动了五个wifi相关服务,除了上面提到的两个独立进程对应的服务外,其它三个服务wifi、wifip2p、wifiscanner 是运行在SystemServer进程中。实现了 system/connectivity/wificond/aidl/android/net/wifi/nl80211/IWificond.aidl 中声明的接口。

小阿狸的博客 3457

浅谈Android下的Wifi

1. WIFI JAVA layer: 1.1. 当android系统启动WIFI 模块时, 它将调用 Wifiserver 类的setWifiEnabledBlocking函数。 1.2. 在该函数中,如果是使能WIFI, 它将做四件事:     a. load wifi

Android驱动人生 3929
上一篇: android 平台USB wifi驱动移植及使用 SDIOwifi
下一篇: 5wpa_supplicant程序 --详解
seableble
博客等级 码龄7年 136粉丝 700原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值