WIFI设置STA+AP模式
需求:
WIFI需要同时连接指定网络和持续对外发送广播,广播要求位于信道6、2.4GHz下
一、查看WIFI支持模式
不同的wifi芯片支持的配置组合是不同的,因此需要使用 iw 命令查看支持的模式
运行以下命令,重点关注输出中的几个部分:
sudo iw phy phy0 info
这条命令会输出非常详细的信息,你需要关注以下几个关键部分:
| 查找的关键字段 | 它告诉你什么 | 如何解读 |
|---|---|---|
Supported interface modes: |
核心信息。列出了网卡硬件支持创建哪些类型的虚拟接口。 | 这是最重要的部分。如果你看到 AP 或 __ap ,就说明支持创建接入点(虚拟AP)。managed是普通客户端,monitor是监控模式。 |
valid interface combinations: |
组合限制。说明了可以同时创建哪些类型的接口以及它们的数量、信道限制。 | 根据之前的对话,你的输出里有 #channels <= 1,这解释了为什么 wlan0 和 wlan0_ap 必须在同一个信道。 |
Band 1: 和 Band 2: |
支持的频段。分别代表2.4GHz和5GHz频段的能力。 | 可以查看每个频段支持的信道、最大速率等信息。 |
undefined
valid interface combinations:
* #{ managed } <= 1, #{ P2P-device } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 2
* #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
total <= 4, #channels <= 1
Frequencies:
* 2412 MHz [1] (20.0 dBm)
* 2417 MHz [2] (20.0 dBm)
* 2422 MHz [3] (20.0 dBm)
* 2427 MHz [4] (20.0 dBm)
* 2432 MHz [5] (20.0 dBm)
* 2437 MHz [6] (20.0 dBm)
* 2442 MHz [7] (20.0 dBm)
* 2447 MHz [8] (20.0 dBm)
* 2452 MHz [9] (20.0 dBm)
* 2457 MHz [10] (20.0 dBm)
* 2462 MHz [11] (20.0 dBm)
* 2467 MHz [12] (20.0 dBm)
* 2472 MHz [13] (20.0 dBm)
* 2484 MHz [14] (20.0 dBm)
因此,可见硬件支持STA+AP模式,但是配置AP模式时,总体channels要 <= 1,即虚拟出的STA和AP的只能位于同一个channel
二、查看、配置WLAN
undefined
root@firefly:~# iw dev wlan0 info
Interface wlan0
ifindex 3
wdev 0x1
addr 40:d9:5a:8b:52:d4
type managed
wiphy 0
channel 1 (2412 MHz), width: 20 MHz, center1: 2412 MHz
txpower 31.00 dBm
配置:
undefined
root@firefly:~# iw phy phy0 interface add wlan0_ap type __ap
root@firefly:~#
配置后查看:
undefined
root@firefly:~# iw dev
phy#0
Interface wlan0_ap
ifindex 6
wdev 0x3
addr 40:d9:5a:8b:52:d4
type AP
channel 1 (2412 MHz), width: 20 MHz, center1: 2412 MHz
txpower 31.00 dBm
Unnamed/non-netdev interface
wdev 0x2
addr 42:d9:5a:8b:52:d4
type P2P-device
txpower 31.00 dBm
Interface wlan0
ifindex 3
wdev 0x1
addr 40:d9:5a:8b:52:d4
type managed
channel 1 (2412 MHz), width: 20 MHz, center1: 2412 MHz
txpower 31.00 dBm
三、测试
测试一边用wlan0连接wifi上网,一边通过wlan0_ap发射广播数据
1、连接STA
undefined
#!/bin/bash
# 核心WiFi连接脚本
SSID="YOUR_SSID"
PASSWORD="YOUR_PASSWORD"
INTERFACE="wlan0"
# 1. 生成配置并连接
wpa_passphrase "$SSID" "$PASSWORD" | sudo tee /etc/wpa_supplicant.conf > /dev/null
sudo wpa_supplicant -i $INTERFACE -c /etc/wpa_supplicant.conf -B
# 2. 获取IP
sudo dhclient $INTERFACE
# 3. 验证
echo "连接状态:"
iw dev $INTERFACE link | grep "SSID:"
连接后状态:
undefined
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.196 netmask 255.255.255.0 broadcast 192.168.200.255
ether 40:d9:5a:8b:52:d4 txqueuelen 1000 (Ethernet)
RX packets 220 bytes 36049 (36.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 128 bytes 11822 (11.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
网络连通性:
undefined
root@firefly:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=107 time=239 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=107 time=238 ms
2、AP发射
hostapd配置:
undefined
root@firefly:/usr/dkkj/source/remote_id/lnc-rid# cat hostapd_rid.conf
ctrl_interface=/var/run/hostapd
interface=wlan0_ap
driver=nl80211
hw_mode=g
channel=6
ssid=AP-TEST
wpa=2
wpa_passphrase=abc12345
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP TKIP
wpa_pairwise=TKIP CCMP
wireshark抓包

同时,两者的状态:
undefined
root@firefly:/usr/dkkj/source/remote_id/lnc-rid# iw dev
phy#0
Unnamed/non-netdev interface
wdev 0x4
addr 42:d9:5a:8b:52:d4
type P2P-device
txpower 31.00 dBm
Interface wlan0_ap
ifindex 6
wdev 0x3
addr 5e:be:22:04:ca:45
ssid AP-TEST
type AP
channel 6 (2437 MHz), width: 20 MHz, center1: 2437 MHz
txpower 31.00 dBm
Interface wlan0
ifindex 3
wdev 0x1
addr 40:d9:5a:8b:52:d4
ssid DKKJ_SH
type managed
channel 6 (2437 MHz), width: 20 MHz, center1: 2437 MHz
txpower 31.00 dBm