BLE Nano + mbed で HID over GATT しようとして1日ハマっていたので記録しておきます。HID の問題というよりペアリングの問題です。
前提
OS X El Capitan 10.11.5(15F34)
HID over GATT は Battery Service と DeviceInformationService と HIDService を提供します。
Battery Service と DeviceInformationService は mbed の BLE_API に含まれています。これはどちらのどの characteristics も open link (ペアリングなしで全ての情報を得られる) で公開しています。
HIDService は BLE_HID というライブラリに含まれています。これの characteristics は暗号化必須になっています。
問題
OS X でどうしてもペアリングが行なわれず、HID サービスが全く見えない状態でした。
Anrdoid や Windows 10 では問題なくペアリングできました。
OS X での挙動を詳細にすると
- Bluetooth 機器一覧にでる
- 「ペアリング」ボタンがでる
- デバイスとの接続はできる
- 「接続中」のまま止まり、パスコードなどを訊かれない
デバイス側のデバッグログ的には
- onConnect は呼ばれる
- セキュリティ関係のコールバックは一切呼ばれない
で、かなりお手上げでした。
解明と解決
OSX ではどうやら、何らかの条件で open link な characteristics があると bonding を行おうせず限定的なアクセスになり、HID サービスが見えないようでした。
仕方ないので BatteryService.h と DeviceInformationService.h をコピーして中身を書きかえて、requireSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM) するように変えました。外部から変えるAPIがないので辛い感じです。