2021年1月30日土曜日

Windows10でEddyStone Beaconを受信する その2 メインルーチン編

実行中のEddyStone受信プログラム
 今回は、「Windows10でEddyStone Beaconを受信する その1 」の続きで、Windows10のBluetoothLEAdvertisementWatcher APIの使い方の解説である。
 なお、Win32のコンソールプログラムからBluetoothLEAdvertisementWatcherを使うためには、Microsoft.Windows.SDK.contractへの参照設定が必要になる。これは、もともとは、WinRT用のAPIなので、Win32アプリ側から呼ぶことができなかった。しかし、NuGetパッケージである「Microsoft.Windows.SDK.contract 」を使うことで、Win32コンソールアプリケーションからもBluetoothLEAdvertisementWatcherが使えるようになる。ただし、動作できるのは、Windows10 Ver.1803(RS4)以降である。
 まずは、BluetoothLEAdvertisementWatcherを初期化する。
BluetoothLEAdvertisementWatcher MyWatcher;
MyWatcher = new BluetoothLEAdvertisementWatcher();
 次にBluetoothアドバタイズを検出するためのいくつかのオプションを設定する。スキャンの周期を100ミリ秒として、スキャンモードをPassiveとする。BtLEのスキャンには、アドバタイズパケット(ブロードキャスト)を待ち続けるPassive Scanと、アドバタイズパケットの送信要求(SCAN_REQ)をブロードキャストするActive Scanの2種類がある。Beaconの場合には、Passiveを使う。Active Scanに応答するためには、受信状態を続ける必要があり、電力を消費してしまう。Beaconデバイスはバッテリで動作を想定しているため、Active Scanには対応せず、自分の都合でアドバタイズパケットをブロードキャストするようになっていることが多いからだ。
MyWatcher.SignalStrengthFilter.SamplingInterval = TimeSpan.FromMilliseconds(100);
MyWatcher.ScanningMode = BluetoothLEScanningMode.Passive;
つぎにEddyStoneだけを検出するためにEddyStoneのGUIDをフィルターとして設定する。0xFEAAがEddystoneの16bit UUID Data Typeである。このあたりの話は、「Eddystone Protocol Specification」にある。
MyWatcher.AdvertisementFilter = new BluetoothLEAdvertisementFilter() {
	Advertisement = new BluetoothLEAdvertisement {
    	ServiceUuids = { new Guid("0000FEAA-0000-1000-8000-00805F9B34FB") }
    }
};
あとは、イベントハンドラ(WatcherReceived)をアタッチして、Start()メソッドを実行すれば、スキャンが始まる。
MyWatcher.Received += WatcherReceived;
MyWatcher.Start();
とりあえず、今日はここまで、この先はまた次回。

0 件のコメント:

コメントを投稿