Annunci Bluetooth LE

Questo argomento offre una panoramica dei beacon pubblicitari Bluetooth a basso consumo (LE) per le app UWP (Universal Windows Platform).

Importante

Per usare questa funzionalità, è necessario dichiarare la funzionalità "bluetooth" in Package.appxmanifest .

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

API importanti

Funzionalità supportate

Esistono due funzionalità principali supportate dalle API degli annunci LE:

  • Watcher annuncio: ascolta i beacon nelle vicinanze e filtrali in base al payload o alla prossimità.
  • Autore annuncio: definisci un payload per Windows in modo da annunciare per conto di un developer.

Esempio

Per un esempio completamente funzionale degli annunci Bluetooth LE, si veda Esempio di annuncio Bluetooth su Github.

Impostazione di base

Per usare la funzionalità Bluetooth LE di base in un'app piattaforma UWP (Universal Windows Platform), è necessario controllare la funzionalità Bluetooth in Package.appxmanifest.

  1. Aprire Package.appxmanifest
  2. Accedere alla scheda Accedere alla scheda Funzionalità
  3. Trovare Bluetooth nell'elenco a sinistra e selezionare la casella accanto.

Pubblicazione di annunci

Gli annunci Bluetooth LE consentono al dispositivo di far lampeggiare costantemente un payload specifico, denominato annuncio. Tale annuncio può essere visualizzato da qualsiasi dispositivo con supporto Bluetooth LE nelle vicinanze, se sono configurati per ascoltare questo specifico annuncio.

Nota

Per la privacy degli utenti, la durata dell'annuncio pubblicitario è legata a quella della propria app. È possibile creare un BluetoothLEAdvertisementPublisher e richiamare Start in un'attività in background per l'annuncio in background. Per altre informazioni sulle attività in background, vedere Avvio, ripresa e attività in background.

Esistono molti modi diversi per aggiungere dati a un annuncio. Questo esempio illustra un modo comune per creare un annuncio specifico dell'azienda.

Prima di tutto, creare l'editore di annunci, che controlla se il dispositivo sta facendo il beaconing di un annuncio specifico.

BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();

In secondo luogo, creare una sezione dati personalizzata. Questo esempio usa un CompanyId valore 0xFFFE non assegnato e aggiunge il testo Hello World all'annuncio.

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

Una volta che l'editore è stato creato e configurato, è possibile accedere a Start per iniziare l'annuncio.

publisher.Start();

Controllo degli annunci

Il codice seguente illustra come creare un watcher per gli annunci Bluetooth LE, impostare un callback e iniziare a guardare tutti gli annunci 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
}

Scansione attiva

Per ricevere anche gli annunci di risposta scansione, impostare quanto segue dopo aver creato il watcher. Si noti che ciò causerà un maggiore consumo di energia e non è disponibile mentre in modalità in background.

watcher.ScanningMode = BluetoothLEScanningMode.Active;

Controllo di un modello di annuncio specifico

A volte si desidera ascoltare un annuncio specifico. In questo caso, ascoltare un annuncio contenente un payload con una società costituita (identificata come 0xFFFE) e contenente la stringa Hello World nell'annuncio. Questo può essere associato all'esempio di pubblicazione base per fare in modo che un computer Windows annunci e un altro guardi. Assicurarsi di impostare questo filtro pubblicitario prima di iniziare il 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);

Visualizzazione di un annuncio nelle vicinanze

A volte vuoi attivare il tuo watcher solo quando la pubblicità del dispositivo è disponibile nell'intervallo. È possibile definire un intervallo personalizzato, ma si noti che i valori verranno ritagliati tra 0 e -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);

Distanza di valutazione

Quando viene attivato il callback del watcher Bluetooth LE, gli eventArgs includono un valore RSSI indicante la forza del segnale ricevuto (ossia, quanto è forte il segnale Bluetooth).

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

Questo può essere convertito approssimativamente in distanza, ma non deve essere usato per misurare le vere distanze in quanto ogni singola radio è diversa. Diversi fattori ambientali possono rendere difficile misurare la distanza (ad esempio pareti, casse intorno alla radio o anche umidità dell'aria).

Un'alternativa a giudicare la distanza pura consiste nel definire i "bucket". Le radio tendono a segnalare da 0 a -50 DBm quando sono molto vicine, da -50 a -90 quando sono una distanza media e al di sotto di -90 quando sono lontani. La versione di valutazione e l'errore sono i migliori per determinare quali siano i bucket desiderati per la propria app,