Android WiFi的断开分析

1.wifi断开大体流程:

1.wifi断开 wlan-driver最先知道。

2.wlan-driver在与路由器连接的时候(未断开时), 会有周期性的beacon帧来维持连接,AP端一旦遇到突发事情,会立刻通过802.11协议的 deauth 帧/ reject 帧等 通知到 driver。

3. wlan-driver一旦收到802协议的 deauth帧/reject帧等后,马上断开与AP的连接。

4. 紧接着,wlan-driver的上层WifiStateMachine内部广播通知系统外部网络环境,系统跟Settings开始同步处理此次的断开。

2.wifi断开原因

3.wifi断开流程

4.代码流程

1. wpa_supplicant 部分

  • wpa_driver_nl80211_drv_init 其核心完成与drv通道绑定(既是与driver建立好暗号信息交流通道),一旦有变化及时通风报信
  • nl80211_init_bss 埋下的是第一步棋,监听解读 bss 802.11 数据帧
  • process_bss_event 专门处理 802.11 数据帧,将之送往到 mlme_event 处理,mlme 完成分拣之后,装往 wpa_supplicant_event 大车上
  • wpa_supplicant_event 大车把每个event送到对应得cmd中心处理站,进行卸货进一步分发处理,处理完成后通过 wpas_notify_state_changed 上报给 wpas_hidl_notify_state_changed 
  • wpas_hidl_notify_state_changed 完成接力赛最后一棒,将事件上报给到 SupplicantStaIfaceHal
  • 这里,断开的所有原因(将在 wpa_supplicant_event 函数里可以找到),结合 driver行为和空中包
external/wpa_supplicant_8/hostapd/src/drivers/driver_nl80211.c
static void * wpa_driver_nl80211_drv_init(void *ctx, const char *ifname,void *global_priv, int hostapd,const u8 *set_addr,
const char *driver_params){
	if (nl80211_init_bss(bss))
		goto failed;
}
static int nl80211_init_bss(struct i802_bss *bss)
{
	... 
	 nl_cb_set(bss->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,process_bss_event, bss);
}

external/wpa_supplicant_8/src/drivers/driver_nl80211_event.c
int process_bss_event(struct nl_msg *msg, void *arg)
{
		switch (gnlh->cmd) {
		case NL80211_CMD_FRAME:
		case NL80211_CMD_FRAME_TX_STATUS:
		mlme_event(bss, gnlh->cmd, tb[NL80211_ATTR_FRAME],
		   tb[NL80211_ATTR_MAC], tb[NL80211_ATTR_TIMED_OUT],
		   tb[NL80211_ATTR_WIPHY_FREQ], tb[NL80211_ATTR_ACK],
		   tb[NL80211_ATTR_COOKIE],
		   tb[NL80211_ATTR_RX_SIGNAL_DBM],
		   tb[NL80211_ATTR_STA_WME]);
	break;
}

external/wpa_supplicant_8/wpa_supplicant/events.c
void wpa_supplicant_event(void *ctx, enum wpa_event_type event,union wpa_event_data *data)
{
	case EVENT_AUTH: 
	case .... 
	...
}

wpa_supplicant_set_state --wpa_supplicant.c
	wpas_notify_state_changed	-- hidi_manager.cpp
		wpas_hidl_notify_state_changed	-- hidl.cpp
		

2.wpa_supplicant --> hidl --> SupplicantStaIfaceHal

  • wpa_supplicant 把接力棒交给了 wpa_supplicant 下面的 hidl.cpp,由他来完成事件的上报以及通知WifiMonitor
  • 仍然是老套路,自从Android的版本升级之后,cpp与java之间的通信也是在不断地变化,从之前的aidl到现在的hidl,总是在变
  • SupplicantStaIfaceHal 收到上报事件之后,通过这一长期合作伙伴WifiMonitor,将消息通知到系统各个模块
external/wpa_supplicant_8/wpa_supplicant/hidl/1.1/hidl.cpp
{
	.... 
	hidl_manager->notifyStateChange(wpa_s);
}

external/wpa_supplicant_8/wpa_supplicant/hidl/1.0/hidl_manager.cpp
{
	....
	callWithEachStaIfaceCallback(
    wpa_s->ifname, std::bind(
		       &ISupplicantStaIfaceCallback::onStateChanged,
		       std::placeholders::_1,
		       static_cast<ISupplicantStaIfaceCallback::State>(
			   wpa_s->wpa_state),
		       bssid, hidl_network_id, hidl_ssid));
}

frameworks/opt/net/wifi/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java
	 public void onStateChanged(int newState, byte[/* 6 */] bssid, int id,ArrayList<Byte> ssid) {
 		mWifiMonitor.broadcastSupplicantStateChangeEvent( mIfaceName, 
 			getCurrentNetworkId(mIfaceName), wifiSsid, bssidStr, 		newSupplicantState);
 }

3.WifiMonitor --> WifiStateMachine --> 广播通知系统

  • WifiMonitor 传输 SUPPLICANT_STATE_CHANGE_EVENT cmd 给到 WifiStateMachine
  • WifiStateMachine 是 cmd 核心处理枢纽,每个 wifi 相关的 cmd 都会送到这里被分发执行
  • 这里重点有DisconnectingState与 ConnectModeState 状态机,将会根据 wpa_supplicant 所处的状态 (disconnect 或者 completed 状态),处理行为不一样
  • 如为 disconnect, 则转到 handleNetworkDisconnect(); 处理;如为 completed,则开启 ip gaining
  • 最后,发送广播 WifiManager.NETWORK_STATE_CHANGED_ACTION , 通知wifi状态变化了,处理同步断开的状态flow
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMonitor.java
public void broadcastSupplicantStateChangeEvent(String iface, int networkId, WifiSsid wifiSsid,....)
{
 		sendMessage(iface, SUPPLICANT_STATE_CHANGE_EVENT, 0, 0,new StateChangeResult(networkId, wifiSsid, bssid, newSupplicantState));
}

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java
class ConnectModeState extends State {
{
     .....  
	 case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT:
	 	SupplicantState state = handleSupplicantStateChange(message);
	 	 if (state == SupplicantState.DISCONNECTED
				   && mNetworkInfo.getState() != NetworkInfo.State.DISCONNECTED) {
			   if (mVerboseLoggingEnabled) {
				   log("Missed CTRL-EVENT-DISCONNECTED, disconnect");
			   }
			   handleNetworkDisconnect();
			   transitionTo(mDisconnectedState);
		   }
		   
		if (state == SupplicantState.COMPLETED) {
	       mIpClient.confirmConfiguration();
	       mWifiScoreReport.noteIpCheck();
	   }
}

 class DisconnectingState extends State {
	   case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT:
	   	handleNetworkDisconnect();
	   	transitionTo(mDisconnectedState);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/189154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Playwright模块进行自动化测试

playwright是由微软开发的Web UI自动化测试工具&#xff0c;支持Node.js、Python、C# 和 Java语言&#xff0c;本文将介绍Python版本的Playwright使用方法。 微软开源了一个非常强大的自动化项目叫playwright-python&#xff0c;项目地址&#xff1a;https://github.com/micros…

【MATLAB源码-第89期】基于matlab的灰狼优化算法(GWO)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种模仿灰狼捕食行为的优化算法。灰狼是群居动物&#xff0c;有着严格的社会等级结构。在灰狼群体中&#xff0c;通常有三个等级&#xff1a;首领&#xff…

解决hbuilder使用android studio模拟器不能热更新

hbuilder使用android studio模拟器编&#xff0c;在编写代码时&#xff0c;不能热更新&#xff0c;总是需要重启虚拟机中的程序&#xff0c;hbuilderx的版本是3.1.22&#xff0c;android studio的版本是4.2.2 同时在hbuilderx中出现如下报错信息&#xff1a; 报错信息&#x…

求两对整点坐标连线之间是否存在其他的整点坐标。

证明过程非常的简单&#xff1a; 有两对整点&#xff08;x1&#xff0c;y1&#xff09;&#xff08;x2,y2)&#xff0c;我们现在以(x1&#xff0c;y1)为原点&#xff0c;那么&#xff08;x2&#xff0c;y2)的相对坐标就是&#xff08;x2-x1&#xff0c;y2-y1&#xff09; 设 …

ENVI中给影像添加坐标系

目录 待匹配影像坐标系信息参考影像坐标信息通过参考影像匹配坐标系 当我们在ENVi中打开影像发现缺失坐标系的时候&#xff0c;可以非常方便地通过参考影像来对其进行坐标系的匹配。 待匹配影像坐标系信息 首先我们双击想要加坐标系的影像查看Metedata&#xff0c;发现此时影像…

Kubernetes 秘密暴露使大型区块链公司面临风险

领先的网络安全专家对公开的 Kubernetes 配置表示担忧&#xff0c;这可能会威胁许多组织供应链的安全。 受影响的公司包括两家主要的区块链公司&#xff08;出于安全原因&#xff0c;其名称已被隐去&#xff09;以及其他多家财富 500 强公司。 Aqua Security 研究人员报告称&…

Redis实战篇(一)短信登录

Redis实战篇&#xff08;一&#xff09;短信登录 1.1、导入黑马点评项目 1.1.1 、导入SQL 1.1.2、有关当前模型 手机或者app端发起请求&#xff0c;请求我们的nginx服务器&#xff0c;nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&a…

leetcode设计循环队列(链表方式来实现)

上次我们那个设计循环队列的时候用的是数组&#xff0c;因为那个时候还是不太会链表&#xff0c;现在有了链表的思路&#xff0c;我们一起来看看解题步骤吧。 https://leetcode.cn/problems/design-circular-queue/description/ 设计循环队列 那我们其实最主要的就是我们这个…

算法-技巧-中等-颜色分类

记录一下算法题的学习12 颜色分类 题目&#xff1a;给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝…

CleanMyMac X4.14.5Crack最新Mac电脑清理优化最佳应用

CleanMyMac X 4.14.5是用于清理和优化Mac的最佳应用程序和强大工具。它看起来很棒而且很容易理解。该软件可以清理、保护、优化、稳定和维护您的 Mac 系统。您可以立即删除不必要的、不寻常的、无用的垃圾文件、损坏的文件垃圾&#xff0c;并释放大量内存空间。此外&#xff0c…

微信小程序文件预览和下载-文件系统

文件预览和下载 在下载之前&#xff0c;我们得先调用接口获取文件下载的url 然后通过wx.downloadFile将下载文件资源到本地 wx.downloadFile({url: res.data.url,success: function (res) {console.log(数据,res);} })tempFilePath就是临时临时文件路径。 通过wx.openDocume…

Elasticsearch:ES|QL 查询中的元数据字段及多值字段

在今天的文章里&#xff0c;我来介绍一下 ES|QL 里的元数据字段以及多值字段。我们可以利用这些元数据字段以及多值字段来针对我们的查询进行定制。 ES|QL 源数据字段 ES|QL 可以访问元数据字段。 目前支持的有&#xff1a; _index&#xff1a;文档所属的索引名称。 该字段的…

Linux进程管理,用户管理,文件压缩命令

gcc与g区别(补充了解): 比如有两个文件:main.c,mainc.cpp(分别用C语言和C语言写的)如果要用gcc编译呢? gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc 指明用c的标准库; 区别一: gcc默认只链接C库,并不会链接C的库;g会默认链接c标准库. 区别二: gcc编译.c文件,则按照C语…

EMQX-5.3.1单机集群部署并基于Nginx实现负载均衡

本例单机集群部署使用三个节点&#xff0c;分别为node1、node2、node3 一、安装与配置 1 创建数据目录 mkdir -p node1/data node1/logs mkdir -p node2/data node2/logs mkdir -p mode3/data node3/logs 2 数据目录授权 chown 1000 node1/ node2/ node3/ chown 1000 n…

扫描条形码到电脑:Barcode to pc 4.6.3 Crack

像专业人士一样使用条形码将条形码发送到 PC 排名第一的智能手机扫描应用程序 将条形码即时发送到计算机程序并自动执行任务的最简单方法 受到全球 500,000 多名用户的信赖 条形码到 PC&#xff1a;Wi-Fi 扫描仪应用程序&#xff0c;条码到 PC&#xff1a;适用于 Android 和 i…

车载通信架构 —— 传统车内通信网络LIN总线(低成本覆盖低速场景)

车载通信架构 —— 传统车内通信网络LIN总线(低成本覆盖低速场景) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是…

C++类与对象(中)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX&#x1f43c;个人WeChat&#xff1a;ILXOXVJE&#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&am…

数据库表结构导出成Excel或Word格式

前言 该工具主要用于导出excel、word&#xff0c;方便快速编写《数据库设计文档》&#xff0c;同时可以快速查看表的结构和相关信息。 本博客仅作记录&#xff0c;最新源码已经支持多种数据库多种格式导出&#xff0c;有兴趣的可移步源码作者地址&#xff1a;https://gitee.co…

【代码】基于VMD(变分模态分解)-SSA(麻雀搜索算法优化)-LSTM的光伏功率预测模型(完美复现)matlab代码

程序名称&#xff1a;基于VMD&#xff08;变分模态分解&#xff09;-SSA&#xff08;麻雀搜索算法优化&#xff09;-LSTM的光伏功率预测模型 实现平台&#xff1a;matlab 代码简介&#xff1a;提出了变分模态分解(VMD)和麻雀搜索算法(SSA)与长短期记忆神经网络 (LSTM)相耦合,…

《尚品甄选》:后台系统——权限管理之角色管理(debug一遍)

文章目录 一、权限管理介绍二、表结构的设计三、查询角色四、添加角色五、修改角色六、删除角色 一、权限管理介绍 在后台管理系统中&#xff0c;权限管理是指为了保证系统操作的安全性和可控性&#xff0c;对用户的操作权限进行限制和管理。简单的来说就是某一个用户可以使用…