概要
Android端末がいつどのようにWi-Fi AP間をローミングしているかを確認するため、pingのような感じで、1秒に1回、SSID, BSSID, 周波数、リンク速度、および指定サーバーのpingの値を表示するスクリプトです。
Android端末とは、adb接続して利用します。
ローミングが発生すると、BSSIDが変化します。
利用方法
Macでのみ動作確認しています。
Android端末がadbで認識できる状況で、ターミナル (zsh/bash) から起動してください。
出力例
10:50:10 SSID="****1234"" BSSID=aa:bb:cc:**:**:10 RSSI=-57dBm Link=19Mbps Freq=2437MHz ping=430ms (8.8.8.8)
10:50:03 SSID="****1234"" BSSID=aa:bb:cc:**:**:10 RSSI=-59dBm Link=19Mbps Freq=2437MHz ping=194ms (8.8.8.8)
10:50:05 SSID="****1234"" BSSID=aa:bb:cc:**:**:10 RSSI=-59dBm Link=19Mbps Freq=2437MHz ping=timeout (8.8.8.8)
10:50:07 SSID="****1234"" BSSID=aa:bb:cc:**:**:10 RSSI=-61dBm Link=19Mbps Freq=2437MHz ping=284ms (8.8.8.8)
10:50:09 SSID="****1234"" BSSID=aa:bb:cc:**:**:20 RSSI=-61dBm Link=19Mbps Freq=2437MHz ping=95.8ms (8.8.8.8)
10:50:10 SSID="****1234"" BSSID=aa:bb:cc:**:**:20 RSSI=-38dBm Link=117Mbps Freq=2437MHz ping=128ms (8.8.8.8)
10:50:12 SSID="****1234"" BSSID=aa:bb:cc:**:**:20 RSSI=-38dBm Link=117Mbps Freq=2437MHz ping=49.4ms (8.8.8.8)
10:50:13 SSID="****1234"" BSSID=aa:bb:cc:**:**:20 RSSI=-39dBm Link=104Mbps Freq=2437MHz ping=54.8ms (8.8.8.8)
10:50:15 SSID="****1234"" BSSID=aa:bb:cc:**:**:20 RSSI=-39dBm Link=104Mbps Freq=2437MHz ping=20.6ms (8.8.8.8)
roam_watch.sh
# ================================
# Wi-Fi Roaming Watcher
#
# adb接続されたAndroid端末において、接続されたAPの変化を継続的にログ出力します。
# 同じSSID内でのローミングによる変化を記録できます。
# pingをとることで、通信状態の良好さを一緒に記録できます。
# ping対象IPはLAN上のサーバー(ルーター等)を指定するのが推奨です。
# 引数: ping対象IP (指定しなければ8.8.8.8 (GoogleのDNSサーバー) を利用)
# ================================
adb shell 'sh -s' -- $1 <<'SH'
TARGET="$1"
INTERVAL="${2:-1}"
# 宛先未指定ならデフォルトGW→なければ8.8.8.8
if [ -z "$TARGET" ] || [ "$TARGET" = "-" ]; then
GW="$(ip route 2>/dev/null | while IFS= read -r L; do case "$L" in default\ *) set -- $L; echo "$3"; break;; esac; done)"
TARGET="${GW:-8.8.8.8}"
fi
while :; do
TS="$(date +%H:%M:%S)"
ssid="-" bssid="-" rssi="-" link="-" freq="-" pingms="-"
# dumpsysを一旦ファイルに落としてから読む(サブシェル問題&Broken pipe回避)
TMP="/data/local/tmp/wifi.$$"
dumpsys wifi 2>/dev/null > "$TMP"
found=0 connected=0
while IFS= read -r line; do
case "$line" in
*"mWifiInfo "*|*" WifiInfo "*)
found=1
case "$line" in
*"Supplicant state: COMPLETED"*|*"Detailed state: CONNECTED"*|*"state: CONNECTED/CONNECTED"*)
connected=1;;
*) connected=0;;
esac
# SSID
case "$line" in
*"SSID: "*)
tmp=${line#*SSID: }
ssid=${tmp%%,*}
case "$ssid" in \"*\") ssid=${ssid#\"}; ssid=${ssid%\"};; esac
[ "$ssid" = "<unknown ssid>" ] && ssid="-"
;;
esac
# BSSID
case "$line" in *"BSSID: "*) tmp=${line#*BSSID: }; bssid=${tmp%%,*};; esac
# RSSI
case "$line" in *"RSSI: "*) tmp=${line#*RSSI: }; rssi=${tmp%%,*}; rssi=${rssi%% *};; esac
# Link speed
case "$line" in *"Link speed: "*) tmp=${line#*Link speed: }; link=${tmp%%,*};; esac
# Frequency
case "$line" in *"Frequency: "*) tmp=${line#*Frequency: }; freq=${tmp%%,*};; esac
break
;;
esac
done < "$TMP"
rm -f "$TMP"
# ping(接続時のみ)
if [ $connected -eq 1 ]; then
P="$(ping -c 1 -W 1 -n "$TARGET" 2>/dev/null)"
case "$P" in *"time="*) pingms=${P#*time=}; pingms=${pingms%% *}ms;; *) pingms="timeout";; esac
fi
echo "$TS SSID=\"$ssid\" BSSID=$bssid RSSI=${rssi}dBm Link=$link Freq=$freq ping=$pingms ($TARGET)"
sleep "$INTERVAL"
done
SH