bluetooth
WindowsでBluetooth LEを使い始める
サーチ…
備考
ドキュメンテーション
- Advertisement(広告) - Bluetooth LEの広告ペイロードを表します。
- Advertisement Publisher - Bluetooth LE広告の送信を管理します。
- Advertisement Watcher - Bluetooth LE広告の監視を管理します。
ノート
- Windows 10はセントラルモードでしか動作できないため、ペリフェラルモードをサポートするデバイスにしか接続できません。このため、2台のWindows 10デバイスはBluetooth LE経由で接続できません。
- Windows 10に接続するには、Windows 10をBluetooth LEデバイスとペアにする必要があります。
初期設定
Universal Windows PlatformアプリケーションでBluetooth機能を使用するには、 Package.appxmanifest
Bluetooth
機能を確認する必要があります。
-
Package.appxmanifest
開く - [
Capabilities
]タブに移動します。 - 左の
Bluetooth
を見つけて、その横にあるチェックボックスをオンにします
Bluetooth LE広告を作成する
この例は、フォアグラウンドでWindows 10デバイスからカスタムペイロードをアドバタイズする方法を示しています。ペイロードは、作成された会社(0xFFFEとして識別される)を使用し、広告内に文字列Hello World
をアドバタイズします。
BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();
// 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);
publisher.Start();
注:これは、アプリが開いている間は、フォアグラウンドでの広告用です。
Bluetooth LE広告を聞く
一般的なリスニング
この例は、特定の広告を聞く方法を示しています。
BluetoothLEAdvertisementWatcher watcher = new BluetoothLEAdvertisementWatcher();
// Use active listening if you want to receive Scan Response packets as well
// this will have a greater power cost.
watcher.ScanningMode = BluetoothLEScanningMode.Active;
// Register a listener, this will be called whenever the watcher sees an advertisement.
watcher.Received += OnAdvertisementReceived;
watcher.Start();
広告フィルタ:特定の広告のリッスン
場合によっては、特定の広告を聞きたいこともあります。この場合、(0xFFFEとして識別される)構成された会社のペイロードを含む広告を聞き、広告内にHello Worldという文字列を含めます。これは、1台のWindowsマシン広告ともう1つのリスニングを行うために、Bluetooth LE広告の作成の例と組み合わせることができます。
注:ウォッチャーを開始する前に、この広告フィルタを設定してください!
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);
コールバック
watcher.Received += OnAdvertisementReceived;
watcher.Stopped += OnAdvertisementWatcherStopped;
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
// Do whatever you want with the advertisement
// The received signal strength indicator (RSSI)
Int16 rssi = eventArgs.RawSignalStrengthInDBm;
}
private async void OnAdvertisementWatcherStopped(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementWatcherStoppedEventArgs eventArgs)
{
// Watcher was stopped
}
注:これは、フォアグラウンドで聞くためのものです。
Bluetooth LE広告からのRSSIに基づく判定距離
Bluetooth LEウォッチャーのコールバックがトリガーされると、eventArgsには受信した信号強度を示す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未満を報告する傾向があります。試用版とエラーは、あなたがアプリケーションのためにこれらのバケツを何にしたいかを決定するのが最善です。