文章目录

  • 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 流程 汇总相关推荐

  1. (九十七)Android O WiFi热点 开启流程梳理续(二)

    前言:从之前WiFi的连接流程可以知道WiFi最后一步会和服务端进行dhcp以获取ip地址,那么WiFi热点开启的时候应该也要配置相关dhcp属性,以供后续WiFi连接的时候ip分配,根据这块流程继续 ...

  2. (七十一)Android O WiFi热点 开启流程梳理

    前言:之前主要梳理了WiFi开启扫描连接的流程,现在梳理下WiFi 热点 的开启流程. 时序图mdj样式:https://download.csdn.net/download/sinat_200594 ...

  3. Android 11 Wifi之ConnectivityService流程

    一.NetworkFactory注册 frameworks/base/services/java/com/android/server/SystemServer.java frameworks/opt ...

  4. 全志平台Android系统WIFI架构工作流程分析

    1. 前言 记录个人最近对Android wifi的了解和使用感受, 并为想入门.学习Android wifi的人员提供一定的参考 2. Android系统中的WIFI架构 wifi在Android中 ...

  5. (一百四十四)Android P WiFi 上网校验流程梳理

    前言:本文采用倒叙梳理,之前梳理流程没记下来忘了,现在再来一遍,所以说梳理什么的还是做个备忘比较好. 1.ConnectivityService 看网络校验相关log经常能看到如下log打印 log( ...

  6. (五十四)Android O WiFi 获取扫描结果流程梳理

    前言:之前在(五十) Android O WiFi的扫描流程梳理 已经梳理过扫描流程了,那扫描完的结果会呈现在设置的WiFi界面,那扫描结果是如何获取的呢? 1. wifi扫描结果简介 WiFi的扫描 ...

  7. Android WiFi 打开关闭流程

    本文简单介绍下WiFi打开与关闭流程,参考源码Android P. 一.WiFi 开机自动打开流程 系统服务启动的时候会启动WifiService,在SystemService.PHASE_SYSTE ...

  8. Android wifi PNO扫描流程(Andriod O)

    版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/h784707460/article/details/79702275,未经博主允许不得转载. 一. Android ...

  9. Android 11 WiFi启动流程

    欢迎大家一起学习探讨通信之WLAN.本节重点基于Android11分析讨论WiFi开启流程.用户点击一下"WiFi"开关,WiFi开启了.看似如此简单操作,但系统流程调用还是相当复 ...

最新文章

  1. NDK,动态链接库,JNI
  2. 离线环境安装Django2.2(亲测)
  3. 这篇文章太懂程序员了,扎心了
  4. angular 实现无限极联动下拉
  5. Golang 大杀器之性能剖析 PProf
  6. Activity的神奇启动模式之singleTask
  7. APS计划排程和生产排产系统,包含哪些排程算法?
  8. 2.4G无线音箱四层PCB设计学习(一)
  9. win11修改DNS | win11改如何修改DNS服务器地址
  10. 级联查询ajax,ajax级联查询
  11. 15、 Flutter Widgets 之 ClipRect,ClipRRect,ClipOval,ClipPath,CustomClipper,裁剪组件
  12. 笔记本html外接显示器,笔记本怎样外接显示器 笔记本外接显示器方法【详解】...
  13. 怎样优化IM即时通讯移动端APP的日志上报机制
  14. 程序员的专属吐槽会,你能听懂几个梗?
  15. 苹果开发者证书提示编辑电话号码
  16. 企业应用层面知识管理咨询方法
  17. java 天数转毫秒_Java 毫秒转换为日期类型、日期转换为毫秒
  18. 【胶水语言】 Python 的混合编程
  19. jstack -- java堆栈常用排查指令
  20. 色彩关系太复杂?一篇内容帮你整理明白

热门文章

  1. 北大青鸟职业技能等级认定第三方评价机构迎来首考
  2. 顺序查找法和二分查找法
  3. 游戏测试技术专场答疑(腾讯互娱WeTest测试专家)
  4. 关于延时队列的一些思考
  5. SSO单点登录流程详解
  6. python 中 with 的用法和原理
  7. [系统与工程]系统指令-探测之星升级工程代码
  8. 优酷在线播放器 html5,看优酷,用HTML5
  9. PTA 1060 爱丁顿数(Python3)
  10. php 录小视频,这些短视频拍摄小技巧,99%的人不知道