Android P WiFi的 Disconnect 流程 汇总
文章目录
- WiFi 断开Flow框架
- 1. wifi 断开原因总结
- 2. wifi 断开处理流程
- 代码流程
- 1. wpa_supplicant 部分
- 2. wpa_supplicant --> hidl --> SupplicantStaIfaceHal
- 3. WifiMonitor --> WifiStateMachine --> 广播通知系统
WiFi 断开Flow框架
设备WiFi 断开的原因有多种多样,但断开流程大体不变;
所以遇到wif i断开问题不要慌,不要慌,本文将毫无保留分享处理断开问题思路,
这里抛砖引玉,给你们走出困境中一些实用的指南tips。
还是老三样,先上流程图
- 春江水暖鸭先知,同样的wifi断开 drv先知;
- wlan drv 在与路由器连接的时候(未断开时),私下里面会有周期性的beacon帧来维持地下恋情,AP端一旦遇到突发事项,通过的特殊暗号(802.11 协议,deauth 帧/ reject帧等)立刻通知到drv;
- wlan drv 一旦收到暗号后,马上独善其身(断开与AP端的链接),撇清与AP的关系,宣布自己的净身而立;
- 紧接着,wlan drv 后援部队(wifiStateMachine 内部广播通知系统外部网络环境),系统跟Settins开始同步处理断开的烂摊子;
- 后面有时间将详细解读断开暗号(关于802.11协议),敬请期待。
1. wifi 断开原因总结
2. wifi 断开处理流程
代码流程
1. wpa_supplicant 部分
- wpa_driver_nl80211_drv_init 其核心完成与drv 通道绑定(既是与drv建立好暗号信息交流通道),一旦有变化及时通风报信
- 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 函数里可以找到),结合drv 行为 + 空中包
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);
}
Android P WiFi的 Disconnect 流程 汇总相关推荐
- (九十七)Android O WiFi热点 开启流程梳理续(二)
前言:从之前WiFi的连接流程可以知道WiFi最后一步会和服务端进行dhcp以获取ip地址,那么WiFi热点开启的时候应该也要配置相关dhcp属性,以供后续WiFi连接的时候ip分配,根据这块流程继续 ...
- (七十一)Android O WiFi热点 开启流程梳理
前言:之前主要梳理了WiFi开启扫描连接的流程,现在梳理下WiFi 热点 的开启流程. 时序图mdj样式:https://download.csdn.net/download/sinat_200594 ...
- Android 11 Wifi之ConnectivityService流程
一.NetworkFactory注册 frameworks/base/services/java/com/android/server/SystemServer.java frameworks/opt ...
- 全志平台Android系统WIFI架构工作流程分析
1. 前言 记录个人最近对Android wifi的了解和使用感受, 并为想入门.学习Android wifi的人员提供一定的参考 2. Android系统中的WIFI架构 wifi在Android中 ...
- (一百四十四)Android P WiFi 上网校验流程梳理
前言:本文采用倒叙梳理,之前梳理流程没记下来忘了,现在再来一遍,所以说梳理什么的还是做个备忘比较好. 1.ConnectivityService 看网络校验相关log经常能看到如下log打印 log( ...
- (五十四)Android O WiFi 获取扫描结果流程梳理
前言:之前在(五十) Android O WiFi的扫描流程梳理 已经梳理过扫描流程了,那扫描完的结果会呈现在设置的WiFi界面,那扫描结果是如何获取的呢? 1. wifi扫描结果简介 WiFi的扫描 ...
- Android WiFi 打开关闭流程
本文简单介绍下WiFi打开与关闭流程,参考源码Android P. 一.WiFi 开机自动打开流程 系统服务启动的时候会启动WifiService,在SystemService.PHASE_SYSTE ...
- Android wifi PNO扫描流程(Andriod O)
版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/h784707460/article/details/79702275,未经博主允许不得转载. 一. Android ...
- Android 11 WiFi启动流程
欢迎大家一起学习探讨通信之WLAN.本节重点基于Android11分析讨论WiFi开启流程.用户点击一下"WiFi"开关,WiFi开启了.看似如此简单操作,但系统流程调用还是相当复 ...
最新文章
- NDK,动态链接库,JNI
- 离线环境安装Django2.2(亲测)
- 这篇文章太懂程序员了,扎心了
- angular 实现无限极联动下拉
- Golang 大杀器之性能剖析 PProf
- Activity的神奇启动模式之singleTask
- APS计划排程和生产排产系统,包含哪些排程算法?
- 2.4G无线音箱四层PCB设计学习(一)
- win11修改DNS | win11改如何修改DNS服务器地址
- 级联查询ajax,ajax级联查询
- 15、 Flutter Widgets 之 ClipRect,ClipRRect,ClipOval,ClipPath,CustomClipper,裁剪组件
- 笔记本html外接显示器,笔记本怎样外接显示器 笔记本外接显示器方法【详解】...
- 怎样优化IM即时通讯移动端APP的日志上报机制
- 程序员的专属吐槽会,你能听懂几个梗?
- 苹果开发者证书提示编辑电话号码
- 企业应用层面知识管理咨询方法
- java 天数转毫秒_Java 毫秒转换为日期类型、日期转换为毫秒
- 【胶水语言】 Python 的混合编程
- jstack -- java堆栈常用排查指令
- 色彩关系太复杂?一篇内容帮你整理明白