なお、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 件のコメント:
コメントを投稿