macOSで接続中のBSSID（アクセスポイントのMACアドレス）をコマンドから調べる

<h2>接続中の Wi-Fi ルーターの MAC アドレスを Mojave/Catalina から確認したい</h2>

> **同じ名前の SSID（アクセスポイント名）が複数ある**ため、どのアクセスポイントに接続中かターミナルからアクセスポイントの MAC アドレス（BSSID）を調べたい。

`option` キーを押しながら WiFi アイコンをクリックすると表示されるアレ。

![スクリーンショット 2021-04-26 19.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/40c13332-a01a-0709-1080-995efe5df13e.png "macOS のWiFi詳細情報（option押下時の画面）")

ここ１年で作成／更新された [Qiita 記事で「`bssid` `mac` `macOS` `wifi` `取得`」でググって](https://www.google.com/search?q=site:qiita.com+bssid+mac+macOS+wifi+取得&tbs=qdr:y)も出てこなかったので、自分のググラビリティとして。

## TL;DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

1. `airport` コマンドの `-I` オプションを使う。
2. **`airport` コマンドにはパスが通ってない**のでフルパスで指定するか、[コマンドのエイリアス](https://www.google.com/search?q=site:qiita.com+mac+%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)を作る。
3. コマンドのフルパス：<br>`/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I`

```conf:.bash_profileなどでエイリアスを張る例
alias airport='/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport'
```

- 動作確認環境：macOS Mojave(OSX 10.14.4, 10.14.6), macOS Catalina(OSX 10.15.7)

## TS; DR（詳細）

```shell-session:AP名の取得例
$ # 接続中のアクセスポイント名を調べる場合。でも欲しいのは MAC アドレス。
$ networksetup -GetAirportNetwork en0
Current Wi-Fi Network: aterm-xxxxxx-a
```

iPad/iPhone/Android などのモバイル端末は、通信が不安定だったり「明らかに速度が落ちた」と検知すると、**同じアクセスポイント名の複数のアンテナがある場合は、強い電波の方に自動接続します**。（その場合、同じ接続パスワード、同じ暗号タイプである必要があります）

厳密には、「アクセス実績のあるアクセスポイントで一番電波の強いもの」を選んでいるのですが、アクセスポイント一覧の優先順位にあわせて確認していくので、同じアクセスポイント名（で違うアンテナ）があった場合はそちらを優先するのです。

複数アクセスポイントを設置している場合、この仕組みを利用することで安定した Wi-Fi 接続につながります。特に工場やシェアオフィスなど、移動しながら端末を持ち歩く場合に効果を発揮します。

設定は以下の通りです。

1. 同じアクセスポイント名
2. 同じ接続パスワードとセキュリティレベル（AES など）
3. 被らないチャンネル

> <sup>🐒 &nbsp; <font color=red>**注意点**</font>として、**この方法には一長一短があります**。動画や音楽などのストリーミングを視聴もしくは配信をしながら移動すると体感的に不安定な動作になります。他にも裏でコッソリとアップデートが行われていた場合などです。なぜなら、移動してアンテナが変わるとセッション情報も切れるため、アクセスポイントとクライアントがお互い送信・受信待ちになってしまうためです。</sup>

私の利用している環境では視聴中は移動しないので、この「アクセスポイント名の統一」設定をしていました。

しかし、どうも腑に落ちない動きがありました。複数台の NEC と Buffalo のアンテナが混在しているためか、相性なのか、強い方に繋がっていない体感があったのです。

そこで、**どのアクセスポイントに繋がっているか知る（測定する）必要がありました**。

アクセスポイント名が同じなので、本当に近くの（電波の強い方の）アクセスポイントに繋がっているのか確証が持てなかったのです。

その場合に強い味方になるのが、アクセスポイントの NIC の MAC アドレス（ネットワークカードの物理アドレス）です。

つまり、マシン自体が「まだまだ大丈夫」と期待するアクセスポイントに接続していない場合は、[Wi-Fi のオン・オフ](https://qiita.com/KEINOS/items/21c9ca07664a641620eb)で強制的に強い方に接続させたいのです。

また、期待するアクセスポイントに接続しているのに重い／遅い場合、<ruby>大本<rt>おおもと</rt></ruby>のルーターに大量アクセスが来ていないかなどの**切り分けにも助かります**。

しかし、MAC アドレスを調べるためだけに別途アプリを入れるのもなぁと思っていたのですが、macOS の標準機能で確認する方法を探してみたところ、[みつかりました](https://superuser.com/questions/323548/how-to-determine-the-wifi-channel-from-mac-command-line/323550#323550)。ただ、**パスが長くて、まず覚えられない**と思ったので、未来の自分のググラビリティのために記事にしました。

```shell-session
$ # 移動
$ cd /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources
$ # airport コマンドの確認
$ ls -l
total 248
-rw-r--r--  1 root  wheel    1497  3  5 14:27 Info.plist
-rwxr-xr-x  1 root  wheel  293120  3 21 15:07 airport
-rw-r--r--  1 root  wheel    4955  9 28  2018 airportd.sb
-rw-r--r--  1 root  wheel     512  3  5 14:27 version.plist
$ # airport コマンドの実行
$ ./airport -I
     agrCtlRSSI: -54
     agrExtRSSI: 0
    agrCtlNoise: -92
    agrExtNoise: 0
          state: running
        op mode: station 
     lastTxRate: 702
        maxRate: 867
lastAssocStatus: 0
    802.11 auth: open
      link auth: wpa2-psk
          BSSID: aa:bb:cc:dd:ee:ff
           SSID: aterm-xxxxxx-a
            MCS: 8
        channel: 36,80
$ # MACアドレスのみ抜き出す
$ ./airport -I | grep BSSID | awk '{print $2}'
aa:bb:cc:dd:ee:ff
```

### 参考文献

- [「How to determine the WiFi channel from Mac command line?」| コメント](https://superuser.com/a/323550) | SuperUser @ StackExchenge
- 「[Macのコマンドラインで無線LANのアクセスポイントをスキャンをする](https://qiita.com/isaoshimizu/items/f868e9264512958fa638)」@ Qiita
- 「[Mac の bash で現在の DNS サーバーなどのネットワーク設定を取得する](https://qiita.com/KEINOS/items/ae5446a96fafb84cb127)」@ Qiita
- 「[macOS Mojave の WiFi をコマンドからオン・オフする](https://qiita.com/KEINOS/items/21c9ca07664a641620eb)」@ Qiita