【腳本】WifiToggle - 以 Reset/WPS/QSS 按鈕當作無線開關 - PCZONE 討論區

返回   PCZONE 討論區 > ▲ ADSL_CABLE_FTTH 寬 頻 上 網 討 論 > -- 無 線 網 路 版


PCZONE 討論區



通知

-- 無 線 網 路 版 無線網路是未來幾年內最熱門的話題,歡迎分享無線網路的使用心得或軟硬體問題討論。

FYI
會員
【腳本】WifiToggle - 以 Reset/WPS/QSS 按鈕當作無線開關
曾經有網友詢問支援硬體無線開關的無線分享器, 小弟約略在網購找了一下, EDIMAX & SMC & ZyXEL & LevelOne 等把硬體無線開關設計成On/Off, Buffalo 則是On/Off/Auto, 此外還有某些品牌支援定時 (排程) 功能, 雖然軟體開關或定時也可以達到控制無線訊號的目的, 但有時還是不如硬體開關來得方便, 然而並非每台分享器都有此設計, 於是小弟參考OpenWrt 的教學文章, 提供網友以利用率較低的Reset/WPS/QSS 等按鈕當作無線開關, 並且根據按下的時間長短產生不同的作用

首先, 請準備一台OpenWrt/X-Wrt/Gargoyle 所支援的無線分享器, 並將韌體更換成Kamikaze 8.09.2 (Gargoyle 1.2) 或Backfire 10.03.1 (Gargoyle 1.3), 若是安裝Trunk 版, 則請先檢查是否已安裝kmod-button-hotplug 套件:
語法:
root@OpenWrt:~# opkg list_installed | grep button
kmod-button-hotplug
若未安裝, 則請執行:
語法:
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install kmod-button-hotplug
以上透過LuCI/X-Wrt 等WebGUI 操作較為簡便

接著找出Reset/WPS/QSS 等按鈕的內部代碼, 請編輯 /etc/hotplug.d/button/01-log-button-actions:
語法:
#!/bin/sh
logger "'$BUTTON' was '$ACTION' for $SEEN seconds"
執行 "logread -f", 再按各個按鈕並觀察結果:
語法:
root@OpenWrt:~# logread -f
Mar 15 21:39:37 OpenWrt user.notice root: 'reset' was 'pressed' for 0 seconds
Mar 15 21:39:38 OpenWrt user.notice root: 'reset' was 'released' for 1 seconds
Mar 15 21:39:40 OpenWrt user.notice root: 'reset' was 'pressed' for 0 seconds
Mar 15 21:39:42 OpenWrt user.notice root: 'reset' was 'released' for 2 seconds
由以上可知 '$SEEN' 只和 'released' 有關, 和 'pressed' 無關, 撰寫Hotplug 腳本和修改 /etc/config/system 時請留意這點
語法:
$BUTTON = [reset|wps|QSS] (僅供參考)
$ACTION = [pressed|released]
$SEEN = [button pressed till released] 單位為秒, 小數以下不計
找出按鈕代碼之後, 請編輯 /etc/hotplug.d/button/00-button:
語法:
. /etc/functions.sh
do_button () {
	local button
	local action
	local handler
	local min
	local max

	config_get button "$1" button
	config_get action "$1" action
	config_get handler "$1" handler
	config_get min "$1" min
	config_get max "$1" max

	[ "$ACTION" = "$action" -a "$BUTTON" = "$button" -a -n "$handler" ] && {
		if [ -z "$min" ]; then
			[ -z "$max" -o "$max" -ge $SEEN ] && eval $handler
		elif [ -z "$max" ]; then
			[ $min -le $SEEN ] && eval $handler
		else
			[ $min -le $SEEN -a $max -ge $SEEN ] && eval $handler
		fi
	}
}

#logger "'$BUTTON' was '$ACTION' for $SEEN seconds"
config_load system
config_foreach do_button button
編輯 /etc/config/system: (定義按鈕作用)
語法:
config 'button' 'woggle'
	option 'button' 'reset'
	option 'action' 'released'
	option 'handler' '/sbin/woggle'
	option 'min' '0'
	option 'max' '1'

config 'button' 'reset'
	option 'button' 'reset'
	option 'action' 'released'
	option 'handler' 'firstboot && reboot'
	option 'min' '30'
	option 'max' '60'
以上作用為:
語法:
按下 reset 0-1 秒, 則開啟或關閉無線 (執行 /sbin/woggle)
按下 reset 30-60 秒, 則恢復OpenWrt 預設值 (執行 firstboot && reboot)
請特別留意, 若以 "按下 (pressed)" 按鈕為條件, 則只有當 "min = 0" 之時才會執行 "handler" 的內容

雖然開關無線只需執行 "wifi up" 或 "wifi down", 然而針對不同硬體, 有時可能還需要其他特殊處置, 或者以燈號顯示無線狀態, 所以以下將適用於FON2201 (Kamikaze/Atheros) 和ASUS WL-HDD2.5 (Backfire/brcm47xx) 的腳本分開處理, 另請留意不同韌體版本 (Backfire/Kamikaze, ar71xx/atheros/brcm-2.4/brcm47xx) 可能需要採用不同語法, 請自行研究

FON2201 (Kamikaze/atheros):
語法:
啟用無線, 則WLAN LED 顯示綠色 (GPIO 2)
關閉無線, 則WLAN LED 顯示橙色 (GPIO 1, FON2100 & FON2200 不適用)
編輯 /sbin/woggle:
語法:
#!/bin/sh
wlanled_off () {
	/usr/bin/gpioctl dirout 2 > /dev/null
	/usr/bin/gpioctl clear 2 > /dev/null
	/usr/bin/gpioctl dirout 1 > /dev/null	#for FON2201/FON2202
	/usr/bin/gpioctl set 1 > /dev/null	#for FON2201/FON2202
}

if [ -d /var/run/hostapd-ath0 -o -d /var/run/hostapd-ath1 ]; then
	if [ -z "$1" ]; then
		/usr/bin/logger "WifiToggle: WiFi down"
		/sbin/wifi down
		wlanled_off
	fi
elif [ "$1" = led ]; then
	wlanled_off	
else
	/usr/bin/logger "WifiToggle: WiFi up"
	/usr/bin/gpioctl dirout 1 > /dev/null	#for FON2201/FON2202
	/usr/bin/gpioctl clear 1 > /dev/null	#for FON2201/FON2202
	/sbin/uci set wireless.wifi0.disabled=0
	/sbin/wifi up
	/sbin/uci revert wireless.wifi0.disabled
fi
ASUS WL-HDD2.5 (Backfire/brcm47xx):
語法:
啟用無線, 則PWR LED (/proc/diag/led/power) 恆亮 (1)
關閉無線, 則PWR LED (/proc/diag/led/power) 閃爍 (f)
編輯 /sbin/woggle:
語法:
#!/bin/sh
. /etc/diag.sh
if [ -d /var/run/hostapd-phy0 -o -d /var/run/hostapd-phy1 ]; then
	if [ -z "$1" ]; then
		/usr/bin/logger "WifiToggle: WiFi down"
		/sbin/wifi down
		set_led power f
	fi
elif [ "$1" = led ]; then
	set_led power f
else
	/usr/bin/logger "WifiToggle: WiFi up"
	set_led power 1
	/sbin/uci set wireless.radio0.disabled=0
	/sbin/wifi up
	/sbin/uci set wireless.radio0.disabled=1
fi
儲存後再把 /sbin/woggle 設定為可執行:
語法:
root@OpenWrt:~# chmod +x /sbin/woggle
以上除了可以透過按鈕開關無線之外, 直接執行 "woggle" 也可以開關無線

如果網友和小弟一樣, AP 開機時預設不啟用無線, 那麼還需於AP 開機之後以燈號反映正確的無線狀態, 請編輯 /etc/init.d/custom-user-startup:
語法:
#!/bin/sh /etc/rc.common
START=98
start() {
	/sbin/woggle led
}
儲存並執行:
語法:
root@OpenWrt:~# chmod +x /etc/init.d/custom-user-startup
root@OpenWrt:~# /etc/init.d/custom-user-startup enable
由於以上腳本牽涉設定LED, 而OpenWrt 原本會在/etc/rc.d/S95done (/etc/init.d/done) 之中, 於處理/etc/rc.local 之後設定LED, 以Power LED 恆亮代表init 階段完成, 如此則會和小弟的腳本衝突, 所以必須把以上腳本設定於S95done 之後才執行 (START=98)

最後, 由於Backfire 之下可透過LuCI 或 /etc/config/system 控制LED, 所以還需留意是否會和 /proc/diag/led 衝突, 請只控制其中之一, 以ASUS WL-HDD2.5 (Backfire/brcm47xx) 為例:
語法:
root@OpenWrt:~# ls /proc/diag/led
power  usb
/etc/config/system:
語法:
config 'led'
	option 'name' 'radio'
	option 'sysfs' 'b43-phy0::radio'
	option 'default' '1'
	option 'trigger' 'netdev'
	option 'dev' 'wlan0'
	option 'mode' 'tx rx'
參考連結:
Hardware Button - OpenWrt Wiki
System configuration - OpenWrt Wiki
LED System Load Monitor - OpenWrt Wiki
Wifi Toggle - OpenWrt Wiki
Netgear WNDR3700 - OpenWrt Wiki - Monitor button actions

相關連結:
【韌體】ASUS WL-HDD2.5 改刷 OpenWrt Kamikaze with X-Wrt Webif² - PCZONE 討論區
【腳本】WifiToggle for DD-WRT - 以Reset 按鈕當作無線開關, 無線閒置則自動關閉訊號 - PCZONE 討論區
【韌體】Gargoyle Router Management Utility - PCZONE 討論區


此篇文章於 2011-04-27 06:24 PM 被 FYI 編輯。.
回覆
散人
回覆: 【腳本】WifiToggle - 以 Reset/WPS/QSS 按鈕當作無線開關
感謝!
先收起來.....
寫韌體真的是很好玩。

回覆



類似的主題
主題 主題作者 討論版 回覆 最後發表
【腳本】WifiToggle for DD-WRT - 以Reset 按鈕當作無線開關, 無線閒置則自動關閉訊號 FYI -- 網 路 技 術 版 3 2010-04-10 09:49 PM
請問如何遠端 reboot/reset VDSL ? wureka -- FTTB / FTTC / FTTH 光纖寬頻討論版 7 2009-09-27 05:48 PM
【問題】Alcatel T07AW Reset jamesex ---- ADSL 軟 硬 體 技 術 1 2006-07-27 09:54 PM
【求助】關於Alcatel T07A RESET Kuang ---- ADSL 軟 硬 體 技 術 12 2006-03-29 04:54 PM
【求助】POWER & RESET Daniel -- 電 腦 硬 體 討 論 版 6 2003-05-08 02:52 PM






 XML   RSS 2.0   RSS 
本站使用 vBulletin 合法版權程式
站務信箱 : [email protected]

本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。