10 · WiFi 基础概念扫盲(车机视角)
适用范围:零基础读者。读代码前必须攒下的 WiFi 世界观——所有名词都会在后续文档里以
WifiEntry/ScanResult/WifiConfiguration等代码实体再次出现,这里先建立”人话版”。 本文是纯概念科普,不绑定行号;每个概念标注了它在 MiCarSettings 代码里的化身,方便对照后文。
0. 一张图看懂:车机 WLAN 在系统里的位置
flowchart TB subgraph 用户可见 UI[设置 App·WLAN 页面<br/>MiCarSettings] end subgraph 系统服务["系统进程(system_server)"] WSM[WifiService<br/>WifiManager API 背后的服务] SUP[wpa_supplicant 客户端库<br/>真正的握手/认证状态机] NM["ConnectivityService<br/>判断「网络到底通没通」"] end subgraph 硬件 DRV[WLAN 驱动 + 固件] CHIP[WLAN 芯片] end AP2[家里/公司的无线路由器 AP] UI -->|Binder IPC<br/>WifiManager.xxx| WSM WSM --> SUP --> DRV --> CHIP -.无线电.-> AP2 WSM --> NM NM -.网络可用性回调.-> UI
一句话分工:Settings 页面只是”遥控器+显示屏”,真正的扫描、连接、握手都在系统服务里异步发生;页面通过 广播 和 回调 得知进展再刷新 UI。这就是为什么后面所有时序图里,UI 更新永远晚于真实状态变化——中间隔着跨进程。
1. 角色名词:STA、AP、SSID、BSSID
| 名词 | 人话 | 生活比喻 |
|---|---|---|
| STA(Station) | 任何要连 WiFi 的设备,车机就是 STA | 你手里的手机 |
| AP(Access Point) | 发 WiFi 的设备,路由器 | 路由器本体 |
| SSID | WiFi 的名字(Service Set IDentifier),一个 AP 可广播多个 | ”小米路由器-5G” |
| BSSID | 一个具体 radio 的 MAC 地址,同一 SSID 每个频段/每个路由器节点各有一个 | 同名连锁店的”分店编号” |
为什么 BSSID 重要:公司里满楼都是同一个 SSID「OfficeWiFi」,实际是几十个 AP;你连的是其中一个 BSSID。手机在楼里走动会漫游(换 BSSID 不换 SSID)。车机停在地库入口/路面切换时也会遇到”同名不同 AP”。代码里 ScanResult.BSSID 与 WifiInfo.getBSSID() 对比,就是判断”还在不在同一个具体 AP 上”。
车机特化视角:车机没有移动数据,WLAN 是唯一大带宽上网通道(OTA、地图、音乐都靠它),所以 WLAN 页面在车机上比手机上更”命脉”。
2. 频段与信道:2.4GHz / 5GHz
| 维度 | 2.4GHz | 5GHz |
|---|---|---|
| 覆盖/穿墙 | 远、绕 | 近、直 |
| 速度 | 慢 | 快 |
| 干扰 | 严重(蓝牙也挤在这!) | 相对干净 |
| 车机场景 | 地库远端还能连 | 车位靠近 AP 时高速 |
- 蓝牙(BR/EDR)与 2.4G WiFi 共享 2.400-2.4835GHz,这是蓝牙和 WiFi 互相干扰的物理根源(蓝牙跳频会让 2.4G WiFi 吞吐抖动)。
- 同一路由器双频同名(2.4G/5G 同 SSID)时,一次扫描会扫出两个 BSSID、同一 SSID。Settings 列表通常按 SSID 去重合并显示——这是后面”列表条目怎么合并”的伏笔(参见 32-扫描与列表)。
3. 信号强度:RSSI 与 level(格数)
- RSSI(Received Signal Strength Indicator):接收信号强度,单位 dBm,负数,越接近 0 越强。真实世界大致 -30(贴脸)~-90(几乎断)。
- level(0~4):把连续的 RSSI 折算成 0~4 档,就是 UI 上的信号格数。折算函数就是
WifiManager.calculateSignalLevel(rssi, 5)。 - 小白必须记住的非线性:-70 比 -60 差的不是”一点”,格数掉一档;-85 以下基本连不稳。
- Settings 代码里
WifiEntry.getLevel()返回 0~4,条目右侧信号图标、排序都用它(排序细节见 32 篇)。
RSSI: -30 ──── -50 ──── -60 ──── -67 ──── -70 ──── -80 ──── -85 ──── -90
level: 4 4 3 3 2 1 1 0(不可用)
│◄─────── 强 ───────►│◄───── 中 ─────►│◄──── 弱 ────►│(具体分档阈值由框架内 RssiConverter/常数表决定,见 21-WifiTrackerLib 架构篇。)
4. 安全体系:从 OPEN 到 WPA3-SAE
| 类型 | 全称/机制 | 一句话 | 现状 |
|---|---|---|---|
| OPEN | 无加密 | 谁都能连,数据裸奔 | 公共热点 |
| WEP | Wired Equivalent Privacy | 已破解,历史产物 | 基本绝迹 |
| WPA/WPA2-PSK | Pre-Shared Key,家庭密码模式 | 全家共用一个密码,4 次握手验证 | 主流 |
| WPA3-SAE | Simultaneous Authentication of Equals | 替代 PSK,抗离线字典破解 | 新标准,车机已支持 |
| EAP/Enterprise | 802.1X,企业认证(账号密码/证书) | 每人一套凭证, Radius 服务器认证 | 公司网 |
- PSK vs SAE 的本质区别:WPA2 下攻击者抓走握手报文就能回家慢慢穷举密码;SAE 每次握手交互都不同,抓包无用。
- SAE 车机排障要点(来自实战 3907):SAE”握手成功”≠连接成功——AP 还能在关联后以 reason code 把你踢掉(如 13=Invalid IE,AP 不认你这台设备的某个信息元素)。判 SAE 成没成要看认证方式数值(key_mgmt),不能只看日志标签,详见 40-排障篇。
- 代码化身:条目上的锁图标、密码框弹不弹,都由
WifiEntry.getSecurity()(返回SECURITY_NONE/PSK/SAE/EAP...)决定。
4 次握手(4-Way Handshake)小白版:连 WPA2/WPA3 网络时,STA 和 AP 互相证明”都知道密码”却不传输密码本身,4 个来回谈出一个临时会话密钥。你不需要懂数学,只需知道:①它发生在 wpa_supplicant 里,不在 Settings;②密码错误通常在这一步之后以失败状态暴露;③它很快(毫秒级),所以 UI 上”正在连接”若停留数秒,多半卡在后续的 DHCP 或关联后认证,而非握手本身。
5. 拿到 IP:DHCP 与静态 IP
握手成功只是”进了门”,还要”领工牌”才能上网:
sequenceDiagram participant STA as 车机(STA) participant AP as 路由器(AP) STA->>AP: 关联成功 + 4次握手(有密码时) Note over STA,AP: 已"连上"但还没 IP,不能传业务数据 STA->>AP: DHCP Discover(广播:谁是DHCP服务器?) AP->>STA: DHCP Offer(给你 192.168.1.107?) STA->>AP: DHCP Request(就要这个) AP->>STA: DHCP ACK(成交,租期24h) Note over STA: 拿到 IP/网关/DNS → 真正"已连接"
- DHCP:自动领 IP。静态 IP:自己填 IP/网关/前缀,车机详情页的”IP 设置”就是在 PSK/静态间切换(详情页实际 UI 见 30-页面与导航篇 §4)。
- 排障直觉:“显示已连接但上不了网” 多半是 DHCP 失败(拿到 169.254.x.x 这类自配地址)或网关/DNS 问题,而不是 WiFi 密码层的事。
6. 扫描:主动/被动、轮次与节流
- 被动扫描:STA 逐信道听 AP 定期广播的 beacon。主动扫描:STA 每信道发 probe request,AP 立刻应答——快但费电。
- 扫描轮次(scan round):一次
startScan()触发一轮全信道扫描,产出一份List<ScanResult>。系统对扫描有节流(throttle):短时间反复请求会被框架拒发新扫描、返回缓存结果——这是”忘网后列表迟迟不刷新”类问题的物理根源之一(实战 2782,详见 34-忘网篇)。 - Settings 不直接碰信道,只调
WifiManager.startScan()并监听ACTION_SCAN_RESULTS_AVAILABLE_CHANGED广播(时序见 21/32 篇)。
7. 网络的”档案”:WifiConfiguration 与 saved networks
- 连成功过的网络会被系统保存成档案(WifiConfiguration / 新框架的 WifiConfig),含 SSID、密码、安全类型、自动连接开关。下次遇到同名 AP 直接免密重连——这就是”已保存网络”列表的数据来源。
- 忘记网络(forget)=删档案。删完同一 SSID 再连,就得重新输密码。
- 代码化身:
WifiManager.getSavedNetworks()↔SavedNetworkTracker↔ 已保存列表条目(见 33/34 篇)。
8. 其他高频缩写速查
| 缩写 | 全称 | 一句话 |
|---|---|---|
| BSS/ESS | Basic/Extended Service Set | 单个 AP / 多 AP 同名大网 |
| Roaming | 漫游 | 同 SSID 换 BSSID,不断网 |
| PMF | Protected Management Frames | 管理帧加密,WPA3 必选(排障 3907 里 AP/STA 协商不一致会踢人) |
| EAP | Extensible Authentication Protocol | 企业认证的协议族总称 |
| Osu/Passpoint/Hotspot2.0 | — | 用证书自动登公共热点的技术,车机库里有壳(PasspointWifiEntry)但基本不用 |
| P2P/Direct | Wi-Fi Direct | 设备直连,车机互联有别的私有协议,此库不涉 |
| MAC 随机化 | MAC randomization | 每次连不同网络用不同假 MAC 防跟踪(影响”路由器上看到的设备名”) |
| NetworkRequest | — | 第三方 App 请求系统弹窗让用户挑 WiFi(如地图 App 要网),车机有一族专用对话框(见 30 篇 §6) |
9. 车机 WLAN 与手机的 5 个差异(读代码前的校准)
- 无移动数据兜底:断 WLAN = 断网,所以连接状态文案、自动重连的 UX 权重远高于手机。
- 常电/常在:车机不休眠习惯与手机不同,扫描调度、省电策略(Doze 下扫描限制)表现不同。
- 多用户/代客模式:车机有 Guest 用户, WLAN 开关可能被用户限制(
DISALLOW_WIFI之类 UserManager 限制,见 31-开关篇)。 - 单屏聚焦:页面切换少,WLAN 页可能长时间驻留前台,列表刷新风暴的代价被放大(实战 137881)。
- 信号环境剧变:行驶中 AP 更替极快,漫游/重连/列表抖动天然高频。
10. 名词 ↔ 代码实体对照总表
| 概念(本文) | 代码实体(MiCarSettings/WifiTrackerLib) | 详见 |
|---|---|---|
| 一轮扫描结果 | ScanResult / ScanResultUpdater | 21 篇 |
| 列表上的一个网络 | WifiEntry(及其子类 StandardWifiEntry/KnownNetworkEntry) | 21/32 篇 |
| 已保存档案 | WifiConfiguration + SavedNetworkTracker | 33 篇 |
| 连接状态(3 态) | WifiEntry.getConnectedState() CONNECTED/CONNECTING/DISCONNECTED(没有 DISCONNECTING) | 21 篇 §3.1 |
| 信号格数 | WifiEntry.getLevel() ← RSSI 折算 | 21 篇 |
| 安全类型 | WifiEntry.getSecurity() | 33 篇 |
| 系统 API 门面 | WifiManager(Binder→WifiService) | 20 篇 |
| 状态变化通知 | 广播 NETWORK_STATE_CHANGED 等 / WifiPickerTracker.WifiPickerTrackerCallback | 21 篇 |
下一篇:20 篇把这些概念落到 Android 框架的类与进程上——WifiManager/WifiService/广播族怎么协作,WifiTrackerLib 夹在中间扮演什么角色。