Windows 10 IoT CoreをはじめとするUWPアプリでBLEデバイスを扱う

先ずは、IoT Kitハンズオントレーニング のデバイス側で、Windows 10 IoT CoreのUWPアプリ(Windows 10 PCでも実施可能)とTexas InstrumentsのSensor Tag(CC2541、CC2650)の組合せを追加したことをお知らせします。https://github.com/ms-iotkithol-jp/IoTKitHoLV3 のWinIoTCoreTIIoTHubAppフォルダーに入っているソリューション一式がそれです。TI Sensor TagをデバイスやPCとペアリングすれば、あとは、WpfEmuIoTHubAppと同じ要領で自学自習可能ですので、TI Sensor Tag持っている人は是非試してみてください。一般のPC、Raspberry Pi3やDragonBoardなどBLE対応のデバイスであれば特にBLEのドングルなどなくても実習可能です。

さて本題です。このアプリを作っている過程で、BLEデバイスにアクセスするためのWindows Runtime APIの使い方でてこずりました。ライブラリー群は、非同期メソッドなので、await 句を付けてコールすれば通常は問題なく使えるのですが、HandsOn.csファイルの中で、普通のやり方をやっても実行がブロックされて戻ってきません。では、Taskのまま受けて、Wait()で待って、結果をResultで受け取って…を試してみたら、デバッガーで一行一行ステップバイステップで動かすと、一応動くのですが、一気通貫で実行しようとすると、Wait()から帰ってこない!最悪のパターンだ…どうしよう、ってな状況になってしまいました。しかしなぁ…サンプルでは動いてるしなぁ…何が違うの?

と考えて動くものと動かないものを比較した結果、解が得られました。どうやら、UWPアプリとして作ったプロジェクトの中ではawaitやWait()がうまく動かないらしく、UWPアプリプロジェクトを作った時に出来上がるソリューションに、別途UWPクラスライブラリプロジェクトを作って追加、そのクラスライブラリ上にBLEデバイスにアクセスするFindAllAsyncやらなんやらをコールするコードを置くとうまく動くんですな。Gitに挙げているサンプルもそういう作りになっています。

ってことで、await機能しないじゃん、なにこれ?…と首をかしげてる皆さん、この方法試してみてください。

ではでは