差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
digi:arm-embedded:linux:dey:wifi [2025/01/16 17:59] 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>
行 44: 行 64:
 | 中心频率 | 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 | | 中心频率 | 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频宽的信道,以达到最佳测试速度+80MHz信道组合有三个取首信道号:
 <code> <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 #!/bin/bash
  
行 56: 行 83:
     /freq:/ { freq=$2 }     /freq:/ { freq=$2 }
     /signal:/ { signal=$2 }     /signal:/ { signal=$2 }
-    /SSID:/ { ssid=$2;  +    /SSID:/ { ssid=$2; 
-              if (freq >= 2400 && freq < 3000) { +              if (freq >= 5000 && freq < 6000) { 
-                  channel = freq - 2407; +                  channel = int((freq - 5000) / 5)
-              } else if (freq >= 5000 && freq < 6000) { +                  if (signal >= -85) { 
-                  channel = (freq - 5000) / 5; +                      print "Freq: " freq, "Channel: " channel, "Signal: " signal, "SSID: " ssid 
-              } else { +                  }
-                  channel = "Unknown"; +
-              } +
-              if (signal >= -85) { +
-                  print "Freq: " freq, "Channel: " channel, "Signal: " signal, "SSID: " ssid+
               }               }
             }             }
行 73: 行 96:
 echo "$formatted_results" echo "$formatted_results"
  
-# 定义80MHz信道及其频率+# 定义5GHz频段的80MHz信道组合
 declare -A channels=( declare -A channels=(
-    [36]=5180 +    [36]="36 40 44 48" 
-    [40]=5200 +    [52]="52 56 60 64" 
-    [44]=5220 +    [149]="149 153 157 161"
-    [48]=5240 +
-    [52]=5260 +
-    [56]=5280 +
-    [60]=5300 +
-    [64]=5320 +
-    [149]=5745 +
-    [153]=5765 +
-    [157]=5785 +
-    [161]=5805 +
-    [165]=5825+
 ) )
  
行 93: 行 106:
 unused_channels=() unused_channels=()
  
-# 检查每个80MHz信道及其子信道是否被占用+# 检查每个80MHz信道组合是否被占用
 for channel in "${!channels[@]}"; do for channel in "${!channels[@]}"; do
-    freq=${channels[$channel]} +    sub_channels=(${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     occupied=false
     for sub_channel in "${sub_channels[@]}"; do     for sub_channel in "${sub_channels[@]}"; do
-        sub_freq=${channels[$sub_channel]}+        sub_freq=$((5000 + sub_channel * 5))
         if echo "$formatted_results" | grep -q "Freq: $sub_freq"; then         if echo "$formatted_results" | grep -q "Freq: $sub_freq"; then
             occupied=true             occupied=true
行 122: 行 117:
         fi         fi
     done     done
- 
     if ! $occupied; then     if ! $occupied; then
         unused_channels+=("$channel")         unused_channels+=("$channel")
行 129: 行 123:
  
 # 输出未被占用的80MHz信道 # 输出未被占用的80MHz信道
-echo "未被占用的80MHz信道:${unused_channels[*]}"+echo "未被占用的5GHz 80MHz信道:${unused_channels[*]}"
 </code> </code>
  
行 180: 行 174:
  
 </code> </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信道。