Windows でも BLE を扱うことは可能か?〜できるかどうかやってみた〜

1. あらまし

リーダーにブログ記事を書けと言われました。
最初は .NET Core を使って mac OS で WPF アプリケーションを動かせと言われていましたが、サポートされていないので断念しました。
その後、方針を転換して Windows で BLE 通信をするアプリを作成せよ、とのお達しが出たので、やります。

2. UWP を使った BLE デバイスのアドバタイズ

2.1 UWP とは

UWPは、Universal Windows Platform の略称で、Windows 用のアプリケーションソフトウェアを異なるデバイスで動かすことができる統合プラットフォームです。Windows デスクトップ、IoT デバイス、Xbox One などで動くらしいです。今回は UWP に BLE 関係の API があるので、それを利用してアプリを作成します。

2.2 BLE とは

BLE とは、Bluetooth Low Energy の略称で、Bluetooth 4.0 から追加された低電力消費、低コストの通信規格です。先輩社員が書いた過去のブログ記事があるので、詳細を知りたい方は該当記事を参照してください。

2.3 Visual Studio 2019 で UWP アプリを作成

2.3.1 プロジェクト作成

まずは Visual Studio Installer で「ユニバーサル Windows プラットフォーム開発」をインストールします。

次に「新しいプロジェクトの作成」から「空白のアプリ(ユニバーサル Windows)」を選択します。プロジェクトの種類を UWP にすると見つけやすいです。

プロジェクトを作成した際に、Windows の「設定」の「更新とセキュリティ」内の「開発者向け」の設定画面が開きます(開かない場合は Visual Studio の指示に従うか、自分で設定してください。)。ここで「開発者モード」を選択し、ソフトのインストールを待ちます。

準備として、プロジェクトにBluetoothの機能追加をします。
制作されたプロジェクトの中に「Package.appxmanifest」というファイルがあるので、Visual Studio から開いて「機能」タブから「Bluetooth」にチェックをつけます。

2.3.2 BLE ドングル

自分の開発環境は VM の Windows で、ホスト OS 側からの BLE が繋がらないので、BLE ドングルを買ってきました。使用したドングルは ELECOM の「LBT-UAN05C2/N」です。家電量販店で 965円で買いました。
VMWare の設定「USBとBluetooth」から、「Bluetooth デバイスを Windows に共有」のチェックを外し、ドングルを挿入し、USB デバイスを接続します。
Windows デバイスマネージャーの Bluetooth 部分に「Microsoft Bluetooth LE Enumerator」が追加されていれば、恐らく動作します。

2.3.3 UI

表示する画面の xaml はこちらです。

2.3.4 アドバタイズ

ドキュメントを参考にして、BLE デバイスの検索をします。
まず、ウォッチャーを作り、アドバタイズするデバイスを発見した場合のメソッドを追加します。そして BluetoothLEManufacturerData を使って、アドバタイズするデバイスをフィルタリングします。ウォッチャーをスタートして、2 秒後にストップします。

アドバタイズを受信した際に、受信した結果を AdvertisementListItem に変換してリストに登録します。リストは xaml 側で ListView の DataSource に設定されているので、変更されると画面に表示されます。

AdvertisementListItem は、コンストラクタでアドバタイズ受信時のコールバックメソッドの引数を受け取り、デバイスに接続するための BluetoothAddress と、画面に表示するための文字列 AdvertisementData を生成します。AdvertisementData は、アドバタイズ時に送られてくるメーカー固有のデータを、16 進数に直して文字列にしています。

2.3.5 実行結果

3. BLE デバイスに接続

3.1 ビーコン機器の説明

当社のビーコン機器と、システムです。このシステムに関連したデバイスを使い、仕様書を見つつ、デバイスのブザーを鳴らします。

3.2 プログラムの改修

3.2.1 GATT とは

GATT は BLE に接続するためのプロファイルで、特性(Characteristics)を持つ Service の集合体です。今回使用する API では、接続した後に Characteristic を通して入出力を行います。

3.2.2 デバイスに接続する

これらのドキュメントを参考にして接続をします。
ListView で選択した BLE デバイスに、BluetoothAddress で接続し、StringBuilder に情報を追加します。デバイスが持つ GattDeviceService と、それに関連する GattCharacteristic の情報も StringBuilder に追加し、TextBox で表示します。最後に接続したデバイスをグローバル変数に代入しておきます。

3.2.3 接続結果

3.2.4 デバイスを鳴らす

3.2.3 節で接続したデバイスに命令を送り、ブザーを鳴らします。
まず、自作した getBuzzCharacteristic メソッドで、デバイスに命令を送るための GattCharacteristic を取得します。 getBuzzCharacteristic は、引数で受け取った BluetoothLEDevice のブザー用の GattDeviceService と、サービスに関連する GattCharacteristic を取得し、通知用の characteristic の ValueChanged イベントハンドラーに NotifyValueChanged メソッドを登録し、命令用の characteristic を返します。
命令用の GattCharacteristic を取得した後は、命令文を ASCII でエンコードし、DataWriter.DetachBuffer メソッドで IBuffer 型にして、WriteValueAsync メソッドに渡し、デバイスにデータを入力します。成功したら、TextBox に成功したと表示します。

3.2.5 結果



成功しました。

4. おわりに

Windows でも BLE を扱うことは可能でした。
Windows8.1 以降なら BLE 関連の API があるらしいので、PC に BLE 通信機器が内蔵されていない場合でも、今回のようにドングルを利用すれば正常に動くと思われます。

関連記事

  1. 知識ゼロで Unity をはじめてみた【その4 -キー入力-】

  2. ワインのボトルに加速度センサー付きBeacon(ビーコン)を取り付けて…

  3. アジャイル ~壁を乗り越える~【第1回 導入編】

  4. Bluetooth SIGブログで紹介された「7つの活用方法」の詳細を…

  5. 知識ゼロで Unity をはじめてみた【その3 -キューブの落下とバウ…

  6. 何でこうなるの?現場で起きた開発回顧録【その2-JSFライフサイクルと…