ESP32-WROVERでBLE通信
ESP32-WROVER(TTGO T-Camera)はBLE(Bluetooth Low Energy)通信にも対応しています。以前、別のチップであえなく撃沈したので(というほどやってもいませんが)、再チャレンジです。
BLEに関して「Bluetooth Low Energyをはじめよう」という本の一読をお勧めします。この本にはBLEの概要が書かれているだけなのでこれを読んだからといってBLEが使いこなせるわけでもないですが、BLEの成り立ち(Bluetooth3以前と4以降は全く別の規格)やGAPやGATTといった見慣れないBLE用語などに馴染んでおいた方がいいかと思います。といっても私はこれしか見ていないので他にいい本があるかもしれませんし、この本とて素晴らしくわかりやすいという訳でもないのですが。いずれにしろネットの情報だけで全体像を掴むのは容易ではなくこういった本を見たほうがいいとは思います。
また最終的に規格を把握するにはBLE本家のサイトを見る必要があると思います(私はまだほとんどちゃんと見たことはない…)。
では始めましょう!!!
といっても本格的にできた訳ではなくESP-IDFのサンプルプロジェクトとC#(UWP)のサンプルプロジェクトを動かしたら動いた、というだけです。しかし動くサンプルプロジェクトがあれば中身を読み解いてモディファイすることで実使用プロジェクトにしていけるはずです。
ESP-IDF & Eclipse
私はESP32-WROVER(TTGO T-Camera)の開発をESP-IDF & Eclipseで行っています。ESP-IDF & Eclipseのインストールなどは「TTGO T-CameraをESP-IDF & Eclipseで動かす」などを参照ください。
Eclipseを立ち上げて「File」→「New」→「Espressif IDF Project」をクリックして新規プロジェクト開発を開始します。
プロジェクト名は”GattSecurityServerExample”としました。テンプレートプログラムが”gatt_security_server”なのでこの名前にしています。GATTはGeneral ATTribute profile(汎用アトリビュート・プロファイル)、Securityは暗号化、Serverはこの例では心拍計を模していますがこの心拍数データなどを提供している(Server)、という意味合いになります。
「Next」ボタンをクリックして「Templates」ウィンドウで「bluetooth」→「bluedroid」→「ble」→「gatt_security_server」を選択して「Finish」ボタンをクリックします。

プロジェクトができたら早速、build/flashします(左上の緑丸白三角のアイコン(Launch in ‘Run’mode)を押す)。

build/flashができました。

これでもうESP32-WROVER(TTGO T-Camera)はBLEデバイスとして動作しています。
ではこのBLEデバイスをPCから見ていきましょう。
PC(Windows10)の「Windowsの設定」→「デバイス」→「Bluetoothとその他のデバイス」を選択します。
さらに「Bluetooth またはその他のデバイスを追加する」→「Bluetooth」をクリックします。
そうすると「ESP-BLE-SECURITY」が見つかるはずです。

この「ESP_BLE_SECURITY」をクリックするとペアリングが完成します。

さらにBLEデバイスと接続してデータのやり取りをするにはどうしたらいいでしょうか。
例えばC#アプリから接続メソッドで接続してWriteメソッド、Readメソッドでデータのやり取りができるのではないかと思い、Visual Studioヘルプから情報を探してみました。
ちなみにC#アプリでBLEを使うには基本的にUWP(Universal Windows Platform)を使うしかないようです。
Visual Studioヘルプから検索してみると「Bluetooth GATT クライアント」といったページがあります。こういったページを参考にC#アプリを作っていってもいいのですがGitHubに完全なサンプルがあるとのことなのでこれをダウンロードしてみます。
解凍してサンプルの内、BluetoothLEプロジェクトを選んで開きます(BluetoothLE.slnを実行)。Visual Studio2017で作られたサンプルのようでVisual Studio2017で開かれました。

すぐに「デバッグ」→「デバッグの開始」ではまず配置してくださいと言われるので「ビルド」→「BluetoothLEの配置」をしてから「デバッグの開始」をクリックします。

Bluetooth Low Energy C# sampleアプリが立ち上がります。
Start enumeratingボタンを押すとBLEデバイスを検索して表示します。
ESP_BLE_SECURITYが見つかります(ペアリングも出来ています)。

そのESP_BLE_SECURITYを選択してから左側ペインの2)Client Connect to a serverを選択してからConnectをクリックします。

Connectが成功すると「Windowsの設定画面」で接続済みになります。

そしてBLEデバイスに接続できるとGATTサーバーのサービス/特性(Characteristic)が選択できるようになります。

心拍計を模したBLEデバイスなので何でもいいのですが、Service→HeartRate、Characteristic→HeartRateMeasurementを選んでみます。
出現したボタンを押すと”Subscribe to value changes”と”Unsubscribe from value changes”が交互に切り替わります。

このときBLEデバイスの様子をTerminalを開いて観察してみるとWrite eventコールバックが呼び出されているのがわかります。


これでBLEデバイスの動作確認ができました。
今回はESP-IDFのテンプレートプロジェクトとMicrosoft社のサンプルプロジェクトを使っただけなので私の方から提供するサンプルプログラム類はありません。