DEY下的WiFi,可以配置为多种模式

普通模式

这个最简单,无需讲解

AP模式

在DEY系统上使用hostapd创建无线接入点,并通过udhcpd配置DHCP服务,实现WiFi热点的开启与IP地址的自动分配。这涉及到一些命令的使用,hostapd.conf和udhcpd.conf的配置方法,以及启动hostapd和udhcpd的步骤,本文将提供了无密码和加密模式的配置示例。

值得注意的是,由于是在配置文件中指定了信道,因此了解当前的信道情况可能有利于测试开展。在Linux中,可以用下面命令查询

iw dev wlan0 scan | grep -E 'freq:|SSID:|signal:|HT|VHT' | awk -v OFS="," '
    /freq:/ { freq=$2; }
    /SSID:/ { ssid=$2; gsub(/"/, "", ssid); }
    /signal:/ { signal=$2; }
    /HT|VHT/ { if ($0 ~ /VHT/) { wifi_type="ax"; } else { wifi_type="a/n/ac/ax"; } }
    /signal:/ && freq && ssid {
        if (freq >= 2412 && freq <= 2484) {
            chan=(freq - 2407) / 5;
            wifi_type="b/g/n";
        } else if (freq >= 5180 && freq <= 5825) {
            chan=(freq - 5000) / 5;
        } else {
            chan="N/A";
        }
        print chan, signal, ssid, freq, wifi_type;
        freq=ssid=signal=chan=wifi_type="";
    }
' | sort -t, -k2,2nr | awk -F, -v OFS="," '
    { print "Channel " $1 ", Signal: "$2 " dBm, " $3 ", "$4 " MHz, Type: " $5; }
'

另外,我们也需要知道WiFi模块支持哪些信道宽度

root@ccimx93-dvk:~# iw list | grep 'widths'
                   total <= 4, #channels <= 1, STA/AP BI must match, radar detect widths: { 20 MHz (no HT), 20 MHz, 40 MHz, 80 MHz }

上面这个命令的输出说明支持20 MHz,40 MHz,80 Mhz 这几种信道宽度。

在5GHz频段,80MHz信道的中心频率是从36号信道开始的。以下是一些推荐的80MHz信道中心频率:

信道号 36 40 44 48 52 56 60 64 149 153 157 161 165
中心频率 5180 MHz 5200 MHz 5220 MHz 5240 MHz 5260 MHz 5280 MHz 5300 MHz 5320 MHz 5745 MHz 5765 MHz 5785 MHz 5805 MHz 5825 MHz

80MHz信道组合有三个,取首信道号:

36、40、44、48
52、56、60、64
149、153、157、161

在中国,可用的80MHz信道为36、52、149。其中,52、56、60、64信道需要避开,因为这些信道可能会与雷达信道冲突

可以用下面这个脚本找出未被占用的80MHz频宽的信道,以达到最佳测试速度

#!/bin/bash

# 扫描附近的WiFi网络
scan_results=$(iw dev wlan0 scan | grep -E 'SSID:|freq:|signal:')

# 提取并格式化信息,过滤掉信号强度小于-85 dBm的信道
formatted_results=$(echo "$scan_results" | awk '
    /freq:/ { freq=$2 }
    /signal:/ { signal=$2 }
    /SSID:/ { ssid=$2;
              if (freq >= 5000 && freq < 6000) {
                  channel = int((freq - 5000) / 5);
                  if (signal >= -85) {
                      print "Freq: " freq, "Channel: " channel, "Signal: " signal, "SSID: " ssid
                  }
              }
            }
')

# 输出格式化后的信息
echo "$formatted_results"

# 定义5GHz频段的80MHz信道组合
declare -A channels=(
    [36]="36 40 44 48"
    [52]="52 56 60 64"
    [149]="149 153 157 161"
)

# 初始化未被占用的信道列表
unused_channels=()

# 检查每个80MHz信道组合是否被占用
for channel in "${!channels[@]}"; do
    sub_channels=(${channels[$channel]})
    occupied=false
    for sub_channel in "${sub_channels[@]}"; do
        sub_freq=$((5000 + sub_channel * 5))
        if echo "$formatted_results" | grep -q "Freq: $sub_freq"; then
            occupied=true
            break
        fi
    done
    if ! $occupied; then
        unused_channels+=("$channel")
    fi
done

# 输出未被占用的80MHz信道
echo "未被占用的5GHz 80MHz信道:${unused_channels[*]}"

如果wifi网卡只支持20MHz的频宽,那么可以用这个脚本,同样专注于5G

#!/bin/bash

# 扫描附近的WiFi网络
scan_results=$(iw dev wlan0 scan | grep -E 'SSID:|freq:|signal:')

# 提取并格式化信息,过滤掉信号强度小于-85 dBm的信道
formatted_results=$(echo "$scan_results" | awk '
    /freq:/ { freq=$2 }
    /signal:/ { signal=$2 }
    /SSID:/ { 
        ssid=$2; 
        if (freq >= 5000 && freq < 6000) {
            channel = (freq - 5000) / 5;
            if (signal >= -85) {
                print "Freq: " freq, "Channel: " channel, "Signal: " signal, "SSID: " ssid
            }
        }
    }
')

# 输出格式化后的信息
echo "$formatted_results"

# 定义5GHz频段的20MHz信道
declare -A channels=(
    [36]=5180 [40]=5200 [44]=5220 [48]=5240 [52]=5260 [56]=5280 [60]=5300 [64]=5320
    [100]=5500 [104]=5520 [108]=5540 [112]=5560 [116]=5580 [120]=5600 [124]=5620 [128]=5640 [132]=5660 [136]=5680 [140]=5700 [144]=5720
    [149]=5745 [153]=5765 [157]=5785 [161]=5805 [165]=5825
)

# 初始化未被占用的信道列表
unused_channels=()

# 检查每个20MHz信道是否被占用
for channel in "${!channels[@]}"; do
    freq=${channels[$channel]}
    if ! echo "$formatted_results" | grep -q "Freq: $freq"; then
        unused_channels+=("$channel")
    fi
done

# 输出未被占用的20MHz信道
echo "未被占用的5GHz 20MHz信道:${unused_channels[*]}"

hostapd.conf配置

Digi Embedded Yocto 使用 hostapd 包来管理软件接入点 (SoftAP) 模式。通过在 /etc/network/interfaces 中添加 uap0 条目,默认配置包括 SoftAP 模式。hostapd 守护程序在接口启动时启动,在接口关闭时停止。 默认情况下,uap0 接口处于禁用状态,以提高 wlan0 接口在客户端基础结构模式下的性能。

要开启AP模式,首先编辑文件 /etc/udev/scripts/load_iw612.sh 并指定驱动程序模式。一般可以配置 STA + AP + P2P 模式,请将 DRIVER_MODE 设置为 7 (b'111) 并重新启动设备。

head -n 8 /etc/udev/scripts/load_iw612.sh
#!/bin/sh

# The bit settings of drv_mode are:
#    Bit 0 :  STA
#    Bit 1 :  uAP
#    Bit 2 :  WIFIDIRECT
# eg, for STA + uAP + WIFIDIRECT, set 7 (b'111)
DRIVER_MODE=7  # Only STA

改了DRIVER_MODE后,用ifup uap0 来启动这个接口。 您还可以通过取消注释 /etc/network/interfaces 中的 “auto uap0” 行来启用自动启动。

Digi Embedded Yocto 提供了一种机制来支持每个 Wi-Fi 接口的不同配置文件,允许您同时运行多个 hostapd 实例。hostapd@.service systemd 服务会自动为每个接口选择适当的配置文件 /etc/hostapd_X.conf(其中 X 是传递给服务的接口)。

hostapd 软件包提供了一个默认配置文件 /etc/hostapd.conf 作为不同可用设置的参考。Digi Embedded Yocto 初始化脚本不使用此文件。

参考: https://www.digi.com/resources/documentation/digidocs/embedded/dey/4.0/cc93/bsp-wifi-access-pt_r_hostapd.html

通过AI查得52信道80MHz频宽的配置为:

# 接口和驱动程序设置
interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd

# 基本网络设置
ssid=TestAP
hw_mode=a
channel=52

# WPA身份验证设置
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=12345678

# HT(802.11n)
ieee80211n=1
ht_capab=[SHORT-GI-20][HT40-][SHORT-GI-40]

# VHT(802.11ac)
ieee80211ac=1
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=58
vht_capab=[SHORT-GI-20][SHORT-GI-40][VHT40-][SHORT-GI-80][MAX-A-MPDU-LEN-EXP7]

# 加密算法设置
wpa_pairwise=CCMP
rsn_pairwise=CCMP

其中关键的解析在:

HT(802.11n):
ieee80211n=1:启用802.11n支持。
ht_capab=[SHORT-GI-20][HT40-][SHORT-GI-40]:启用20MHz和40MHz的短GI,并设置为HT40-模式。
VHT(802.11ac):
ieee80211ac=1:启用802.11ac支持。
vht_oper_chwidth=1:设置信道宽度为80MHz。
vht_oper_centr_freq_seg0_idx=58:设置中心频率段0的索引为58。
vht_capab=[SHORT-GI-20][SHORT-GI-40][VHT40-][SHORT-GI-80][MAX-A-MPDU-LEN-EXP7]:启用20MHz、40MHz和80MHz的短GI,并设置最大A-MPDU长度。

保存配置文件后,用sudo hostapd /etc/hostapd/hostapd.conf -B 启动hostapd

iw dev wlan0 info

对于Wifi6 802.11ax, 可用这个配置

# VHT(802.11ac)
ieee80211ac=1
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=58
vht_capab=[SHORT-GI-20][SHORT-GI-40][VHT40+][SHORT-GI-80][MAX-A-MPDU-LEN-EXP7]

# HE(802.11ax)
ieee80211ax=1
he_oper_chwidth=1
he_oper_centr_freq_seg0_idx=58
he_capab=[MAX-AMSDU-3895][SHORT-GI-80][SU-BEAMFORMEE]

在80MHz频宽模式下,信道52的中心频率段索引为58,是因为80MHz频宽模式需要使用两个20MHz信道来组成一个80MHz频宽。具体来说,信道52的80MHz频宽模式会使用信道52、56、60和64这四个20MHz信道。