bluetooth
Inizia con Bluetooth LE su Windows
Ricerca…
Osservazioni
Documentazione
- Pubblicità - Una rappresentazione di un carico utile pubblicitario di Bluetooth LE.
- Annuncio Editore - Gestisce l'invio di annunci Bluetooth LE.
- Advertisement Watcher - Gestisce la visione degli annunci Bluetooth LE.
Gli appunti
- Windows 10 può solo agire in modalità centrale, quindi può connettersi solo a dispositivi che supportano la modalità periferica. Per questo motivo, due dispositivi Windows 10 non possono connettersi tramite Bluetooth LE.
- Windows 10 deve essere associato a un dispositivo Bluetooth LE per connettersi ad esso.
Configurazione iniziale
Per utilizzare qualsiasi funzionalità Bluetooth su un'app Universal Platform Platform, è necessario verificare la funzionalità Bluetooth
nel Package.appxmanifest
.
- Apri
Package.appxmanifest
- Vai alla scheda
Capabilities
- Trova
Bluetooth
sulla sinistra e seleziona la casella accanto ad essa
Creare un annuncio LE Bluetooth
Questo esempio mostra come pubblicizzare un payload personalizzato da un dispositivo Windows 10 in primo piano. Il payload utilizza una società composta (identificata come 0xFFFE) e pubblicizza la stringa Hello World
nella pubblicità.
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();
Nota: questo è solo per la pubblicità in primo piano (mentre l'app è aperta).
Ascolta un annuncio Bluetooth LE
Ascolto generale
Questo esempio mostra come ascoltare un annuncio specifico.
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();
Filtro pubblicitario: ascolto di un annuncio specifico
A volte vuoi ascoltare per un annuncio specifico. In questo caso, ascolta un annuncio contenente un carico utile con una società costituita (identificata come 0xFFFE) e contenente la stringa Hello World nell'annuncio. Questo può essere accoppiato con l'esempio di creazione di un annuncio LE Bluetooth per avere una pubblicità di macchine Windows e un altro ascolto.
Nota: assicurati di impostare questo filtro pubblicitario prima di avviare l'osservatore!
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);
Filtro del segnale: ascolto per annunci prossimali
A volte vuoi solo attivare il tuo osservatore quando la pubblicità del dispositivo è arrivata nel raggio d'azione. È possibile definire il proprio intervallo, basta notare che i valori normali sono compresi 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);
callback
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
}
Nota: questo è solo per l'ascolto in primo piano.
Valutazione della distanza in base a RSSI da una pubblicità Bluetooth LE
Quando viene attivata la richiamata del Bluetooth LE Watcher, gli eventArgs includono un valore RSSI che indica la forza del segnale ricevuto (quanto è forte il
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
// The received signal strength indicator (RSSI)
Int16 rssi = eventArgs.RawSignalStrengthInDBm;
}
Questo può essere approssimativamente tradotto in distanza, ma non dovrebbe essere usato per misurare le vere distanze in quanto ogni singola radio è diversa. Diversi fattori ambientali possono rendere difficile la misurazione della distanza (ad esempio muri, custodie intorno alla radio o persino umidità dell'aria).
Un'alternativa al giudicare la pura distanza è definire "secchi". Le radio tendono a riportare da 0 a -50 dBm quando sono molto vicine, da -50 a -90 quando sono a media distanza e sotto -90 quando sono lontane. La prova e l'errore sono i migliori per determinare cosa vuoi che questi bucket siano per la tua applicazione.