Bluetooth LE アドバタイズ
このトピックでは、ユニバーサル Windows プラットフォーム (UWP) アプリ用の Bluetooth Low Energy (LE) アドバタイズ ビーコンの概要について説明します。
重要
この機能を使用するには、Package.appxmanifest で "bluetooth" 機能を宣言する必要があります。
<Capabilities> <DeviceCapability Name="bluetooth" /> </Capabilities>
重要な API
サポートされている機能
LE アドバタイズ API でサポートされる 2 つのメイン機能があります。
- アドバタイズ Watcher: 近くのビーコンをリッスンし、ペイロードまたは近接性に基づいてそれらを除外します。
- アドバタイズ公開元: 開発者に代わってアドバタイズする Windows のペイロードを定義します。
例
Bluetooth LE アドバタイズの完全な機能例については、Github の「Bluetooth アドバタイズ サンプル」を参照してください。
基本的なセットアップ
ユニバーサル Windows プラットフォーム アプリで基本的な Bluetooth LE 機能を使用するには、Package.appxmanifest で Bluetooth 機能をチェックする必要があります。
- Package.appxmanifest を開きます
- [機能] タブに移動します
- 左側の一覧で Bluetooth を探し、その横にあるボックスをチェックします。
アドバタイズの公開
Bluetooth LE アドバタイズを使用すると、デバイスはアドバタイズと呼ばれる特定のペイロードを常にビーコン アウトできます。 このアドバタイズは、近くの Bluetooth LE 対応デバイスがこの特定のアドバタイズをリッスンするように設定されている場合、そのデバイスで確認できます。
Note
ユーザーのプライバシー保護のために、アドバタイズの有効期間はアプリの有効期間に関連付けられています。 BluetoothLEAdvertisementPublisher を作成し、バックグラウンドタスクで Start を呼び出してバックグラウンドでアドバタイズできます。 バックグラウンドタスクの詳細については、 「起動、再開、およびバックグラウンドタスク」 を参照してください。
アドバタイズにデータを追加するには、さまざまな方法があります。 この例では、会社固有のアドバタイズを作成する一般的な方法を示します。
まず、デバイスで特定のアドバタイズをビーコン アウトするかどうかを制御するアドバタイズ公開元を作成します。
BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();
次に、カスタム データ セクションを作成します。 この例では、割り当てられていない CompanyId 値 0xFFFE を使用し、Hello World というテキストをアドバタイズに追加します。
// Add custom data to the advertisement
var manufacturerData = new BluetoothLEManufacturerData();
manufacturerData.CompanyId = 0xFFFE;
var writer = new DataWriter();
writer.WriteString("Hello World");
// Make sure that the buffer length can fit within an advertisement payload (~20 bytes).
// Otherwise you will get an exception.
manufacturerData.Data = writer.DetachBuffer();
// Add the manufacturer data to the advertisement publisher:
publisher.Advertisement.ManufacturerData.Add(manufacturerData);
公開元の作成とセットアップが終わったところで、Start を呼び出してアドバタイズを開始できます。
publisher.Start();
アドバタイズの監視
次のコードは、Bluetooth LE アドバタイズ Watcher の作成方法、コールバックの設定方法、すべての LE アドバタイズの監視の開始方法を示しています。
BluetoothLEAdvertisementWatcher watcher = new BluetoothLEAdvertisementWatcher();
watcher.Received += OnAdvertisementReceived;
watcher.Start();
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
// Do whatever you want with the advertisement
}
アクティブ スキャン
スキャン応答のアドバタイズも受信するには、Watcher の作成後に次の設定を行います。 これは電力消耗の増加を引き起こし、バックグラウンド モードでは使用できない点にご注意ください。
watcher.ScanningMode = BluetoothLEScanningMode.Active;
特定のアドバタイズ パターンの監視
特定のアドバタイズのリッスンが必要な場合があります。 この場合は、構成された会社 (0xFFFE として識別される) のペイロードを含み、アドバタイズに文字列 Hello World が含まれているアドバタイズをリッスンします。 これを基本的な公開の例と組み合わせて、1 台の Windows コンピューターでアドバタイズし、別のコンピューターで監視を行うことができます。 Watcher を開始する前に、必ずこのアドバタイズ フィルターを設定してください。
var manufacturerData = new BluetoothLEManufacturerData();
manufacturerData.CompanyId = 0xFFFE;
// Make sure that the buffer length can fit within an advertisement payload (~20 bytes).
// Otherwise you will get an exception.
var writer = new DataWriter();
writer.WriteString("Hello World");
manufacturerData.Data = writer.DetachBuffer();
watcher.AdvertisementFilter.Advertisement.ManufacturerData.Add(manufacturerData);
近くのアドバタイズの監視
場合によっては、デバイスのアドバタイズが範囲内に入ったときにのみ Watcher をトリガーする必要があります。 独自の範囲を定義できますが、値は 0 から -128 の間でクリップされることにご注意ください。
// Set the in-range threshold to -70dBm. This means advertisements with RSSI >= -70dBm
// will start to be considered "in-range" (callbacks will start in this range).
watcher.SignalStrengthFilter.InRangeThresholdInDBm = -70;
// Set the out-of-range threshold to -75dBm (give some buffer). Used in conjunction
// with OutOfRangeTimeout to determine when an advertisement is no longer
// considered "in-range".
watcher.SignalStrengthFilter.OutOfRangeThresholdInDBm = -75;
// Set the out-of-range timeout to be 2 seconds. Used in conjunction with
// OutOfRangeThresholdInDBm to determine when an advertisement is no longer
// considered "in-range"
watcher.SignalStrengthFilter.OutOfRangeTimeout = TimeSpan.FromMilliseconds(2000);
距離の計測
Bluetooth LE Watcher のコールバックがトリガーされると、eventArgs には受信信号の強度 (Bluetooth 信号の強度) を示す RSSI 値が含まれます。
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
// The received signal strength indicator (RSSI)
Int16 rssi = eventArgs.RawSignalStrengthInDBm;
}
これを大まかな距離に換算することはできますが、個々の無線が異なるため、これを使って実際の距離を測定しないでください。 環境要因が異なると、距離の測定が難しい場合があります (壁、無線周りのケース、空気湿度など)。
純粋な距離を判断する代わりの方法として、"バケット" を定義します。 無線は、非常に近い場合は 0 から -50 DBm、中程度の距離の場合は -50 から -90、遠く離れている場合は -90 未満と報告される傾向があります。 アプリに必要なバケットの状態を決めるには、試行錯誤が最適です。