SwitchBotはAPIが公開されており、ごにょごにょできるみたいなことを目にしました。そこで、まず調査のために手元のMacを使って通信を読んでみることにしました。
環境
- Mac Book Pro MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)
- MacOS 10.15.4 (Catalina)
- Xcode 11.4.1(11E503a)
- Bluetooth Explorer 7.0.0(7.0.0d101)
手順
Xcodeについてはインストール済みの前提です。Xcodeのバージョン8以降はBluetooth Explorerのインストール方法が変わっているそうですが、このブログではXcode8以降がインストールされているとして話を進めていきます。
Bluetooth Explorerのインストール
これはMacのBluetooth関連のデバッグなどを行うツールで、Additional Toolsに内包されています。
参照: Bluetooth – Apple Develope
まずは[サインイン – Apple](https://developer.apple.com/downloads/?name=Additional)にて、Apple IDでログインします。
利用規約とデベロッパーになりますか?的なことを聞かれたと思うので、チェックを入れてデベロッパーになります。
Additional Tools for Xcode バージョン
をダウンロード
ダウンロードしたdmgファイルを開き、中のHardware>Bluetooth Explorer.app
を開きます。(アプリケーションフォルダにコピーしておくと、今後使うときに便利)
使い方
Bluetoth Explorerを起動したら、上のバーからDevices > Low Energy Devices
と進みます。
ウィンドウが開いたら、左上のStart Scanning
を選択
スマホアプリから、見たい端末(Switch Botの温度計)のMacアドレス(?)を確認しておきます。
しばらくするとスマホアプリで確認したMacアドレスと同じ端末がみつかります。(見つからない場合にはスマホから一度、温度を見に行くといいかも)
デバイスを選択すると、詳しい情報が下に表示されます。
(PCの外観モードは設定 > 一般 > ライト
で変更できます。)
この中で、Service Data:{
0D00 = {length = 6, bytes = 0x541064099b3a};
}
と書かれている部分がデータになります。
(テキトにデータが見れたら左上のStop Scannning
でスキャンを止めておきます。
データの読み方
無事に0x541064099b3a
というデータを読み取ることができました。このデータのフォーマットはMeter BLE open API · OpenWonderLabs/python-host Wikiに公開されています。個人でまとめてくださっているSwitchBot 温湿度計の測定値を BLE Advertisement パケットから直接読み取る – Qiitaのブログが非常にわかりやすかったです。
取得したデータ541064099b3a
を詳しく見てみます。
まずは2進数に変換して1バイト(8ビット)ごとに区切って見やすくします。
54|10|64|07|9d|2d 01010100|00010000|01100100|00000111|10011101|00101101
左を0バイト目、一番右を5バイト目としたとします。(0|1|2|3|4|5
バイト目)
この中で温度の情報は、4バイト目の下位(右側)7bitが整数部、3バイト目の下位4bitが小数点以下の情報です。これを10進数にすると、0011101
=> 29
0111
=> 7
となり、温度は29.7℃となります。
(4バイト目の上位1bitは”Positive/Negative temperature flag”で0だと温度がマイナスになります。)
同様に湿度(humidity)は5バイト目の下位7bitで0101101
=> 45%
となります。
…ちょっと値が違いますが、値を読み取ったタイミングと写真を撮ったタイミングが異なるので、、本当はピッタリと一致していました。その他にもバッテリーの情報やアラートの設定などが書かれているようです。
まとめ
MacのBluetoothからSwitchBot Meterの情報を読み取ってみました。本来はプログラムを書いて連携したかったのですが、Python3系でプログラムを書こうとライブラリを調べたところイマイチいいものが見つからずに、とりあえず数値を解読するだけとなりました。
BLEの仕様については全然知らないのですが、Bluetoothスピーカのようなペアリング(認証)操作もなく、軽量のデータが送られ続けているのはなかなかおもしろいな〜と。
今後はRasPiかESP32あたりで何かゴニョゴニョしたいなーなんて考えてます!
参考資料
- Meter BLE open API · OpenWonderLabs/python-host Wiki
- SwitchBot 温湿度計の測定値を BLE Advertisement パケットから直接読み取る – Qiita
- Apple製「Bluetooth Explorer」でBLEデバイスを操作する – Qiita
- Xcode8以降でHardware IO Tools を使う方法は Additional Toolsをインストールすればいい – Qiita
- [iOS][OS X] 「Network Link Conditioner」を使って iOS 端末または Mac の通信速度をシミュレートする | Developers.IO