用RTL8821CU的USB WiFi给Armbian系统的NanoPi R2S添加热点功能
NanoPi R2S没有板载WiFi,且只有一个USB接口,另外正好有个空闲的使用RTL8821CU的USB WiFi,可以用来给NanoPi R2S添加热点功能。
系统为基于Debian 10的Armbian,内核版本为5.10.63,理论上其他相似系统也能使用(如树莓派的Raspberry OS,或安装Debian的PC)。
首先安装编译和安装RTL8821CU的驱动(注:5.15以后内核版本的Armbian可能已集成了8821cu模块,可以在/lib/modules中运行find -name 8821cu*命令进行确认),过程可参考使用树莓派用作无线网关。对于Armbian来说,由于与Debian更为接近,无需备份系统文件,直接make后以root权限make install即可。另外如果需要创建AP,modprobe时需要增加rtw_vht_enable=2参数,以使用宽通信频带,否则802.11ac的RTL8821无法支持80MHz以实现433Mbps的通信速率。
在Armbian系统的Nano Pi R2S下,该部分步骤整理如下:
# 安装软件包(需要root)
apt-get update
apt-get install build-essential make gcc bc git usb-modeswitch hostapd
# 获取RTL8821Cu的驱动源码
git clone https://github.com/brektrou/rtl8821CU.git
# 编译和安装(make install需要root)
cd rtl8821CU
make -j2
make install
# 安装模块
modprobe 8821cu rtw_vht_enable=2
# rtw_vht_enable=2表示强制启用宽频模式
如果购买的USB WiFi不带有安装驱动盘(即插上Windows系统的电脑后,在没有安装驱动的情况下会显示为一个存储器,里面存放有WiFi驱动,安装完驱动后存储器消失、WiFi开始工作),则无需安装usb-modeswitch,否则需要安装该软件包并配置模式切换。
建立/etc/udev/rules.d/44-Realtek-8821CU.rules文件,填入以下内容:
ACTION!="add|change", GOTO="realtek_modeswitch_rules_end"
# Realtek 8821CU quirk, configuration in /etc/usb_modeswitch.d/0bda:1a2b
ATTR{idVendor}=="0bda", ATTR{idProduct}=="1a2b", RUN+="usb_modeswitch '/%k'"
LABEL="realtek_modeswitch_rules_end"
建立/etc/usb_modeswitch.d/0bda:1a2b文件,填入以下内容:
# Realtek RTL8821CU
TargetVendor=0x0bda
TargetProduct=0xc820
StandardEject=1
这样就能够将ID为0bda:1a2b的存储器设备转换为ID为0bda:c820的USB WiFi设备。之后插上USB WiFi,通过ip addr命令就能看到WiFi设备的interface了。
之后编写hostapd的配置文件,用于启动热点。编辑/etc/hostapd/hostapd.conf文件:
# RTL8821CU
interface=wlx123456789abcdef
driver=nl80211
ssid=NanoPiR2S_AP
hw_mode=a
ieee80211n=1
ieee80211h=1
ieee80211d=1
#country_code=US
channel=36
vht_oper_centr_freq_seg0_idx=42
vht_oper_chwidth=2
ht_capab=[HT40+]
wpa=3 # WPA+WPA2
wpa_passphrase=YourPassword
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wmm_enabled=1
其中,interface=wlx123456789abcdef右侧需要改成WiFi设备实际的interface,ssid和wpa_passphrase分别为WiFi名和密码,country_code、channel、vht_oper_centr_freq_seg0_idx在不能正常启动的情况下可按情况修改(不同地区的允许的频段不同,可能导致购买到的WiFi模块支持的频段不同)。
可以针对该网卡建一个service文件,实现开机自动启动AP。编辑/etc/systemd/system/hostapd_rtl8821cu.service文件:
[Unit]
Description=Hostapd Service
After=network.target syslog.target
[Service]
Type=simple
Restart=on-failure
RestartSec=90
ExecStartPre=/usr/sbin/modprobe 8821cu rtw_vht_enable=2
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target
之后运行和设置开机自动运行:
systemctl start hostapd_rtl8821cu
systemctl enable hostapd_rtl8821cu
此时,已经可以连接到该热点了,但是由于没有DHCP服务器,连接上的设备获取不到IP地址。
我的NanoPi R2S的lan口已经配置好了网桥和使用dnsmasq实现的DHCP服务,以及网口的NAT功能,具体过程可参考在NanoPiR2S上通过虚拟机使用单网口双宽带中的将Armbian固件的R2S配置为路由器部分。在本例子中,WiFi需要桥接到lan网口,假设网桥为vmbr1,将interface加入该网桥的命令为:
brctl addif vmbr1 wlx123456789abcdef
该命令可以添加到/etc/systemd/system/hostapd_rtl8821cu.service中,即添加ExecStartPost行,实现启动服务后自动将interface加入到网桥中:
ExecStartPost=/usr/sbin/brctl addif vmbr1 wlx123456789abcdef
至此,其他设备就可以连接该AP正常使用网络了。如果hostapd工作正常,无线模块应当工作在80MHz频宽下,有433Mbps的信道速度(由于USB2.0和无线网卡的性能问题,通过iperf3实测速度为200Mbps左右)。