@sabamisoの技術ブログ

はじめに

学内の小規模イベントスペースを利用した対外発表を開催するにあたり、近頃流行りのIoT系の展示や来場者のインターネットへのアクセスを担保するために、各会場にM5Stackを配置しWiFiの状況をリアルタイムで可視化を行うことができる簡易WiFiチェッカーをつくってみた。

展示での問題点

  • 近頃流行りのIoT系の展示が多く、2.4GHz帯しか使えない機器達が混線する。
  • 無線ネットワークや混線などの知識のある展示車が少なく、インフラ担当者への連絡が後を絶えない。
  • 学内ということもあり、常設されているCISCO APからも2.4GHzが出ており、それらに影響を与えるのは思わしくない。
  • さらに来場者のためのGuest WiFi用のAPを増設する予定もあり、ますます2.4GHzがいっぱいになる。
  • さらにさらに個々人のモバイルWiFiルーターが2.4GHzの火を噴く。

インフラ担当者の仕事を減らしたい

  • いちいち、スマホをもっていってWiFiをチェックするのめんどくさい。
  • 各ブースに常設できて、出展者が直接チェックできるようなWiFiモニタリングデバイスが欲しい。
  • なるべく安価で小さく余計な構築はしたくない。

M5StackでWiFiチェッカーをつくろう

ディスプレイがあって、wifiモジュールついてて、演算もある程度できて小型、、、M5Stack!ってことで、M5StackでWiFiチェッカーを作成した。

開発環境

M5Stackで取得できるWiFi情報

基本的には、ESPシリーズで用いられる、WiFi.scanNetworks()を使用する。取得できる値は、

  • SSIDの取得 : WiFi.SSID(networkItem)
  • 暗号化方式の取得 : WiFi.encryptionType(networkscans)
  • RSSIの取得 : WiFI.RSSI(networkItem)
  • BSSIDの取得(uint8_t) : WiFi.BSSID(networkItem)
  • BSSIDの取得(String) : WiFi.BSSIDstr(networkItem)
  • Channelの取得 : WiFi.channel(networkItem)
  • ステルスか否かを取得 : WiFi.isHidden(networkItem)
  • 上記すべてを一括取得 : WiFi.getNetworkInfo(networkItem, &ssid, &encryptionType, &RSSI, *&BSSID, &channel, &isHidden)

networkItemは、取得したWiFI.scanNetworks()

Espressif SystemsのWiFiScanに関するサンプル

混線の判別方法

今回は、2種類の方法で混線具合を判別する。

  1. 各チャンネル毎に存在しているネットワークの数とRSSIから判別
  2. BSSIDからAPを特定し、AP毎のRSSIと出力しているSSIDから判別

1.は比較的一般的な方法でスマホのWiFiチェックアプリ等でも用いられており、検出されたSSIDの数から混雑具合を推測するものである。 2.は、CISCO APのようなMultiple BSSIDを用いて1つのAPから複数のSSIDを出している機器がある場合、1.の方法だと、あたかも近隣に大量のAPもしくは無線LANがあるように錯覚してしまう。そのため、APの正確な台数を知ることでより正確な混線を予想するものである。

完成例

1.

  • スマホアプリのWiFiチェッカーのように各チャンネルごとにどれくらいの強度のWiFiが存在しているかをグラフで可視化している。
  • グラフの高さは、RSSIが1mdb増えるごとに1上昇させ、各グラフの細かい横線の本数がそれぞれのWiFiを表している。
  • 下部には、電波強度が強い順にLCDに出力できる分のSSIDとそれぞれのChannel, RSSIを表示している。
  • SSID1は、ステルスSSIDでマージされているため、本来は複数のSSIDが出力されていると考えられる。
  • 例としては、グラフの6chでは-30dbmくらいのwifiが出力されており、下部のSSIDをみると、SSID1のステルスSSID, 6ch, -39dbmであることがわかる。

2.

  • 一般的なAPはMultiple BSSIDでは、BSSIDの最下位の4bit(0-F)をSSID毎に割り振ることで、複数の異なるSSIDを利用することが可能になっている。そのため、先頭から44bitまででマージすることで、AP毎のSSIDを表示することができる。
    例) 12:34:56:78:9A:B0->testap, 12:34:56:78:9A:BF->testtestap
  • 図では、APのオリジナルのBSSIDと出力されているSSID(空欄はステルスSSID)が表示されている。
  • 例えば、BSSID6では、SSID{,e-timer-c2d1d6}となっており、ステルスSSIDe-timer-c2d1d61chで出力されていることがわかる

つまずいたポイント

  • WiFi.SSID()などの返り値は、ArduinoのString型であり、C++の<string.h>のstring型ではなく、キャストや文字列比較がうまく動かない場合がある(エラーはでない)
  • LCDにグラフを生じさせる場合において、m5.Lcd.println("str : " + ssid); のような文字列の連結がうまく行えない(エラーはでない)。あきらめて、m5.Lcd.print("str : "); m5.Lcd.println(ssid);のように書く。

まとめ

  • M5Stackで簡易WiFiチェッカーをつくってみた。
  • 初期セットのバッテリーで20分ほど使えるので、ポケットに入れて、出かけ先や駅で使うとたのしい。

おまけ

  • 100均のホワイトボードに貼るとこんな感じ。

この記事へのコメント

まだコメントはありません