这是本文档旧的修订版!


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频宽的信道,以达到最佳测试速度

#!/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 >= 2400 && freq < 3000) {
                  channel = freq - 2407;
              } else if (freq >= 5000 && freq < 6000) {
                  channel = (freq - 5000) / 5;
              } else {
                  channel = "Unknown";
              }
              if (signal >= -85) {
                  print "Freq: " freq, "Channel: " channel, "Signal: " signal, "SSID: " ssid
              }
            }
')

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

# 定义80MHz信道及其频率
declare -A channels=(
    [36]=5180
    [40]=5200
    [44]=5220
    [48]=5240
    [52]=5260
    [56]=5280
    [60]=5300
    [64]=5320
    [149]=5745
    [153]=5765
    [157]=5785
    [161]=5805
    [165]=5825
)

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

# 检查每个80MHz信道及其子信道是否被占用
for channel in "${!channels[@]}"; do
    freq=${channels[$channel]}
    sub_channels=()
    case $channel in
        36) sub_channels=(36 40 44 48);;
        40) sub_channels=(36 40 44 48);;
        44) sub_channels=(36 40 44 48);;
        48) sub_channels=(36 40 44 48);;
        52) sub_channels=(52 56 60 64);;
        56) sub_channels=(52 56 60 64);;
        60) sub_channels=(52 56 60 64);;
        64) sub_channels=(52 56 60 64);;
        149) sub_channels=(149 153 157 161);;
        153) sub_channels=(149 153 157 161);;
        157) sub_channels=(149 153 157 161);;
        161) sub_channels=(149 153 157 161);;
        165) sub_channels=(165);; # 165是独立信道
    esac

    # 检查子信道是否被占用
    occupied=false
    for sub_channel in "${sub_channels[@]}"; do
        sub_freq=${channels[$sub_channel]}
        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 "未被占用的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[*]}"