SwitchBot スマートロック を BLE APIで開閉 プロトコル解説(ESP32/M5 ATOM S3)
さて、今回も筆者イチオシのスマートロック、SwitchBotのスマートロックを取り上げます。
スマートロックに限らず、DIYでスマートホームを実現するのに、SwitchBot製品群とても便利です。筆者が推しているのは、SwitchBotがWeb APIやBLE APIを公開していること。例えば、BLE APIはGithubでドキュメントが公開されているので、技術に明るい大家さんや一般ユーザであれば、これらを使ってDIY的に生活をよりスマートにすることができるというわけです。
以前の記事では、node-switchbotというTypeScript/JavaScriptベースのライブラリでスマートロックの開閉をする方法をとりあげました。このライブラリでは、スマートロックのBLEプロトコル上で暗号化を実装しています。残念ながら、このプロトコルは上で述べたGithubのドキュメントには記載がなく、ESP32などのTypeScriptが一般的ではない他の組み込みプラットフォームでDIYするにはハードルが高い状況なのです。
そこで本日の記事では、ESP32を搭載したボードであるM5 ATOM S3 Liteを念頭に、node-switchbotライブラリに実装されているBLE プロトコルの暗号化について解説してみます。
SwitchBot BLE APIの基本
SwitchBot BLE APIは、Bluetooth Low Energy (BLE)をベースにした、アプリケーションのためのプロトコル仕様です。ですので、これを利用するには、BLE規格自体の理解が必須となります。
以前の筆者の記事にて、Service, CharacteristicsといったBLE規格のGATT通信の仕組みを簡単に解説しています。こちらをまずはご理解いただき、以下のSwitchBot スマートロックの議論につなげていきます。
上記の記事では、ESP32のArduinoライブラリの実装としてhttps://github.com/nkolban/esp32-snippetsというものを使っていました。ただ、このライブラリの実装はフットプリントが大きく、最近は「ほぼ」互換のAPIをもつNimBLEというライブラリが流行のようです。以下の実コードでは、NimBLEを使っています。
下図のようなソフトウェア・スタックになっています。オレンジ色のところを自作していく感じになります。
SwitchBot スマートロックの暗号化の仕組み
スマートロックの暗号化は2段階の手順が必要です。こちらは以前node-switchbotライブラリを使った開閉の記事にある通りなのです。改めてこちらにも転記すると、以下のようになります。
- SwitchBotのアカウントからキーIDを取得する
- キーIDを使ってBLEコマンドを暗号化する
前者については、筆者が専用のスクリプトを公開しています。これを使うと簡単にKeyIDとEncryption Keyという2つのパラメータが取得できます。
後者のBLEコマンドの暗号化が、今回の説明の要点です。
まずは、プロトコルのシーケンスを示します。以前の記事でも登場したシーケンス図です。
上記のシーケンスの下側の赤枠の中をESP32に実装(ポーティング)してあげれば、M5 ATOM S3 LiteでSwitchBotスマートロックが開閉できるようになります。
ここで行われているのは、Lock (または、Unlock)を実行するには、直前にIV(Initial Vector: 初期ベクトル)を取得し、初期ベクトルと前述のスクリプトで得られたEncryption Key を使ってAES128のCTRモードで暗号化する、と言う流れです。
BLEプロトコル・ペイロード仕様
シーケンスは上記のとおりなのですが、ではそれぞれのコマンドに載せるペイロードはどのような形式なのでしょうか。ペイロードのフォーマットは仕様化されていないので、node-swtichbotの実装を見ながら表にしてみました。
下図がその詳細です。
上図では、GET_IV、INFO、LOCK、UNLOCKの3つのコマンドに関して、セントラルからプリフェラル(スマートロック)に向かって送るCommandと、そのコマンドの戻り値となるResponseを記載しています。
上記のシーケンス図と合わせると、例えばLockの場合は、GET_IVで得られるResponseに含まれるIVの1部をLockのペイロードの3バイト目に含める、Lockペイロードの後半(緑の部分)には暗号化したデータを載せる、ということが読み取れるでしょう。
スマートロックの施錠・解錠の実コード
実際のコードは以下のリポジトリに公開しています。
上述のシーケンスを実装したスマートロックのBLE暗号化コードは、以下の箇所にあります。
このリポジトリで公開しているコードコンパイルしてM5 ATOM S3 Liteにインストールすると、M5に搭載されているボタンを使って以下のような動作が確認できます。
- ボタン短押しでロック施錠
- ボタン長押しでロック解錠
コンパイルする際には、上でも述べた専用スクリプトを使って、ユーザアカウントと、操作したいスマートロックのMACアドレスを使って、KeyIDとEncryption Keyを入手しヘッダに適切に記載する必要があります。スマートロックのMACアドレスは、SwitchBotの公式アプリに登録後、アプリ内で表示されますのでそれを使用します。
ちなみに、SwitchBotのスマートロック製品には、通常版とプロ版の2種類があります。上記のリポジトリのコードやペイロードは通常版(プロ版)ではない方ですのでご注意ください。
ディスカッション
コメント一覧
まだ、コメントがありません