前回KORGのMicroKEY Airのパケットをキャプチャして、アドバタイズの内容、再接続について理解できたので、nimBle版ペリフェラルサンプルコード(bleprph)を書きなおして、BLE MIDIとして仕立ててみた。元ソースからの修正点は以下
- AdvertisingはBLEMIDIのUUID128のみ、デバイス名は削除
- GATTのService/CharacteristicsをBLE MIDIに修正
- BLE MIDIのCharacteristicsのFlagに、BLE_GATT_CHR_F_NOTIFYを追加
この修正でビルドして、ESP32に焼いて接続テスト。
なお、ビルド時のペアリング・認証用Configは以下
# # Example Configuration # CONFIG_BLE_SM_IO_CAP_DISP_ONLY=y CONFIG_EXAMPLE_IO_TYPE=0 CONFIG_EXAMPLE_BONDING=y CONFIG_EXAMPLE_MITM=y CONFIG_EXAMPLE_USE_SC=y
結果として、Windowsとペアリングできて、一旦Disconnectされるが、BLE MIDIを使うアプリ(FL-Studio)を起動すると、俺BLE MIDIが認識されて、接続可能となる。以下はFL-StudioのMIDI設定ダイアログ画面、俺BLE MIDIが表示されている。
次の仕事は、、俺BLEMIDIからMIDIデータをFL-Studioに送信する機能の実装。割り込み駆動でSWを制御して、SWが押されたら、MIDI信号をNotifyでFL-Studioに送信する予定。OS配下での割り込み駆動プログラミングで、さらに、Notify送信とかどうやったらいいのかよくわからず。。
■追記
割り込み駆動でSWを制御するコードはesp-idfのサンプル*1にあったのでそれを流用、一方、NimBleのNotify関数の使い方がよく分からず。サンプルもほとんどなさそうなのだった。。
ArduinoでNimBleの実装があるようで、それを参考にしてみる。。
NimBLE-Arduino/src at master · h2zero/NimBLE-Arduino · GitHub
■追記
割り込み駆動タスクを足したりしていると、BLEすらまともに動かなくって、戻しても戻らないという。。仕事でこれをやったら滅茶苦茶怒られただろう。。「一度動いたソースはコミットしとけや!」
*1:esp-idf/examples/peripherals/gpio