AP 模式下关闭 DHCP 客户端,并使用 reset 按钮控制 WiFi 开关
这篇记录整理一次 AP 模式配置过程:关闭设备自身的 DHCP 客户端,设置 br-lan 固定地址,并让 WiFi 默认关闭,只有按住 reset 按钮时才临时开启 5G WiFi。这样设备平时可以保持安静状态,需要连接维护时再手动打开无线。
配置目标
最终效果如下:
- 设备工作在 AP/桥接使用场景
br-lan使用固定地址192.168.2.254/24- 关闭 DHCP 客户端,避免自动获取上级网络地址
- WiFi 默认关闭
- 按住 reset 按钮时开启 5G WiFi
- 松开 reset 按钮后关闭 5G WiFi
- 红灯用于提示启动过程和按钮触发状态
挂载根分区并修改密码
先挂载根分区为可写:
mount_root下面示例把 root 密码设置为 1:
printf '%s\n%s\n' '1' '1' | passwd root关闭 WiFi 默认射频
关闭 2.4G 和 5G 的默认射频开关,让 WiFi 不在开机后自动开启:
sed -i 's/^RadioEnable=.*/RadioEnable=0/' /etc/wireless/mediatek/mt7981.dbdc.b0.dat
sed -i 's/^RadioEnable=.*/RadioEnable=0/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat调整 5G WiFi 参数
这里以 5G 配置文件 mt7981.dbdc.b1.dat 为例,手动指定信道并关闭部分节能和 MU 相关功能:
sed -i 's/^Channel=.*/Channel=161/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
sed -i 's/^AutoChannelSelect=.*/AutoChannelSelect=0/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
sed -i 's/^HT_BW=.*/HT_BW=1/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
sed -i 's/^VHT_BW=.*/VHT_BW=2/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
sed -i 's/^TxPower=.*/TxPower=100/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
sed -i 's/^TWTSupport=.*/TWTSupport=0/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
sed -i 's/^MuMimoDlEnable=.*/MuMimoDlEnable=0/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
sed -i 's/^MuMimoUlEnable=.*/MuMimoUlEnable=0/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
sed -i 's/^MuOfdmaDlEnable=.*/MuOfdmaDlEnable=0/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
sed -i 's/^MuOfdmaUlEnable=.*/MuOfdmaUlEnable=0/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat
/sbin/wifi reload如果需要降低发射功率,可以把 TxPower=100 调整为较小值,例如:
sed -i 's/^TxPower=.*/TxPower=4/' /etc/wireless/mediatek/mt7981.dbdc.b1.dat关闭 DHCP 客户端
通过重命名 udhcpc 和 wan_type_probe,避免系统继续自动启动 DHCP 客户端或 WAN 类型探测:
mv /sbin/udhcpc /sbin/udhcpcbak
cd /usr/bin
mv wan_type_probe wan_type_probebak配置 rc.local
写入 /etc/rc.local,开机后清理缓存、启动 telnet,并给 br-lan 添加固定 IP:
cat > /etc/rc.local <<'EOF'
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
echo 3 > /proc/sys/vm/drop_caches
busybox telnetd -l sh &
ip addr add dev br-lan 192.168.2.254/24
exit 0
EOF
chmod +x /etc/rc.local关闭系统原生灯控
为了后续由自定义脚本控制红灯,先关闭系统自带的灯控服务:
/etc/init.d/led disable
/etc/init.d/led stop
/etc/init.d/led_mgr disable
/etc/init.d/led_mgr stop开机过程中红灯闪烁
创建 /etc/init.d/boot-redled-blink:
cat > /etc/init.d/boot-redled-blink <<'EOF'
#!/bin/sh /etc/rc.common
START=02
start() {
LED_PATH="/sys/class/leds/redled/brightness"
PID_FILE="/tmp/boot_redled_blink.pid"
echo none > /sys/class/leds/redled/trigger 2>/dev/null
(
while true; do
echo 1 > "$LED_PATH" 2>/dev/null
sleep 1
echo 0 > "$LED_PATH" 2>/dev/null
sleep 1
done
) &
echo $! > "$PID_FILE"
}
EOF
chmod +x /etc/init.d/boot-redled-blink
/etc/init.d/boot-redled-blink enableWiFi 流程完成后关闭红灯
创建 /etc/init.d/boot-redled-off,等待 MTK WiFi 流程结束后停止闪烁:
cat > /etc/init.d/boot-redled-off <<'EOF'
#!/bin/sh /etc/rc.common
START=99
start() {
LED_PATH="/sys/class/leds/redled/brightness"
PID_FILE="/tmp/boot_redled_blink.pid"
for i in $(seq 1 180); do
if dmesg | grep -q "br-lan: port .*rax0.*entered disabled state"; then
echo "Boot: MTK WiFi rax0 finished, stop blinking" > /dev/console
break
fi
sleep 1
done
if [ -f "$PID_FILE" ]; then
kill "$(cat "$PID_FILE")" 2>/dev/null
rm -f "$PID_FILE"
fi
echo none > /sys/class/leds/redled/trigger 2>/dev/null
echo 0 > "$LED_PATH" 2>/dev/null
exit 0
}
EOF
chmod +x /etc/init.d/boot-redled-off
/etc/init.d/boot-redled-off enable使用 reset 按钮控制 5G WiFi
创建 /etc/rc.button/reset。按下按钮时开启 rax0 并加入 br-lan,松开后关闭射频:
cat > /etc/rc.button/reset <<'EOF'
#!/bin/sh
WIFI_5G="rax0"
BR_DEV="br-lan"
LED_PATH="/sys/class/leds/redled/brightness"
is_button_still_pressed() {
if cat /sys/kernel/debug/gpio | grep "reset" | grep -q "lo"; then
return 0
else
return 1
fi
}
case "$ACTION" in
pressed)
ifconfig "$WIFI_5G" up
iwpriv "$WIFI_5G" set RadioOn=1
if ! brctl show "$BR_DEV" | grep -q "$WIFI_5G"; then
brctl addif "$BR_DEV" "$WIFI_5G"
fi
echo 1 > "$LED_PATH" 2>/dev/null
echo "WiFi Radio ON (Instant)" > /dev/console
;;
released)
sleep 1
if is_button_still_pressed; then
echo "Jitter detected, keeping Radio ON" > /dev/console
exit 0
fi
iwpriv "$WIFI_5G" set RadioOn=0
echo 0 > "$LED_PATH" 2>/dev/null
echo "WiFi Radio OFF (Silent)" > /dev/console
;;
esac
exit 0
EOF
chmod +x /etc/rc.button/reset重启生效
全部配置完成后重启设备:
reboot重启后,设备会使用固定地址 192.168.2.254/24,WiFi 默认关闭。需要临时开启无线时按住 reset 按钮,松开后 WiFi 会再次关闭。