BLE MIDI用UUID(UUID128)をadvertisingのパケットに入れようとしてサイズオーバーしていた。UUID128はレスポンスに入れるように修正する(いつAPI読んだらいいのかも分からず)
今まで使っていたAPI(ble_gap_adv_set_fields)
NimBLE Host GAP Reference — Apache Mynewt latest documentation
使うと思われるAPI(ble_gap_adv_rsp_set_fields)
NimBLE Host GAP Reference — Apache Mynewt latest documentation
ちゃんと仕様書を読まない、BLEの素のパケットも確認しない、そんな状態で当てずっぽうでやってもどうもうまく動かない。さらに、、nimBleのサンプルコードで再確認したが、PCとペアリングしようとして?ボンディングで??、Disconnectになっている。だから、接続がs確立できず中断されている(デバイス一覧には入ってるのだが)。nimBle版のサンプルでは、きっちりPCと接続できるサンプルコードが見つからない。
今後の進め方・・・
ESP32で、旧式のBuleToothライブラリで実装を進めるか(こちらはPCと問題なく繋がるがコード量がでかい)、ArduinoのBLE実装のソースを参考にして真似るか、、あるいは、NordicのnRF51822に切り替えるか。。
Arduino版BLEMIDIは非常にシンプルにできていて、驚くばかり。。
https://github.com/lathoub/Arduino-BLE-MIDI
BLE MIDI(UUID128)も普通にadvertiseパケットに入れているような印象。。
file: Ble_esp32.h
auto advertisementData = BLEAdvertisementData(); advertisementData.setFlags(0x04); advertisementData.setCompleteServices(BLEUUID(SERVICE_UUID)); advertisementData.setName(deviceName); // Start advertising _advertising = _server->getAdvertising(); _advertising->setAdvertisementData(advertisementData); _advertising->start();
他のマイコンに乗り換えるとしても、環境の構築とか、サンプルコードの出来栄えとか問題もある。まっとうに取り組むなら、、以下の手順
・今動いている、実績のあるESP32のBT実装のソースをよく読む
・実績のある上記サンプルの通信内容をキャプチャして細かい仕様を確認
・そのまま俺BLE MIDIに改変するか、あるいは、auth/bondingでエラーになっていると思われる、nimBle版のコードをなんとか動くように仕立てるか。
PCと正しく接続できるESP-32 フルスペック実装BTサンプル
esp-idf/examples/bluetooth/esp_hid_device at master · espressif/esp-idf · GitHub
PCとの接続が中断するnimBle版サンプル
■追記
configurationオプションがあることを知り、いろいろ組み合わせた結果、以下のオプション設定だと、少なくともWindowsからDisconnectされることは無くなった(接続が維持されている状態)。低いレイヤーから掘り下げようとせず、解決策に偶然出くわした。
# # Example Configuration # CONFIG_BLE_SM_IO_CAP_KEYBOARD_ONLY=y CONFIG_EXAMPLE_IO_TYPE=0 CONFIG_EXAMPLE_BONDING=y CONFIG_EXAMPLE_MITM=y CONFIG_EXAMPLE_USE_SC=y
■追記
ペアリングの方法は、人手で何も操作しないJustWorkや、Yes/Noを入れるもの、一番手間のかかるPCに表示されるパスワードをデバイス側で入れるものまである。試した結果、パスワード入れる、KEYBOARD_ONLYは正常にペアリングされた。また、端末側でもパスワードが表示されて、繋いでよいか、PCと端末の両方でYes/Noを入れる、Display & KeyboardもDisconnectされることはなかった。
CONFIG_BLE_SM_IO_CAP_KEYBOARD_DISP=y
MIDI装置は基本的に文字を入力するキーボードがないので、上記のKEYBOAD_DISPでペアリングさせて、端末側は固定的にYESと自動判断させるしかないかと思う。KORGのキーボードはどの仕様でペアリングしているのか、キャプチャして確認したいとは思うけど。