Bluetooth LE アドバタイズメント

このトピックでは、Windows アプリの Bluetooth Low Energy (LE) Advertisement ビーコンの概要について説明します。

Important

この機能を使用するには、 Package.appxmanifest で "bluetooth" 機能を宣言する必要があります。

<Capabilities> <DeviceCapability Name="bluetooth" /> </Capabilities>

サポートされている機能

LE アドバタイズ API でサポートされる主な機能は 2 つあります。

  • 広告ウォッチャー:近くのビーコンをリッスンし、ペイロードまたは近接性に基づいてそれらを除外します。
  • Advertisement Publisher: 開発者に代わってアドバタイズするWindowsのペイロードを定義します。

基本的なセットアップ

ユニバーサル Windows プラットフォーム アプリで基本的なBluetooth LE 機能を使用するには、Package.appxmanifest のBluetooth機能を確認する必要があります。

  1. Package.appxmanifest を開く
  2. [機能] タブに移動する
  3. 左側の一覧でBluetoothを見つけて、その横にあるチェック ボックスをオンにします。

広告の公開

Bluetooth LE Advertisements を使用すると、デバイスは広告と呼ばれる特定のペイロードを常にビーコンアウトできます。 このアドバタイズは、この特定のアドバタイズをリッスンするように設定されている場合、近くの Bluetooth LE 対応デバイスで確認できます。

Note

ユーザーのプライバシーのために、広告の有効期間はアプリの有効期間に関連付けられています。 BluetoothLEAdvertisementPublisher を作成し、バックグラウンドタスクで Start を呼び出してバックグラウンドでアドバタイズすることができます。 バックグラウンド タスクの詳細については、「 起動、再開、およびバックグラウンド タスク」を参照してください。

広告にデータを追加するには、さまざまな方法があります。 この例では、会社固有の広告を作成する一般的な方法を示します。

まず、デバイスが特定のアドバタイズをビーコンアウトしているかどうかを制御するアドバタイズパブリッシャーを作成します。

BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();

次に、カスタム データ セクションを作成します。 この例では、割り当てられていない CompanyId0xFFFE を使用し、テキスト 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 アドバタイズウォッチャーを作成し、コールバックを設定し、すべての 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.ScanningMode = BluetoothLEScanningMode.Active;

特定のアドバタイズ パターンを監視する

特定の広告をリッスンしたい場合があります。 この場合は、架空の会社(0xFFFE として識別される)を含むペイロードが含まれ、かつアドバタイズメント内に文字列 Hello World を含むアドバタイズメントを待ち受けます。 これは Basic Publishing の例と組み合わせることで、1 台の Windows マシンがアドバタイズを行い、別の 1 台が監視する構成にできます。 ウォッチャーを開始する前に、必ずこの広告フィルターを設定してください。

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);

近くの広告を見る

場合によっては、デバイスの広告が範囲内に入ったときにのみウォッチャーをトリガーしたい場合があります。 独自の範囲を定義できます。値は 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;
}

これは大まかに距離に変換できますが、個々の無線が異なるので、実際の距離を測定するために使用しないでください。 環境要因が異なると、距離の測定が困難になる場合があります (壁、無線周りのケース、空気湿度など)。

純粋な距離を判断する代わりに、"バケット" を定義します。 無線では、DBm が非常に近い場合は 0 から -50、距離が中程度の場合は -90 -50、遠くにある場合は -90 より低いと報告される傾向があります。 アプリでこれらのバケットをどう設定するかを見極めるには、試行錯誤が最善です。

Bluetooth LE Advertisements の完全に機能する例については、Github の Bluetooth Advertisement Sample を参照してください。