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.cwpas_notify_state_changed	-- hidi_manager.cppwpas_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.javapublic 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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

功率整流器的作用是什么?SURS8340T3G车规级功率整流器的介绍

汽车级功率整流器是一种用于汽车电子系统的功率电子器件&#xff0c;用于将交流电转换为直流电以供电子设备使用。汽车级功率整流器需要具有高效率、高可靠性、高稳定性和高温度工作能力等特点。其中&#xff0c;SURS8340T3G 是一种常见的汽车级功率整流器。 SURS8340T3G 是一…

JavaScript WebApi(二) 详解

监听事件 介绍 事件监听是一种用于在特定条件下执行代码的编程技术。在Web开发中&#xff0c;事件监听器可以用于捕获和响应用户与页面交互的各种操作&#xff0c;如点击、滚动、输入等。 事件监听的基本原理是&#xff0c;通过在特定元素上注册事件监听器&#xff0c;当事件…

前置任务之安装jdk

已经安装过很多次了&#xff0c;但是每次安装都要搜好几次才能找到正确的&#xff0c;离大谱。 1.打开 oracle官网 https://www.oracle.com 然后切换到Java archive 下载192版本的&#xff0c;页面搜索ctrlF&#xff0c;【Java SE Development Kit】或者【jdk-8u192-windows-…

MyBatis-Plus及多数据源入门教程

开发环境配置 JDK 1.8、Maven 3.8.8、 IDEA CE 2023.2、MySQL 8.0.34 框架介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatis 是一款非常优秀的开源…

QTextEdit多行富文本框控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计21条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

2023年11月27日历史上的今天大事件早读

1852年11月27日 计算机程序创始人阿达-洛芙莱斯去世 1893年11月27日 抗日爱国将领续范亭诞辰 1895年11月27日 《茶花女》作者、法国著名作家小仲马逝世 1899年11月27日 董其武将军诞辰 1902年11月27日 《新小说》创刊 1907年11月27日 割让刚果给比利时的条约签订 1925年1…

Java代码生成器,一键在线生成,支持自定义模板

【Java代码生成神器】自动化生成Java实体类、代码、增删改查功能&#xff01;点击访问 推荐一个自己每天都在用的Java代码生成器&#xff01;这个网站支持在线生成Java代码&#xff0c;包含完整的Controller\Service\Entity\Dao代码&#xff0c;完整的增删改查功能&#xff01…

虾皮买手号怎么弄的

想要拥有虾皮买手号&#xff0c;可以使用shopee买家通系统进行自动化注册&#xff0c;这款软件目前支持菲律宾、泰国、马来西亚、越南、巴西、印度尼西亚等国家使用。 软件注册流程简单方便&#xff0c;首先我们需要先准备好手机号&#xff0c;因为现在注册虾皮买家号基本上都是…

学习.NET验证模块FluentValidation的基本用法(续3:ASP.NET Core中的调用方式)

FluentValidation模块支持在ASP.NET Core项目中进行手工或自动验证&#xff0c;主要验证方式包括以下三种&#xff1a;   1&#xff09;手工注册验证类&#xff0c;并在控制器或其它模块中调用验证&#xff1b;   2&#xff09;基于ASP.NET验证管道&#xff08;validation …

COMP2121 Discrete Mathematics

COMP2121 Discrete Mathematics 需要可WeChat: zh6-86

Java 注解在 Android 中的使用场景

Java 元注解有 5 种&#xff0c;常用的是 Target 和 Retention 两个。 其中 Retention 表示保留级别&#xff0c;有三种&#xff1a; RetentionPolicy.SOURCE - 标记的注解仅保留在源码级别中&#xff0c;并被编译器忽略RetentionPolicy.CLASS - 标记的注解在编译时由编译器保…

【C++高阶(五)】哈希思想--哈希表哈希桶

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 哈希结构 1. 前言2. unordered系列容器3. 哈希概…