0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Wi-Fiのローミング状況を表示するスクリプト (adb接続のAndroid向け)

Last updated at Posted at 2026-02-02

概要

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?