当前位置: 首页 > news >正文

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(); .... 
}

相关文章:

Android wifi连接和获取IP分析

wifi 连接&获取IP 流程图 代码流程分析 一、关联阶段 1. WifiSettings.submit – > WifiManager WifiSettings 干的事情比较简单&#xff0c;当在dialog完成ssid 以及密码填充后&#xff0c;直接call WifiManager save 即可WifiManager 收到Save 之后&#xff0c;就开…...

MLIR笔记(5)

4.3.4. 图区域 在MLIR中&#xff0c;区域里类似图的语义由RegionKind::Graph来表示。对没有控制流的并发语义&#xff0c;以及通用有向图数据结构的建模&#xff0c;图区域是合适的。图区域适用于表示耦合值之间的循环关系&#xff0c;这些关系没有基本的序。例如&#xff0c;…...

abapgit 安装及使用

abapgit 需求 SA[ BASIS 版本 702 及以上 版本查看路径如下&#xff1a; 安装步骤如下&#xff1a; 1. 下载abapgit 独立版本 程序 链接如下&#xff1a;raw.githubusercontent.com/abapGit/build/main/zabapgit_standalone.prog.abap 2.安装开发版本 2.1 在线安装 前置条…...

园区无线覆盖方案(智慧园区综合解决方案)

​ 李经理正苦恼头疼的工业园区数字化改造项目。近年企业快速增长,园区内Argent工业设备激增,IT部门应接不暇。为确保生产系统稳定运行,IT管理团队经过反复摸索,决定进行全面的数字化升级。然而改造之艰巨远超想象——混杂的接入环境、复杂的专线部署、长达数月的建设周期,种种…...

配置中心--Spring Cloud Config

目录 概述 环境说明 步骤 创建远端git仓库 准备配置文件 配置中心--服务端 配置中心--客户端 配置中心的高可用 配置中心--服务端 配置中心--客户端 消息总线刷新配置 配置中心--服务端 配置中心--客户端 概述 因为微服务架构有很多个服务&#xff0c;手动一个一…...

笔记-模拟角频率和数字角频率的关系理解

先建议阅读前人此文&#xff08;点击这里&#xff09;&#xff0c;有助于理解。 模拟频率&#xff1a;f 模拟角频率&#xff1a;Ω 数字角频率&#xff1a;ω 其中&#xff1a;在模拟信号中Ω 2πf 正弦波表示&#xff1a;sin(2πft) sin(Ωt) 数字信号就是离散的&#xff…...

Zookeeper+Kafka集群

注&#xff1a;本章使用的Kafka为2.7.0版本 Zookeeper概述 1.Zookeeper定义 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 2.Zookeeper工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理…...

Sunshine+Moonlight+Android手机串流配置(局域网、无手柄)

目录 前言Sunshine&#xff08;服务端&#xff09;ApplicationConfigurationGeneralAdvance Moonlight&#xff08;客户端&#xff09;配对打开虚拟手柄串流按键调整退出串流 原神&#xff0c;启动&#xff01; 前言 写这篇文章单纯是因为搜来搜去没有很符合我需求的教程&#…...

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

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

详解—[C++ 数据结构]—AVL树

目录 一.AVL树的概念 二、AVL树节点的定义 三、AVL树的插入 3.1插入方法 四、AVL树的旋转 1. 新节点插入较高左子树的左侧---左左&#xff1a;右单旋 2. 新节点插入较高右子树的右侧---右右&#xff1a;左单旋 3.新节点插入较高左子树的右侧---左右&#xff1a;先左单旋…...

卷积神经网络(CNN):乳腺癌识别.ipynb

文章目录 一、前言一、设置GPU二、导入数据1. 导入数据2. 检查数据3. 配置数据集4. 数据可视化 三、构建模型四、编译五、训练模型六、评估模型1. Accuracy与Loss图2. 混淆矩阵3. 各项指标评估 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&#xf…...

有文件实体的后门无文件实体的后门rootkit后门

有文件实体后门和无文件实体后门&RootKit后门 什么是有文件的实体后门&#xff1a; 在传统的webshell当中&#xff0c;后门代码都是可以精确定位到某一个文件上去的&#xff0c;你可以rm删除它&#xff0c;可以鼠标右键操作它&#xff0c;它是有一个文件实体对象存在的。…...

GPT实战系列-大模型训练和预测,如何加速、降低显存

GPT实战系列-大模型训练和预测&#xff0c;如何加速、降低显存 不做特别处理&#xff0c;深度学习默认参数精度为浮点32位精度&#xff08;FP32&#xff09;。大模型参数庞大&#xff0c;10-1000B级别&#xff0c;如果不注意优化&#xff0c;既耗费大量的显卡资源&#xff0c;…...

SQL Sever 基础知识 - 数据排序

SQL Sever 基础知识 - 二 、数据排序 二 、对数据进行排序第1节 ORDER BY 子句简介第2节 ORDER BY 子句示例2.1 按一列升序对结果集进行排序2.2 按一列降序对结果集进行排序2.3 按多列对结果集排序2.4 按多列对结果集不同排序2.5 按不在选择列表中的列对结果集进行排序2.6 按表…...

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","…...

C++ 系列 第四篇 C++ 数据类型上篇—基本类型

系列文章 C 系列 前篇 为什么学习C 及学习计划-CSDN博客 C 系列 第一篇 开发环境搭建&#xff08;WSL 方向&#xff09;-CSDN博客 C 系列 第二篇 你真的了解C吗&#xff1f;本篇带你走进C的世界-CSDN博客 C 系列 第三篇 C程序的基本结构-CSDN博客 前言 面向对象编程(OOP)的…...

C++ 指针详解

目录 一、指针概述 指针的定义 指针的大小 指针的解引用 野指针 指针未初始化 指针越界访问 指针运算 二级指针 指针与数组 二、字符指针 三、指针数组 四、数组指针 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 指针与数组 一维数组 字符数组…...

.locked、locked1勒索病毒的最新威胁:如何恢复您的数据?

导言&#xff1a; 网络安全问题变得愈加严峻。.locked、locked1勒索病毒是近期备受关注的一种恶意软件&#xff0c;给用户的数据带来了巨大威胁。本文将深入探讨.locked、locked1勒索病毒的特征&#xff0c;探讨如何有效恢复被其加密的数据&#xff0c;并提供一些建议&#xf…...

Apache Sqoop使用

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

【UGUI】实现UGUI背包系统的六个主要交互功能

在这篇教程中&#xff0c;我们将详细介绍如何在Unity中实现一个背包系统的六个主要功能&#xff1a;添加物品、删除物品、查看物品信息、排序物品、搜索物品和使用物品。让我们开始吧&#xff01; 一、添加物品 首先&#xff0c;我们需要创建一个方法来添加新的物品到背包中。…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...