Bluetooth SMART デバイス(LE GATT Profile)と連携するWindows Store Appsの開発

最近、Bluetooth SMARTというロゴのついた健康器具や時計など、ガジェットが増えてきました。家電量販店に行ったらパッケージをガン見していくと、結構おいてあります。
そして、残念ながら、AndroidやiOS対応と書かれているもの多数で、Windowsストアアプリ対応のものが少ないのが現実。うん、でも、欲しければ作ってストアから公開してしまえばよいのです。それがソフトウェア開発者の生きる道(なんてね)

Bluetooth SMARTのロゴがついているデバイスは、Bluetooth Low Energy GATT(Generic Attribute) Profileという、標準規格に則ってインターフェイスが規定されています。

https://blogs.msdn.com/b/hirosho/archive/2013/10/04/whatkindofdevicestobeabletoconnecttowindows81storeapps.aspx

で紹介したように、これ、Windows 8.1で追加された新しいAPIでアクセス可能です。基本は上のURLのページを見て勉強してください。Bluetooth SMARTのインターフェイス群は、

https://developer.bluetooth.org/gatt/Pages/default.aspx

で公開されています。一つのデバイスは、複数のServiceを提供し、Serviceには複数のCharacteristicsが含まれ、Characteristicsは、Descriptorを含む場合があります。これらすべて、Bluetooth Orgのページにデータの取得方法について記載があります。

標準化されているプロファイル膨大です。売られているガジェットにはどんなServiceをサポートしているか公開されているものはほとんどありません。連携するStoreアプリを開発するには、先ず、各ガジェットがサポートするService群を調べる必要があります。

サポートしているServiceを調べるために、ストアアプリを作って公開してみました。

https://apps.microsoft.com/windows/app/eg-bluetooth-smart-gatt-profile/87207696-068a-410c-bfdd-a96f44d43b3f

調べたいガジェットを先ず、設定チャーム→PC設定の変更→PCとデバイス→Bluetooth でペアリングしてください。Bluetooth SMARTデバイスは大抵の場合ボタン電池で動いていて、PCに近づければデバイスのリストに表示されるはずです。

ペアリング後、このアプリを起動してください。リストにBluetooth SMARTデバイス群が表示されます。調べたいデバイスをタップすると、そのデバイスがサポートしているServiceがリストの右側に表示されます。Serviceの項目をタップすると、そのServiceが含んでいるCharacteristicsのリストが表示されるページに移動します。更にDescriptorのリストが表示され、詳細を調べていくことが可能です。

点線で囲んだ部分をタップすると、Bluetooth ORGの仕様詳細ページに飛びます。

Service、Characteristics、Descriptorで、水色のWinRT API Supportedアイコンが表示されている項目は、Windows.Devices.Bluetooth.GenericAttributeProfile名前空間の、GattServiceUuids、GattCharacteristicUuids、GattDescriptorUuidsで、あらかじめWinRT APIの列挙子として定義されているものであることを示しています。

ストアアプリ内でのデバイス発見は、

    var deviceWatcher = DeviceInformation.CreateWatcher(GattDeviceService.GetDeviceSelectorFromUuid(GattServiceUuids.BloodPressure));
    deviceWatcher.Added += deviceWatcher_Added;

こんな感じで、WinRT APIで定義された列挙子定義を使って取り扱いが可能なものです。

一方、

という、アイコンの項目のものは、WinRTには定義がありません。でも問題Nothing。私が公開したアプリで表示される各項目のUuid、これを直接指定してガジェットと接続することができるんです。例えば、

    var deviceWatcher = DeviceInformation.CreateWatcher(GattDeviceService.GetDeviceSelectorFromUuid(Guid.Parse("{00001816-0000-1000-8000-00805f9b34fb}")));

こんな形で、Uuidの値を直書きすれば接続できます。ちなみにこの値は、CYCLING_SPEED_AND_CADENCE です。GattDeviceService、GattCharacteristicクラスのメソッドにそれぞれ、Uuidを指定して含んでいる定義の取り出しが用意されていますが、それらも、全て同じ感じでアクセス可能です。Uuidは、アプリが表示するUuidを使ってください。で、具体的にどんなデータ構造、とか、呼び出し形式とかは、Bluetooth Orgの標準仕様の説明を見てくださいね。

サンプルは、https://code.msdn.microsoft.com/Bluetooth-Generic-5a99ef95 を参考にすると良いでしょう。

はい、では、連携アプリどんどん作ってくださいね。

あ、ストアアプリ+デバイス連携については、Facebookのグループページもあるので、興味のある方ご参加ください。ストアで公開されたアプリの自慢もOK。

https://www.facebook.com/groups/1420233764880069/