Freigeben über


Bluetooth LE-Anzeigen

Dieses Thema bietet einen Überblick über Bluetooth Low Energy (LE) Advertisement Beacons für Universal Windows Platform (UWP) Anwendungen.

Wichtig

Sie müssen die „bluetooth“-Funktion in Package.appxmanifest deklarieren, um diese Funktion zu nutzen.

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

Wichtige APIs

Unterstützte Funktionen

Es gibt zwei Hauptfunktionen, die von den LE Advertisement APIs unterstützt werden:

  • Advertisement Watcher: Lauschen Sie auf nahegelegene Beacons und filtern Sie diese anhand der Nutzlast oder der Nähe heraus.
  • Advertisement Publisher: Definieren Sie eine Nutzlast für Windows, um im Namen eines Entwicklers zu werben.

Beispiel

Ein voll funktionsfähiges Beispiel für Bluetooth LE-Anzeigen finden Sie im Bluetooth Advertisement Sample auf Github.

Grundlegende Einrichtung

Um die grundlegende Bluetooth LE-Funktionalität in einer Universal Windows Platform-Anwendung zu verwenden, müssen Sie die Bluetooth-Funktion im Package.appxmanifest überprüfen.

  1. Paket.appxmanifest öffnen
  2. Gehen Sie zur Registerkarte „Capabilities“ (Funktionen)
  3. Suchen Sie Bluetooth in der Liste auf der linken Seite und aktivieren Sie das Kästchen daneben.

Anzeigen veröffentlichen

Bluetooth LE-Anzeigen ermöglichen es Ihrem Gerät, ständig ein bestimmtes Nutzsignal, eine so genannte Anzeige, zu senden. Diese Anzeige kann von jedem Bluetooth LE-fähigen Gerät in der Nähe gesehen werden, wenn es so eingestellt ist, dass es auf diese spezielle Anzeige hört.

Hinweis

Um die Privatsphäre der Benutzer zu schützen, ist die Lebensdauer Ihrer Werbung an die Ihrer App gebunden. Sie können einen BluetoothLEAdvertisementPublisher erstellen und Start in einer Hintergrundaufgabe für Werbung im Hintergrund aufrufen. Weitere Informationen zu Hintergrundaufgaben finden Sie unter Starten, Fortsetzen und Hintergrundaufgaben.

Es gibt viele verschiedene Möglichkeiten, Daten zu einer Anzeige hinzuzufügen. Dieses Beispiel zeigt eine gängige Methode zur Erstellung einer unternehmensspezifischen Anzeige.

Erstellen Sie zunächst den Werbeverlag, der steuert, ob das Gerät eine bestimmte Werbung ausstrahlt oder nicht.

BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();

Zweitens: Erstellen Sie einen benutzerdefinierten Datenabschnitt. Dieses Beispiel verwendet einen nicht zugewiesenen CompanyId Wert 0xFFFE und fügt den Text Hello World zur Anzeige hinzu.

// 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 Publisher 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 man einen Bluetooth LE Advertisement Watcher erstellt, einen Callback setzt und beginnt, alle LE-Anzeigen zu überwachen.

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

Um auch Anzeigen für Scan-Antworten zu erhalten, stellen Sie nach dem Erstellen des Watchers Folgendes ein. Beachten Sie, dass diese Funktion einen höheren Stromverbrauch verursacht und im Hintergrundmodus nicht verfügbar ist.

watcher.ScanningMode = BluetoothLEScanningMode.Active;

Auf ein bestimmtes Werbemuster achten

Manchmal möchte man auf eine bestimmte Werbung hören. In diesem Fall lauschen Sie auf eine Anzeige, die eine Nutzlast mit einer erfundenen Firma (identifiziert als 0xFFFE) und die Zeichenfolge Hello World in der Anzeige enthält. Dies kann mit dem Basic-Publishing-Beispiel gekoppelt werden, um einen Windows-Rechner als Werbeträger und einen anderen als Beobachter einzusetzen. Stellen Sie sicher, dass Sie diesen Werbefilter setzen, 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);

Ausschau halten nach einer Werbung in der Nähe

Manchmal möchten Sie Ihren Beobachter nur dann auslösen, wenn sich das werbende Gerät in Reichweite befindet. Sie können Ihren eigenen Bereich festlegen, beachten Sie jedoch, dass die Werte auf einen Wert 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);

Messung der Entfernung

Wenn der Rückruf Ihres Bluetooth LE Watchers ausgelöst wird, enthalten die eventArgs einen RSSI-Wert, der Ihnen die empfangene Signalstärke angibt (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 umgerechnet werden, sollte aber nicht zur Messung der tatsächlichen Entfernung verwendet werden, da jedes einzelne Funkgerät anders ist. Verschiedene Umgebungsfaktoren können die Messung der Entfernung erschweren (z. B. Wände, Gehäuse um das Funkgerät herum oder sogar die Luftfeuchtigkeit).

Eine Alternative zur Beurteilung der reinen Entfernung besteht darin, „Bereiche“ zu definieren. Funkgeräte neigen dazu, 0 bis -50 DBm zu melden, wenn sie sehr nah sind, -50 bis -90, wenn sie mittelweit entfernt sind, und unter -90, wenn sie weit entfernt sind. Am besten ermitteln Sie durch Ausprobieren, wie diese Bereiche für Ihre Anwendung aussehen sollen.