默认分类

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 客户端

通过重命名 udhcpcwan_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 enable

WiFi 流程完成后关闭红灯

创建 /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 会再次关闭。

回复

This is just a placeholder img.