Seeed Studio XIAO ESP32C3 SmartConfigでスマートフォンからWi-Fiを設定

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のコードがこちらです。

github.com

このコードを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_PROTOCOLSC_TYPE_ESPTOUCH_V2にして、SMARTCONFIG_CRYPT_KEYに共通鍵(16文字)を設定しておきます。

スマートフォンのEsptouchアプリは、Main画面でEspTouch v2を選択します。そして、次の画面のAES Keyに共通鍵を入力します。

参考リンク

変更履歴

日付 変更者 変更内容
2022/10/15 松岡 作成