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 的设备,路由器路由器本体
SSIDWiFi 的名字(Service Set IDentifier),一个 AP 可广播多个”小米路由器-5G”
BSSID一个具体 radio 的 MAC 地址,同一 SSID 每个频段/每个路由器节点各有一个同名连锁店的”分店编号”

为什么 BSSID 重要:公司里满楼都是同一个 SSID「OfficeWiFi」,实际是几十个 AP;你连的是其中一个 BSSID。手机在楼里走动会漫游(换 BSSID 不换 SSID)。车机停在地库入口/路面切换时也会遇到”同名不同 AP”。代码里 ScanResult.BSSIDWifiInfo.getBSSID() 对比,就是判断”还在不在同一个具体 AP 上”。

车机特化视角:车机没有移动数据,WLAN 是唯一大带宽上网通道(OTA、地图、音乐都靠它),所以 WLAN 页面在车机上比手机上更”命脉”。

2. 频段与信道:2.4GHz / 5GHz

维度2.4GHz5GHz
覆盖/穿墙远、绕近、直
速度
干扰严重(蓝牙也挤在这!)相对干净
车机场景地库远端还能连车位靠近 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无加密谁都能连,数据裸奔公共热点
WEPWired Equivalent Privacy已破解,历史产物基本绝迹
WPA/WPA2-PSKPre-Shared Key,家庭密码模式全家共用一个密码,4 次握手验证主流
WPA3-SAESimultaneous Authentication of Equals替代 PSK,抗离线字典破解新标准,车机已支持
EAP/Enterprise802.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/ESSBasic/Extended Service Set单个 AP / 多 AP 同名大网
Roaming漫游同 SSID 换 BSSID,不断网
PMFProtected Management Frames管理帧加密,WPA3 必选(排障 3907 里 AP/STA 协商不一致会踢人)
EAPExtensible Authentication Protocol企业认证的协议族总称
Osu/Passpoint/Hotspot2.0用证书自动登公共热点的技术,车机库里有壳(PasspointWifiEntry)但基本不用
P2P/DirectWi-Fi Direct设备直连,车机互联有别的私有协议,此库不涉
MAC 随机化MAC randomization每次连不同网络用不同假 MAC 防跟踪(影响”路由器上看到的设备名”)
NetworkRequest第三方 App 请求系统弹窗让用户挑 WiFi(如地图 App 要网),车机有一族专用对话框(见 30 篇 §6)

9. 车机 WLAN 与手机的 5 个差异(读代码前的校准)

  1. 无移动数据兜底:断 WLAN = 断网,所以连接状态文案、自动重连的 UX 权重远高于手机。
  2. 常电/常在:车机不休眠习惯与手机不同,扫描调度、省电策略(Doze 下扫描限制)表现不同。
  3. 多用户/代客模式:车机有 Guest 用户, WLAN 开关可能被用户限制(DISALLOW_WIFI 之类 UserManager 限制,见 31-开关篇)。
  4. 单屏聚焦:页面切换少,WLAN 页可能长时间驻留前台,列表刷新风暴的代价被放大(实战 137881)。
  5. 信号环境剧变:行驶中 AP 更替极快,漫游/重连/列表抖动天然高频。

10. 名词 ↔ 代码实体对照总表

概念(本文)代码实体(MiCarSettings/WifiTrackerLib)详见
一轮扫描结果ScanResult / ScanResultUpdater21 篇
列表上的一个网络WifiEntry(及其子类 StandardWifiEntry/KnownNetworkEntry)21/32 篇
已保存档案WifiConfiguration + SavedNetworkTracker33 篇
连接状态(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.WifiPickerTrackerCallback21 篇

下一篇:20 篇把这些概念落到 Android 框架的类与进程上——WifiManager/WifiService/广播族怎么协作,WifiTrackerLib 夹在中间扮演什么角色。