ESP-IDFには2系統のBTライブラリがあるようで、BLEだけなら、NimBLEを使うべしとあった
For BLE-only usecases, using NimBLE is recommended. It is less demanding in terms of code footprint and runtime memory, making it suitable for such scenarios.
確かに、サンプルソースを見ても、NimBLEの方が圧倒的に記述量が少ない。だから、NimBLEでBLE MIDIを試作することにした。
ソース抜粋(Advertisingのテスト中)
BLEサンプル(Heart-rate)をベースに、Serive UUIDとCharacteristic UUIDだけ変えてみる
static const ble_uuid128_t gatt_svr_svc_sec_midi_uuid = BLE_UUID128_INIT(0x00,0xC7,0xC4,0x4E,0xE3,0x6C,0x51,0xA7, 0x33,0x4B,0xE8,0xED,0x5A,0x0E,0xB8,0x03); static const ble_uuid128_t gatt_svr_chr_midi_uuid = BLE_UUID128_INIT(0xF3,0x6B,0x10,0x9D,0x66,0xF2,0xA9,0xA1, 0x12,0x41,0x68,0x38,0xDB,0xE5,0x72,0x77); *略 static const struct ble_gatt_svc_def gatt_svr_svcs[] = { { /* Service: BLE MIDI */ .type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = &gatt_svr_svc_sec_midi_uuid.u, .characteristics = (struct ble_gatt_chr_def[]) { { /* Characteristic: BLE MIDI NOTE */ .uuid = &gatt_svr_chr_midi_uuid.u, .access_cb = gatt_svr_chr_access_heart_rate, .val_handle = &hrs_hrm_handle, .flags = BLE_GATT_CHR_F_NOTIFY, }, { 0, /* No more characteristics in this service */ }, } }, *略*
ESP32のログ出力
I (831) NimBLE_BLE_MIDI: BLE Host Task Started Device Address: 30:ae:a4:cc:4d:xx GAP procedure initiated: advertise; disc_mode=2 adv_channel_map=0 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=0 adv_itvl_max=0 BLE_GAP_EVENT_CONNECT connection established; status=0 BLE_GAP_EVENT_MTU mtu update event; conn_handle=0 mtu=256 BLE_GAP_EVENT_SUBSCRIBE subscribe event; cur_notify=0 value handle; val_handle=12 I (80861) BLE_GAP_SUBSCRIBE_EVENT: conn_handle from subscribe=0 BLE_GAP_EVENT_ENC_CHANGE
ラスパイのBLEツールによるスキャン
BLE MIDIのUUIDである、「03b80e5a-ede8-4b33-a751-6ce34ec4c700」が返却されているようである。。
# bluetoothctl [bluetooth]# scan on Discovery started ...... [bluetooth]# connect 30:AE:A4:CC:4D:XX [BLE MIDI 0.00]# pair 30:AE:A4:CC:4D:XX Attempting to pair with 30:AE:A4:CC:4D:XX [CHG] Device 30:AE:A4:CC:4D:XX Paired: yes Pairing successful [BLE MIDI 0.00]# info 30:AE:A4:CC:4D:XX Device 30:AE:A4:CC:4D:XX (public) Name: BLE MIDI 0.00 Alias: BLE MIDI 0.00 Paired: yes Trusted: no Blocked: no Connected: yes LegacyPairing: no UUID: Generic Access Profile (00001800-0000-1000-8000-00805f9b34fb) UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb) UUID: Device Information (0000180a-0000-1000-8000-00805f9b34fb) UUID: Vendor specific (03b80e5a-ede8-4b33-a751-6ce34ec4c700)
Windows10からESP32のBLE MIDIを接続してみる。以下の通り、BLE_GAP_EVENT_SUBSCRIBEを2回やって、最後はDISCONNECTで終わっている。なぜだろうか。
GAP procedure initiated: advertise; disc_mode=2 adv_channel_map=0 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=0 adv_itvl_max=0 BLE_GAP_EVENT_CONNECT connection established; status=0 BLE_GAP_EVENT_MTU mtu update event; conn_handle=0 mtu=256 BLE_GAP_EVENT_ENC_CHANGE BLE_GAP_EVENT_SUBSCRIBE subscribe event; cur_notify=0 value handle; val_handle=12 I (1333791) BLE_GAP_SUBSCRIBE_EVENT: conn_handle from subscribe=0 BLE_GAP_EVENT_CONN_UPDATE BLE_GAP_EVENT_CONN_UPDATE BLE_GAP_EVENT_SUBSCRIBE subscribe event; cur_notify=0 value handle; val_handle=12 I (1338831) BLE_GAP_SUBSCRIBE_EVENT: conn_handle from subscribe=0 BLE_GAP_EVENT_DISCONNECT disconnect; reason=531
WindowsのBLE管理画面上では接続されていることになっているが、、実際にはdisconnect状態である。
詳細な動作確認はまだできていないが、Advertisingの時に、ServiceUUIDが出せていないように思える。
struct ble_hs_adv_fields に BLE MIDIのServiceUUIDを入れないといけない気がする。
■参考URL
BLE Peripheral Project — Apache Mynewt latest documentation
NimBLE-based host APIs - ESP32 - — ESP-IDF Programming Guide latest documentation
https://sites.google.com/a/gclue.jp/ble-docs/