概要
ESP32用のArduinoライブラリであるEspBleを作ってみました。ESP32の標準ライブラリは微妙なところがあるのと、API関連をEspUsbシリーズと統一したもので作り直してみました。
作成物

こちらのライブラリになります。まずESP32シリーズではBluetooth関連のホストと呼ばれるミドルウエア層があり、ClassicとBLEに対応しているけれどAPIが複雑なBluedroidと、BLEのみですがAPIがシンプルなNimBLEがあります。
ESP-IDFではどちらかを選択して利用できるようになっているのですが、Arduinoの場合には無印ESP32はClassicがつけるのでBluedroidのみ、それ以外のコアの場合にはArduino3.2以降ではNimBLEが搭載しています。

上記のライブラリを利用すると組み込んでいるホストを利用せずに、ソースからビルドしたNimBLEを利用することができます。ただしAPIなどは標準的なままだった気がします。
NimBLEは無印ESP32以外はビルドインしてある標準NimBLEホストをそのまま利用しています。そのためESP-IDFの標準環境のまま、Arduino層のクラス部分のみ使いやすいように作り込んであります。とくにHIDとかでもキーボードとかは文字コードとかの関係もあり日本語キーボードがちゃんと使えるライブラリは少ないのでEspBleは英語圏以外の人にはおすすめです。あとMIDIとかもEspUsbシリーズと同じぐらい作り込んであります。
無印ESP32は当初Bluedroidのまま作り込みを進めていたのですが、その方針をやめてNimBLEを内部に取り込んで動かすようにしました。中身はNimBLE-Arduinoのものではなく、ESP-IDFでNimBLEを選択した場合と同じものが入る感じの設定になっています。
ちなみにArduino標準ライブラリだとBluedroidとNimBLEのどちらでもおなじように動くライブラリになっているので、APIや動きが微妙なところがあります。そこを綺麗に整理するとどうしてもNimBLE専用にした方がスッキリとした動きになりました。
あとはテストを非常にがんばっています。pytestを利用して無印ESP32が2台、ESP32-S3が2台、ESP32-P4+C6を1台利用してEspBleライブラリ同士の動作確認の他、Arduino Core標準BLEライブラリとの相互接続も検証しています。
ちなみに標準BLEライブラリだと同じUUIDが複数ある場合に対応できません。UUIDなのに同じのが複数ある状況は微妙なのですがBLEのUUIDは単なる機能名ぐらいのものなので、UUIDが同じ機能が複数あるのは正常です。

皆さん大好きダイソーなどのシャッターもUUIDが同じものがあり、毎回パッチを当てたりPRを出したりして動かしていました。
まとめ

今回ドキュメントとExamplesに非常に力をいれています。上記をみてみるとBLEとはなにかからのガイドがあり、個別機能のExamplesが大量に並んでいます。
BLEはこれまであまり触ってこなかったのですが、いろいろ勉強ために一から学んでみました。まだまだ特殊なことはあるのですが、別の記事にしたいと思います。


コメント