Bluetooth LE-Ankündigungen

Dieses Thema enthält eine Übersicht über Bluetooth Low Energy (LE)-Ankündigungsbeacons für Windows-Apps.

Important

Sie müssen die "Bluetooth"-Funktion in "Package.appxmanifest " deklarieren, um dieses Feature zu verwenden.

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

Unterstützte Funktionen

Es gibt zwei Hauptfunktionen, die von den LE-Ankündigungs-APIs unterstützt werden:

  • Advertising-Überwachung: Suchen Sie nach Beacons in der Nähe und filtern Sie diese anhand von Nutzdaten oder Nähe heraus.
  • Anzeigenherausgeber: Definiert ein Datenpaket, mit dem Windows im Namen eines Entwicklers werben kann.

Grundkonfiguration

Um grundlegende Bluetooth LE-Funktionen in einer Universelle Windows-Plattform-App zu verwenden, müssen Sie die Bluetooth-Funktion im Package.appxmanifest überprüfen.

  1. Öffnen Sie Package.appxmanifest
  2. Wechseln zur Registerkarte "Funktionen"
  3. Suchen Sie Bluetooth in der Liste auf der linken Seite, und aktivieren Sie das Kontrollkästchen daneben.

Veröffentlichen von Ankündigungen

Bluetooth LE-Ankündigungen ermöglichen Es Ihrem Gerät, ständig eine bestimmte Nutzlast zu signalisieren, die als Werbung bezeichnet wird. Diese Aussendung kann von jedem Bluetooth LE-fähigen Gerät in der Nähe empfangen werden, sofern es so konfiguriert ist, dass es auf genau diese Aussendung lauscht.

Note

Für den Datenschutz des Benutzers ist die Lebensdauer Ihrer Werbung an die Ihrer App gebunden. Sie können einen BluetoothLEAdvertisementPublisher erstellen und in einer Hintergrundaufgabe Start aufrufen, um im Hintergrund Aussendungen zu senden. Weitere Informationen zu Hintergrundaufgaben finden Sie unter Starten, Fortsetzen und Hintergrundaufgaben.

Es gibt viele verschiedene Möglichkeiten zum Hinzufügen von Daten zu einer Ankündigung. Dieses Beispiel zeigt eine gängige Methode zum Erstellen einer unternehmensspezifischen Werbung.

Erstellen Sie zunächst den Publisher für die Ankündigung, der steuert, ob das Gerät eine bestimmte Ankündigung aussendet oder nicht.

BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();

Erstellen Sie zweitens einen benutzerdefinierten Datenabschnitt. In diesem Beispiel wird ein nicht zugewiesener CompanyId Wert 0xFFFE verwendet und der Ankündigung der Text Hallo Welt hinzugefügt.

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

Nachdem der Herausgeber erstellt und eingerichtet wurde, können Sie "Start" aufrufen, um mit der Werbung zu beginnen.

publisher.Start();

Achten Sie auf Werbung

Der folgende Code veranschaulicht, wie Sie einen Bluetooth LE-Ankündigungsüberwachungs-Monitor erstellen, einen Rückruf festlegen und mit der Überwachung aller LE-Ankündigungen beginnen.

BluetoothLEAdvertisementWatcher watcher = new BluetoothLEAdvertisementWatcher();
watcher.Received += OnAdvertisementReceived;
watcher.Start();
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
    // Do whatever you want with the advertisement
}

Aktives Scannen

Wenn Sie auch Scanantwortanzeigen empfangen möchten, legen Sie folgendes fest, nachdem Sie den Watcher erstellt haben. Beachten Sie, dass dies zu einem größeren Leistungsabfluss führt und im Hintergrundmodus nicht verfügbar ist.

watcher.ScanningMode = BluetoothLEScanningMode.Active;

Auf ein bestimmtes Ankündigungsmuster achten

Manchmal möchten Sie auf eine bestimmte Werbung lauschen. In diesem Fall lauschen Sie auf eine Ankündigung, die eine Nutzlast mit einem gebildeten Unternehmen (identifiziert als 0xFFFE) und die Zeichenfolge Hallo Welt in der Ankündigung enthält. Dies kann mit dem Basic-Publishing-Beispiel kombiniert werden, sodass ein Windows-Rechner annonciert und ein anderer lauscht. Achten Sie darauf, diesen Ankündigungsfilter festzulegen, bevor Sie den Watcher starten!

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

Achten Sie auf eine Ankündigung in der Nähe

Manchmal möchten Sie Ihren Watcher nur auslösen, wenn die Gerätewerbung in Reichweite ist. Sie können Ihren eigenen Bereich definieren, beachten Sie dabei nur, dass die Werte auf den Bereich zwischen 0 und -128 begrenzt werden.

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

Messabstand

Wenn der Rückruf Ihrer Bluetooth LE Watcher ausgelöst wird, enthalten die eventArgs einen RSSI-Wert, der Ihnen die Empfangene Signalstärke mitteilt (wie stark das Bluetooth-Signal ist).

private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
   // The received signal strength indicator (RSSI)
   Int16 rssi = eventArgs.RawSignalStrengthInDBm;
}

Dies kann grob in Entfernung übersetzt werden, sollte aber nicht verwendet werden, um echte Entfernungen zu messen, da jedes einzelne Radio unterschiedlich ist. Verschiedene Umweltfaktoren können es erschweren, die Entfernung abzuschätzen (wie etwa Wände, Gehäuse um das Funkgerät oder sogar die Luftfeuchtigkeit).

Eine Alternative zur Beurteilung der reinen Entfernung besteht darin, "Buckets" zu definieren. Funkgeräte geben in der Regel 0 bis -50 dBm an, wenn sie sehr nahe sind, -50 bis -90 dBm, wenn sie sich in mittlerer Entfernung befinden, und unter -90 dBm, wenn sie weit entfernt sind. Versuch und Irrtum ist der beste Weg, um festzulegen, was diese Buckets für Ihre App sein sollen.

Example

Ein voll funktionsfähiges Beispiel für Bluetooth LE-Ankündigungen finden Sie im Bluetooth-Ankündigungsbeispiel auf Github.