前言
树莓派 Wi-Fi 的配置过程虽然不难,但是很容易踩坑,尤其是在客户端模式和热点模式之间切换的时候。这些坑我大抵踩过一遍了,本文将介绍一下最简的、无需额外依赖或脚本的、可随时切换(仅需重启一次)的配置流程。
可能有人和我一样,担心万一无线连接配置出了问题,将无法通过网络管理树莓派。首先下文的流程已经在树莓派 Zero W 上时机测试过,按照这个流程来就没问题。不过最好还是做好无线连接失败的准备,对于有 RJ45 网口的树莓派只要连上网线即可,或者你和我一样使用树莓派 Zero W 这样没有 RJ45 网口的型号,那么用一个 OTG 转换器,连上手机并开启 USB 网络共享,或者连接一个 USB 有线网卡即可。实在不行的话,把树莓派上的 Micro SD 拔下来挂在到其他设备上,编辑配置文件及 /etc/rc.local 总能解决问题了吧。
热点(AP/Master)模式
我们将配置一个在 2.4 GHz 频段广播的、需要密码认证的热点。注意,它不包括互联网访问功能,也就是说连接上的设备只能访问树莓派本身以及局域网内的其他设备。如果你需要让连接的设备能访问公网,我暂时没找到可以通过无线网卡转发的方式,即手机上的“通过热点共享已连接 Wi-Fi”的功能;因此,只能通过有线网卡转发,网上有教程,本文不涉及此内容。
初始配置
hostapd
hostapd 是无线接入点的守护进程,我们可以通过 APT 安装:
sudo apt install hostapd
安装完成后,编辑配置文件 /etc/hostapd/hostapd.conf。这里我们将简单配置一个,内容如下:
# 网卡选择,使用默认的 wlan0。
interface=wlan0
# 地区代码,用于确保使用频段遵守所在地区的无线电法规,这里请依照你所在的地区设定。
country_code=CN
# 模式选择,这里我们选择 802.11g 即可,它工作于 2.4 GHz 频段。
hw_mode=g
# 信道选择,范围在 1~14 之间。
# 不同设备支持的信道可能有所不同,例如在中国请在考虑设备兼容性和相关规定后再选择 13、14 信道。
channel=6
# SSID,即接入点的名称。随意设置。
ssid=<AccessPointName>
# WPA 版本,此处设定为 2。
# 我们此处省略了 auth_algs=1 这个配置项,它用于选择安全类型,看起来无需额外指定。
wpa=2
# 密钥协商方式,这里我们设置为最常见的预共享密钥(PSK)。
wpa_key_mgmt=WPA-PSK
# 大概也是具体的协商方式,这里我们设置成 CCMP。
wpa_pairwise=CCMP
# WPA 密钥,即接入点密码,自行设置。
wpa_passphrase=<AccessPointPassword>
一些额外的设置,可省略:
# 不广播 SSID,这里我们禁用此功能。如果想要隐藏此网络,将其设置为 1。
ignore_broadcast_ssid=0
dnsmasq
dnsmasq 用于提供 DHCP 和 DNS 服务。同样使用 APT 安装:
sudo apt install dnsmasq
编辑配置文件 /etc/dnsmasq.conf:
# 网卡选择,同上。
interface=wlan0
# DHCP 设置,四个以逗号分隔的值分别为分配起始地址、终止地址、子网掩码、地址租期。
dhcp-range=192.168.10.10,192.168.10.100,255.255.255.0,24h
这里我们没有配置 DNS 服务,因为没有配置互联网连接。另外,借助 dnsmasq 还可以实现强制门户认证(Captive Portal),本文不涉及。
启动
启动前,我们需要编辑 /etc/dhcpcd.conf 来给树莓派分配静态地址,并在其中禁用 wpa_supplicant。在末尾添加(或去除注释符号)以下内容:
interface wlan0
static ip_address=192.168.10.1/24
nohook wpa_supplicant
192.168.10.0/24 这个网段自然也可以自定义,不过记得同时修改 dnsmasq 中的相关配置。
启用 AP 依赖的服务:
sudo systemctl enable hostapd dnsmasq
重启树莓派:
sudo reboot
如果一切正常,热点应该就启用了,可以执行 iwconfig wlan0 查看网卡状态,应该会显示类似的内容如下:
wlan0 IEEE 802.11 Mode:Master Tx-Power=31 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
不过发射功率并没有随之前设定的地区改变... 在中国,理论上根据相关规定来说,2.4 GHz Wi-Fi 最大发射功率不应超过 20 dBm,不过这也无关紧要 (谁会在乎这些?)。
客户端(Managed)模式
这个步骤中我们将接入其他的使用密码认证的无线局域网,即认证方式为 WPA/WPA2 PSK。WPA2 Enterprise 之类网络的连接,本文不涉及。
配置 wpa_supplicant
wpa_supplicant 用于配置 Wi-Fi 连接,Raspberry Pi OS 中内置了该工具。这里我们直接编辑 /etc/wpa_supplicant/wpa_supplicant.conf:
# 地区代码,与 hostapd 配置类似。
country=CN
# 控制 Socket 路径与用户组。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
# 是否允许 wpa_cli 更改配置,这里允许即可。
update_config=1
# 网络配置块,可以编写多个 network 块以配置多个网络。
network={
# 接入点名称,可以直接输入中文。
ssid="<AccessPointName>"
# 网络密钥。
psk="<AccessPointPassword>"
# 优先级排序,有多个可用网络时会优先连接到数字大的那个。
priority=1
}
启动
禁用与热点相关的服务,这不会立即导致热点停用,而是在重启后生效:
sudo systemctl disable hostapd dnsmasq
去除(或注释掉)/etc/dhcpcd.conf 中与热点配置相关的内容:
interface wlan0
static ip_address=192.168.10.1/24
nohook wpa_supplicant
确保 wpa_supplicant 开机自启,并尝试启动:
sudo systemctl enable wpa_supplicant
sudo systemctl restart wpa_supplicant
再次检查一遍 wpa_supplicant 的配置,若配置有误你将无法通过无线方式连接到树莓派。然后重启树莓派:
sudo reboot
如果一切正常,你将可以在无线路由器后台看到树莓派已成功连接。连接到树莓派后执行 iwconfig wlan0 会显示类似的内容:
wlan0 IEEE 802.11 ESSID:"<网络名称>"
Mode:Managed Frequency:<频段> Access Point: <AP 的 MAC 地址>
Bit Rate=<连接速率> Tx-Power=<发射功率>
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
Link Quality=70/70 Signal level=<接收信号强度>
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:1 Invalid misc:0 Missed beacon:0
模式切换
切换过程很简单,不需要修改网卡设置之类的,服务会自动完成网卡配置。由于我们已经完成两个模式的配置,在切换时只需要执行上文对应的“启动”的流程即可。