4. Wi-Fi 工具链:wpa_supplicant、hostapd、iw、ifconfig、iwconfig 等工具详解

做嵌入式 Wi-Fi 开发,说白了就是跟这几个工具打交道。我刚开始接触 Tina Linux 时,面对一堆命令行工具也懵过——哪个负责连网?哪个负责扫信号?哪个用来配 IP?

后来踩的坑多了,慢慢就摸清了门道。今天我把这套工具链掰开揉碎讲清楚。你想想看,搞 Wi-Fi 调试,本质上就三件事:扫描、连接、配置。每个工具都有自己的定位。

核心观点: 工具链不是孤立的,它们通过内核的 nl80211/cfg80211 机制协同工作。上层工具只管发命令,底层驱动负责执行。
Wi-Fi 工具链分层架构 用户空间工具层 wpa_supplicant hostapd iw / iwconfig ifconfig / udhcpc 内核接口层 nl80211 / cfg80211 / wext Wi-Fi 驱动层 mac80211 / 厂商驱动 (bcmdhd, rtl, mtk 等) 硬件层 SDIO / USB / PCIe Wi-Fi 芯片 工具链通过 nl80211 与内核通信,不直接操作硬件

4.1 wpa_supplicant:Wi-Fi 客户端的灵魂

wpa_supplicant 是 Linux 上最主流的 Wi-Fi 客户端守护进程。它负责扫描、认证、密钥协商和连接管理。说白了,你手机连 Wi-Fi 时后台跑的那套逻辑,在嵌入式 Linux 上就是 wpa_supplicant 干的。

我在项目中遇到过最典型的问题:设备连不上企业级 WPA2-Enterprise 网络。查了半天,发现是 wpa_supplicant 编译时没开 EAP 支持。嗯,这个坑后面会细说。

4.1.1 启动与配置文件

启动命令很简单,但参数有讲究:

# 前台调试模式(强烈推荐调试时用)
wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -dd

# 后台守护进程模式
wpa_supplicant -B -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf

参数说明:

参数含义我的建议
-D nl80211指定驱动接口新芯片首选,wext 已过时
-i wlan0网络接口名确认 ifconfig 能查到再指定
-c 配置文件指定配置路径路径写错是新手常见问题
-dd双倍调试级别我调试时必加,信息最全
-B后台运行产品发布时用,调试别用
调试技巧: 我习惯先用 -dd 前台跑,看到 "CTRL-EVENT-CONNECTED" 日志后再切到后台模式。这样能第一时间发现驱动或配置问题。

4.1.2 配置文件核心写法

配置文件是 wpa_supplicant 的核心。我见过太多人把 Windows 上的配网思维带过来,结果连不上。来看几个典型场景:

# 场景一:开放式网络(无密码)
network={
    ssid="MyHomeWiFi"
    key_mgmt=NONE
}

# 场景二:WPA2-PSK(家用最常见)
network={
    ssid="MyHomeWiFi"
    psk="mypassword123"
    key_mgmt=WPA-PSK
}

# 场景三:隐藏 SSID(需要主动扫描)
network={
    ssid="HiddenNet"
    psk="secret123"
    scan_ssid=1
    key_mgmt=WPA-PSK
}

# 场景四:WPA2-Enterprise(公司网络)
network={
    ssid="CorpWiFi"
    key_mgmt=WPA-EAP
    eap=PEAP
    identity="user@company.com"
    password="mypass"
    phase2="auth=MSCHAPV2"
}
注意: 配置文件权限必须设为 600,否则 wpa_supplicant 会拒绝加载。我曾经因为这个浪费了半小时——明明配置没错,就是连不上。

4.1.3 wpa_cli:交互式调试利器

wpa_cli 是 wpa_supplicant 的配套工具。我调试时几乎离不开它:

# 进入交互模式
wpa_cli -i wlan0

> scan              # 触发扫描
> scan_results      # 查看扫描结果
> add_network       # 添加新网络(返回网络ID)
> set_network 0 ssid "MyWiFi"
> set_network 0 psk "mypass"
> enable_network 0  # 启用并连接
> status            # 查看连接状态
> save_config       # 保存配置到文件
> quit

为什么我推荐 wpa_cli?因为它能实时看到事件通知。比如你连不上时,它会直接告诉你 "4-Way Handshake failed"——比看日志快多了。

4.2 hostapd:让设备变身热点

hostapd 是 wpa_supplicant 的镜像工具。一个负责连网,一个负责建网。在 Tina Linux 里,做 Wi-Fi 热点或中继模式时必用。

我记得第一次配 hostapd 时,AP 死活起不来。后来发现是驱动没开 AP 模式支持——不是 hostapd 的问题,是内核配置的问题。

4.2.1 最小化配置

# /etc/hostapd.conf
interface=wlan0
driver=nl80211
ssid=TinaAP
hw_mode=g
channel=6
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

关键参数解读:

参数说明常见坑
hw_modea=5GHz, g=2.4GHz, b=2.4GHz芯片不支持5GHz时设a会失败
channel信道号,0表示自动某些国家码限制信道使用
wpa_passphrase密码,8-63字符少于8位直接报错
rsn_pairwise加密方式,CCMP是WPA2老设备可能只支持TKIP
启动命令: hostapd -B /etc/hostapd.conf。调试时去掉 -B,前台跑能看到实时日志。如果报 "nl80211: Could not configure driver mode",八成是驱动不支持 AP 模式。

4.3 iw:新一代无线配置工具

iw 是 iwconfig 的替代品,基于 nl80211。我强烈建议新项目直接用 iw,别碰 iwconfig 了。

4.3.1 常用操作

# 扫描周围AP(最常用)
iw dev wlan0 scan

# 查看连接状态
iw dev wlan0 link

# 查看接口信息
iw dev wlan0 info

# 设置信道(AP模式时用)
iw dev wlan0 set channel 6

# 查看支持的频段
iw phy phy0 channels

# 查看TX功率
iw dev wlan0 get power_save

我个人最常用的是 iw dev wlan0 link——它能直接告诉你信号强度、连接速率、认证方式。比 ifconfig 那点信息有用多了。

4.3.2 iw 与 iwconfig 对比

功能iwiwconfig
扫描iw dev wlan0 scaniwlist wlan0 scan
查看连接iw dev wlan0 linkiwconfig wlan0
设置信道iw dev wlan0 set channeliwconfig wlan0 channel
接口层nl80211wext(已废弃)
新特性支持完整有限
避坑: 有些老驱动只支持 wext,这时 iw 会报 "nl80211 not found"。解决办法是换 iwconfig,或者升级驱动。我在一块 RTL8188 芯片上遇到过这个问题。

4.4 ifconfig:网络接口配置老将

ifconfig 虽然老,但 Tina Linux 里依然广泛使用。它主要负责 IP 层配置,不涉及 Wi-Fi 细节。

# 启用接口
ifconfig wlan0 up

# 配置静态IP
ifconfig wlan0 192.168.1.100 netmask 255.255.255.0

# 查看接口状态
ifconfig wlan0

# 获取IP(配合udhcpc)
udhcpc -i wlan0

这里有个细节:ifconfig wlan0 up 只是让接口从软件层面启用,但 Wi-Fi 射频是否真正开启,取决于驱动和 wpa_supplicant 的状态。我见过有人 ifconfig up 后以为 Wi-Fi 已经开了,结果扫描全是空的——其实 wpa_supplicant 还没跑起来。

4.5 工具链协同工作流程

这几个工具不是各干各的。它们配合起来才能完成一次完整的 Wi-Fi 连接。我画了个流程图:

  1. ifconfig wlan0 up → 启用网络接口
  2. wpa_supplicant -B -i wlan0 → 启动连接管理守护进程
  3. wpa_supplicant 自动扫描 → 根据配置文件匹配已知网络
  4. wpa_supplicant 完成认证 → 4次握手,获取连接
  5. udhcpc -i wlan0 → 通过 DHCP 获取 IP 地址
  6. ifconfig wlan0 → 验证 IP 是否分配成功
  7. iw dev wlan0 link → 确认信号强度和连接质量
调试口诀: 先看接口有没有 up(ifconfig),再看 wpa_supplicant 有没有连上(wpa_cli status),最后看 IP 有没有拿到(ifconfig)。三步走,问题定位快。

4.6 我的调试工具箱

最后分享几个我常用的调试组合拳:

场景命令组合说明
扫描不到APiw dev wlan0 scan + dmesg看驱动有没有报错
连不上APwpa_cli status + wpa_supplicant -dd看握手阶段失败在哪
连上但没网ifconfig + route -n + ping检查IP和网关
热点起不来hostapd -dd + iw dev wlan0 info看模式是否支持AP
信号弱iw dev wlan0 link + iw dev wlan0 survey dump看信号强度和信道干扰

嗯,这套工具链说复杂也复杂,说简单也简单。核心就一句话:wpa_supplicant 管连接,hostapd 管热点,iw 管查看,ifconfig 管 IP。搞清楚了各自的分工,调试起来就顺手多了。