Seeed K.K.の松岡です。
接続するWi-FiアクセスポイントのSSIDとパスフレーズのハードコード、イヤですよね。開発時にちょっと試すときはハードコードでも手早くできて良いのですが、出先のWi-Fiを使うときや他人にデバイスを提供するときにいちいちコンパイルしないといけなくて面倒です。外部からなんらかの方法でSSIDとパスフレーズを設定する仕組みが欲しくなりますね。このような外部からWi-Fiを設定することを一般的にWi-Fiプロビジョニングと言います。
今回は、Wi-Fiプロビジョニングを実現する方法のうちの1つ、SmartConfigをやってみましょう。
3種類のWi-Fiプロビジョニング
ESP32C3には、サンプルとして次の3種類のWi-Fiプロビジョニングが提供されています。
- Wi-Fi Provisioning
- SmartConfig
- Wi-Fi Easy Connect
Wi-Fi ProvisioningはWi-FiもしくはBLEでWi-Fiを設定可能にします。Wi-FiのときはSoftAP+HTTP、BLEのときはGATTで通信します。Android、iOS、PC(Linux/MacOS/Windows)向けに設定アプリが提供されています。
SmartConfigはWi-FiでWi-Fiを設定可能にします。なんと、SoftAPは使わず、スマートフォンがWi-Fiアクセスポイントに送信するパケットを横からモニタリング(Sniffing)してWi-Fiを設定します。Android、iOS向けに設定アプリが提供されています。
Wi-Fi Easy ConnectはWi-Fiアライアンスが決めたDevice Provisioning Protocol(DPP)でWi-Fiを設定可能にします。Androidは(バージョン10から?)DPPをサポートしているので、追加でアプリを入れなくてもWi-Fiを設定することができます。残念ながら、iOSは未だDPPをサポートしていないようです。
Wi-Fiプロビジョニング | 通信 | 操作端末 |
---|---|---|
Wi-Fi Provisioning | [Wi-Fi] SoftAP+HTTP [BLE] GATT |
Android iOS PC(Linux/MacOS/Windows) |
SmartConfig | Sniffing(UDP) | Android iOS |
Wi-Fi Easy Connect | DPP | Android |
はて、どれを使えば良いんだろう?
将来的にはWi-Fi Easy Connectだろうと思いますが、、、現時点はAndroid/iOSのどちらにも対応していて実装が軽そうなSmartConfigか妥当かなと思います。
SmartConfig
SmartConfigのコードがこちらです。
このコードをSeeed Studio XIAO ESP32C3に書き込んでおき、リセットして、すぐにBOOT BUTTONを押し続けるとSmartConfigが起動します。(READMEを見てください。)
やっていることは単純です。WiFi.beginSmartConfig()
を実行するとスマートフォンからのSmartConfigをモニタリングします。スマートフォンからWi-Fiを設定するとWiFi.smartConfigDone()
でtrue
が返ってくるので、WiFi.stopSmartConfig()
でSmartConfigを停止します。なお、SmartConfig停止後はWi-Fiのステーションモードが有効になっていますので、有効にする必要はありません。
ESPTouch
デバイスでSmartConfigを起動できたら、次はスマートフォンでの操作です。専用アプリを使います。
以降、iOSで説明しています。
Esptouchアプリを起動して、Main画面でEspTouch
を選択します。するとスマートフォンが接続しているSSIDが表示されます。このとき表示されているSSIDがデバイスに設定されるので、違うWi-Fiアクセスポイントを設定したいときはスマートフォンのWi-Fi接続を変更してください。5GHzのWi-Fiアクセスポイントはダメ、絶対。
Password
にWi-Fiアクセスポイントのパスフレーズを入力して、Confirm
をクリックすればOKです。
しばらく待つと、Execute Result
というポップアップ画面が出て、デバイスのIPアドレスが表示されます。
ESPTouchはセキュリティが弱い
SmartConfigのESPTouchプロトコルはパスフレーズが漏洩しないか?という点では若干弱いです。というのも、Wi-Fi設定情報を、スマートフォンとWi-Fiアクセスポイントとの間に流れるUDPパケットの暗号化されない部分に入れることで、デバイスによるモニタリングでWi-Fi設定情報を得られるようにしているからです。
実際にMacOSでキャプチャして確認したところ、手作業でパッとパスフレーズが分かるか?というとそんなに単純ではありませんでした。とはいえ、暗号化しているわけではないので、分かると言えば分かります。はい。
このあたりの仕組みに興味がある方は、Androidアプリのコードをご参照ください。
ESPTouch v2
セキュリティをより高くしたい方は、ESPTouch v2を使うのも手です。
ESPTouch v2は、パスフレーズ(とカスタムデータ)を128bit AESで暗号化して通信します。
デバイスは、SmartConfig.inoのSMARTCONFIG_PROTOCOL
をSC_TYPE_ESPTOUCH_V2
にして、SMARTCONFIG_CRYPT_KEY
に共通鍵(16文字)を設定しておきます。
スマートフォンのEsptouchアプリは、Main画面でEspTouch v2
を選択します。そして、次の画面のAES Key
に共通鍵を入力します。
参考リンク
- Wi-Fi Provisioning @Espressif
- SmartConfig @Espressif
- Wi-Fi Easy Connect @Espressif
- ESP32のWi-fi設定方法調査 @Lang-ship
- ESP32でWi-Fi Easy Connectを試してみた @DevelopersIO
- esptouch/__EsptouchTask.java @EspressifApp
- esptouch2/EspProvisioningParams.java @EspressifApp
- SmartConfig - iot-for-beginners-book @tuanpmt
- 802.11 ワイヤレス スニフィングの基礎 @cisco
変更履歴
日付 | 変更者 | 変更内容 |
---|---|---|
2022/10/15 | 松岡 | 作成 |