Android wifi连接和获取IP分析

wifi 连接&获取IP 流程图

代码流程分析

一、关联阶段

1. WifiSettings.submit – > WifiManager

  • WifiSettings 干的事情比较简单,当在dialog完成ssid 以及密码填充后,直接call WifiManager save 即可
  • WifiManager 收到Save 之后,就开始了wifi 连接之旅
packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java
void submit(WifiConfigController configController){... mWifiManager.save(config, mSaveListener);
}

2. WifiSettings.submit – > WifiManager

  • WifiManager 这里相当于传达室,信件到了,然后按个铃铛,把信息传达给WifiSerivceImpl
  • 主要是将SAVE_NETWORK 给到 WifiService(WifiServiceImpl 是真正干活的)
frameworks/base/wifi/java/android/net/wifi/WifiManager.java
public void save(WifiConfiguration config, ActionListener listener) {getChannel().sendMessage(SAVE_NETWORK, 0, putListener(listener), config);
}

3. WifiServiceImpl --> WifiStateMachine

  • WifiServiceImpl又将 SAVE_NETWORK 送到中级cmd处理站: WifiStateMachine
  • 这里扩展一下,如我们的移除热点(其实也通过Settings 将remove cmd 送到WifiServieImpl进行下一步传输)
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
private class ClientHandler extends WifiHandler {case WifiManager.SAVE_NETWORK:{mWifiStateMachine.sendMessage(Message.obtain(msg));
}
}

4. WifiStateMachine–> WifiStateMachine

  • 从save network 连接热点
  • 又一次转化, 转为CMD_START_CONNECT送到内部状态机(ConnectModeState )处理
  • 送到WifiNative 进行处理Connect,回顾以上(Android 基本套路大框架还是不变的: apps – services – native – drv(kernel))
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java
public void startConnectToNetwork(int networkId, int uid, String bssid) {sendMessage(CMD_START_CONNECT, networkId, uid, bssid);
}class ConnectModeState extends State {case WifiManager.SAVE_NETWORK:startConnectToNetwork(netId, message.sendingUid, SUPPLICANT_BSSID_ANY);// 连接热点case CMD_START_CONNECT:mWifiNative.connectToNetwork(mInterfaceName, config); // 转到wifiNative 进行connect 
}

5. WifiNative–> SupplicantStaIfaceHal --> WifMonitor

  • SupplicantStaIfaceHal 添加网络,select (实则将connect 传给到 wpa_supplicant)
  • wpa_supplicant完成一系列与路由器的之间的beacon帧(probe、assoc、4way-handshake 、group-handshake)后,再能取到路由器的颁发的认可证(既是拿到最后的compelted)
  • 最后,通过wifiMonitor上报wpa_supplicant 任务已完成,既是完成连接的第一阶段(关联阶段)
  • WiFiMonitor上报的事件既是,NETWORK_CONNECTION_EVENT (又一次回到WifiStateMachine)
frameworks/opt/net/wifi/service/java/com/android/server/wifi/SupplicantStaIfaceHal.javapublic boolean connectToNetwork(@NonNull String ifaceName, @NonNull WifiConfiguration config)
{Pair<SupplicantStaNetworkHal, WifiConfiguration> pair =addNetworkAndSaveConfig(ifaceName, config);networkHandle.select(); 
}public void onStateChanged(int newState, byte[/* 6 */] bssid, int id,ArrayList<Byte> ssid) {if (newSupplicantState == SupplicantState.COMPLETED){mWifiMonitor.broadcastNetworkConnectionEvent(mIfaceName, getCurrentNetworkId(mIfaceName), bssidStr);}
}

二、获取IP 阶段

6. WifMonitor --> WifiStateMachine

  • 由5的NETWORK_CONNECTION_EVENT 事件上报,又一次回到了WifiStateMachine
  • 而且还是在ConnectModeState 状态机里,为啥?(又回到这里)
  • 因为,1~5步只完成了关联,还有最后一步(要获取IP),拿到IP后才能算是一个有证的男人,
  • 革命尚未成功,苦逼仍要继续(且看下面是如何获取IP …)
  • 先是,广而告知(已取得真经),然后立马切换到mObtainingIpState状态机
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java
class ConnectModeState extends State {case WifiMonitor.NETWORK_CONNECTION_EVENT:.... sendNetworkStateChangeBroadcast(mLastBssid);transitionTo(mObtainingIpState);
}

7. WifiStateMachine.ObtainingIpState

  • ObtainingIpState 获取IP 的流程中规中矩,先是update 系统的State
  • 停掉IpClient (自从Android N 后,获取IP已废弃了dhcpd,扶持了另一位的IpClient 、IpManager来完成自己的事业 )
  • 清掉bssid以避免其影响到漫游导致断链
  • Ipclient 开始接管舞台(启动获取IP)
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java
class ObtainingIpState extends State {... setNetworkDetailedState(DetailedState.OBTAINING_IPADDR);clearTargetBssid("ObtainingIpAddress");stopIpClient();mIpClient.setHttpProxy(currentConfig.getHttpProxy());IpClient.buildProvisioningConfiguration(); .... 
}

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

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

相关文章

新的 BLUFFS 攻击导致蓝牙连接不再私密

蓝牙是一种连接我们设备的低功耗无线技术&#xff0c;有一个新的漏洞需要解决。 中间的攻击者可以使用新的 BLUFFS 攻击轻松窥探您的通信。 法国研究中心 EURECOM 的研究员 Daniele Antonioli 演示了六种新颖的攻击&#xff0c;这些攻击被定义为 BLUFFS&#xff08;蓝牙转发和…

【Java】文件I/O-文件内容操作-输入输出流-Reader/Writer/InputStream/OutputStream四种流

导读 在文件I/O这一节的知识里&#xff0c;对文件的操作主要分为两大类&#xff1a; ☑️针对文件系统进行的操作 ☑️针对文件内容进行的操作 上文已经讲了针对文件系统即File类的操作&#xff0c;这篇文章里博主就来带了解针对文件内容的操作&#xff0c;即输入输出流&am…

04_网络编程

网络编程 什么是网络编程 可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09; java.net.* 包下提供了网络编程的解决方案 通信的基本架构 CS 架构&#xff08;Client 客户端 / Server 服务端&#xff09;BS 架构&#xff08;…

Open Inventor 2023.2.1 Crack

Fixed Bugs List 2023.2 2023.2.1 Open Inventor 2023.2.1 MeshViz #OIV-4824 Crash in MeshViz PbNonLinearDataMapping::computeColor Cache #OIV-4867 SoText3 : Texture read access violation – CAS-44904 Core #OIV-4725 Invalid displayed PoCircle color…

MySQL笔记-第06章_多表查询

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第06章_多表查询1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决 2. …

C#网络编程UDP程序设计(UdpClient类)

目录 一、UdpClient类 二、示例 1.源码 &#xff08;1&#xff09;Client &#xff08;2&#xff09;Server 2.生成 &#xff08;1&#xff09;先启动服务器&#xff0c;发送广播信息 &#xff08;2&#xff09;再开启客户端接听 UDP是user datagram protocol的简称&a…

基于Python的PyGame的俄罗斯方块游戏设计与实现

摘 要 近年来&#xff0c;随着游戏产业的突飞猛进&#xff0c;游戏玩家的技术也是与日俱增&#xff0c;当你看见游戏高手完美的表演时&#xff0c;你是否想过我也能达到那种水平&#xff0c;本程序用Python语言编写俄罗斯方块&#xff0c;左侧显示正在运行的游戏&#xff0c;右…

BFS求树的宽度——结合数组建树思想算距离

二叉树最大宽度 https://leetcode.cn/problems/maximum-width-of-binary-tree/description/ 1、考虑树的宽度一定是在一层上的所以进行BFS&#xff0c;树的BFS不建议直接使用队列&#xff0c;每次add/offer然后poll/remove&#xff0c;这样子层级关系不好显示。我们可以定义…

MySQL笔记-第05章_排序与分页

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第05章_排序与分页1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 第05章_排序与分页 讲师&#…

Apache Sqoop使用

1. Sqoop介绍 Apache Sqoop 是在 Hadoop 生态体系和 RDBMS 体系之间传送数据的一种工具。 Sqoop 工作机制是将导入或导出命令翻译成 mapreduce 程序来实现。在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。 Hadoop 生态系统包括&#xff1a;HDFS、Hi…

Ubuntu20.04安装向日葵、开机自启、解决windows系统远程黑屏(笔记)

这里写目录标题 动机1. Ubuntu20.04 安装向日葵2. 设置开机自启3. 解决windows不可远程的问题4. 大公告成 动机 办公室有个工作站&#xff0c;要比我的笔记本的CPU稍微好一点&#xff0c;用来跑陆面过程。我信心满满的装了个Ubuntu20.04双系统,但是发现向日葵安装不上了。我少…

从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位 置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

题目描述&#xff1a;从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 bool DeleteMin(SqList &L,int &min){if(L.length 0)return false;min L…

回溯和分支算法

状态空间图 “图”——状态空间图 例子&#xff1a;农夫过河问题——“图”状态操作例子&#xff1a;n后问题、0-1背包问题、货郎问题(TSP) 用向量表示解&#xff0c;“图”由解向量扩张得到的解空间树。 ——三种图&#xff1a;n叉树、子集树、排序树 ​ 剪枝 不满住条件的…

时间序列数据压缩算法简述

本文简单介绍了时间序列压缩任务的来源&#xff0c;压缩算法的分类&#xff0c;并对常见压缩算法的优缺点进行了简介&#xff0c;爱码士们快来一探究竟呀&#xff01; 引言 时间序列数据是在许多应用程序和领域中生成的一种基本数据类型&#xff0c;例如金融、医疗保健、交通和…

基于Python手把手教你实现flappy bird游戏

目录 前言开始前的准备工作进入正题结束语 前言 想必玩过游戏的都知道&#xff0c;Flappy Bird是一款简单却富有挑战性的经典的小鸟飞行游戏&#xff0c;让许多玩家为之痴迷&#xff0c;而作为开发者&#xff0c;那肯定要通过技术手段来再做一遍这款经典游戏。那么本文就来通…

春秋云镜:CVE-2022-28512

靶标介绍&#xff1a; Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客&#xff0c;它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能&#xff0c;您无需接触任何代码即可启动并运行您的博客。 该…

SQL基础理论篇(十):事务处理

文章目录 简介事务的四大特性ACID如何使用事务参考文献 简介 MySQL在5.5版本之前&#xff0c;默认的存储引擎是MyISAM&#xff0c;它是不支持事务的&#xff0c;而5.5版本之后默认的引擎是InnoDB&#xff0c;这个是支持事务的&#xff0c;这也是InnoDB最终取代MyISAM称为主流引…

vscode配置使用 cpplint

标题安装clang-format和cpplint sudo apt-get install clang-format sudo pip3 install cpplint标题以下settings.json文件放置xxx/Code/User目录 settings.json {"sync.forceDownload": false,"workbench.sideBar.location": "right","…

振动和震动的区别?

问题描述&#xff1a;振动和震动的区别&#xff1f; 问题解决&#xff1a; 震动&#xff08;Oscillation&#xff09;&#xff1a; 特点&#xff1a; 随机的、突发的、不经常的、无规律的运动。例子&#xff1a; 地壳震动、消息震动全国&#xff0c;强调的是运动的力度或幅度&…

Using Application Engine Meta-SQL 使用应用引擎元SQL

Using Application Engine Meta-SQL 使用应用引擎元SQL This section describes the meta-SQL constructs, functions, and meta-variables you can use in Application Engine. 本节描述可以在Application Engine中使用的元SQL构造、函数和元变量。 Note: The SQL Editor does…