差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
digi:arm-embedded:linux:dey:wifi [2025/01/16 10:48] robindigi:arm-embedded:linux:dey:wifi [2025/02/21 12:21] (当前版本) robin
行 6: 行 6:
 在DEY系统上使用hostapd创建无线接入点,并通过udhcpd配置DHCP服务,实现WiFi热点的开启与IP地址的自动分配。这涉及到一些命令的使用,hostapd.conf和udhcpd.conf的配置方法,以及启动hostapd和udhcpd的步骤,本文将提供了无密码和加密模式的配置示例。 在DEY系统上使用hostapd创建无线接入点,并通过udhcpd配置DHCP服务,实现WiFi热点的开启与IP地址的自动分配。这涉及到一些命令的使用,hostapd.conf和udhcpd.conf的配置方法,以及启动hostapd和udhcpd的步骤,本文将提供了无密码和加密模式的配置示例。
  
-值得注意的是,由于是在配置文件中指定了信道,因此了解当前的信道情况可能有利于测试开展。在Linux中,可以用下面命令查询+值得注意的是,由于是在配置文件中指定了信道,因此了解当前的信道情况可能有利于测试开展。 
 + 
 +事实上,如果用原始的/etc/hostapd_uap0.conf,是无法成功的,但我们可以用调试模式来查看这配置的问题 
 +<code> 
 +hostapd -dd /etc/hostapd_uap0.conf 
 +</code> 
 +可以查看到WiFi硬件或驱动不支持在5GHz频段的channel=44(5220 MHz)上运行AP模式。 
 +NO-IR标志表示该频道不允许发起辐射(Initiate Radiation),即不能用作AP模式的主频道,通常是因为监管域限制或硬件能力限制。 
 + 
 +如果要设置国家,需要安装regulatory.db: 
 +wget https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/plain/regulatory.db -O /lib/firmware/regulatory.db 
 +wget https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/plain/regulatory.db.p7s -O /lib/firmware/regulatory.db.p7s 
 +并用: 
 +<code> 
 +iw reg reload 
 +iw reg set US 
 +iw reg get 
 +</code> 
 +否则全局域一样的DFS的 
 + 
 +在Linux中,可以用下面命令查询哪些信道干扰较小,可以用
  
 <code> <code>
行 32: 行 52:
 </code> </code>
  
 +另外,我们也需要知道WiFi模块支持哪些信道宽度
 +<code>
 +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 }
 +</code>
 +上面这个命令的输出说明支持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信道组合有三个,取首信道号:
 +<code>
 +36、40、44、48
 +52、56、60、64
 +149、153、157、161
 +</code>
 +在中国,可用的80MHz信道为36、52、149。其中,52、56、60、64信道需要避开,因为这些信道可能会与雷达信道冲突
 +
 +可以用下面这个脚本找出未被占用的80MHz频宽的信道,以达到最佳测试速度
 +<code>
 +#!/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[*]}"
 +</code>
 +
 +如果wifi网卡只支持20MHz的频宽,那么可以用这个脚本,同样专注于5G
 +<code>
 +#!/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[*]}"
 +
 +
 +</code>
 +
 +===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) 并重新启动设备。
 +
 +<code>
 +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
 +</code>
 +改了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频宽的配置为:
 +<code>
 +# 接口和驱动程序设置
 +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
 +</code>
 +其中关键的解析在:
 +<code>
 +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长度。
 +</code>
 +保存配置文件后,用sudo hostapd /etc/hostapd/hostapd.conf -B 启动hostapd
 +<code>
 +iw dev wlan0 info
 +</code>
 +
 +对于Wifi6 802.11ax, 可用这个配置
 +
 +<code>
 +# 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]
 +</code>
 +
 +在80MHz频宽模式下,信道52的中心频率段索引为58,是因为80MHz频宽模式需要使用两个20MHz信道来组成一个80MHz频宽。具体来说,信道52的80MHz频宽模式会使用信道52、56、60和64这四个20MHz信道。