bluetooth
Aan de slag met Bluetooth LE op Windows
Zoeken…
Opmerkingen
Documentatie
- Advertentie - Een weergave van een payload voor Bluetooth LE-advertenties.
- Advertentie-uitgever - beheert het verzenden van Bluetooth LE-advertenties.
- Advertisement Watcher - Beheert het bekijken van Bluetooth LE-advertenties.
Notes
- Windows 10 kan alleen in de centrale modus werken, dus het kan alleen verbinding maken met apparaten die de perifere modus ondersteunen. Hierdoor kunnen twee Windows 10-apparaten geen verbinding maken via Bluetooth LE.
- Windows 10 moet worden gekoppeld met een Bluetooth LE-apparaat om er verbinding mee te kunnen maken.
Initiële setup
Als u Bluetooth-functies op een Universal Windows Platform-app wilt gebruiken, moet u de Bluetooth
functionaliteit in het Package.appxmanifest
.
- Open
Package.appxmanifest
- Ga naar het tabblad
Capabilities
- Zoek links
Bluetooth
en vink het vakje ernaast aan
Maak een Bluetooth LE-advertentie
Dit voorbeeld laat zien hoe u een aangepaste payload kunt adverteren vanaf een Windows 10-apparaat op de voorgrond. De payload maakt gebruik van een verzonnen bedrijf (geïdentificeerd als 0xFFFE) en adverteert de string Hello World
in de advertentie.
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();
Opmerking: dit is alleen voor advertenties op de voorgrond (terwijl de app open is).
Luister naar een Bluetooth LE-advertentie
Algemeen luisteren
Dit voorbeeld laat zien hoe u naar een specifieke advertentie kunt luisteren.
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();
Advertentiefilter: luisteren naar een specifieke advertentie
Soms wilt u naar een specifieke advertentie luisteren. Luister in dit geval naar een advertentie met een lading bij een verzonnen bedrijf (geïdentificeerd als 0xFFFE) en met de tekenreeks Hello World in de advertentie. Dit kan worden gecombineerd met het voorbeeld Een Bluetooth LE-advertentie maken om een Windows-machine te laten adverteren en een andere te laten luisteren.
Opmerking: zorg ervoor dat u dit advertentiefilter instelt voordat u uw watcher start!
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);
Signaalfilter: luisteren naar proximale advertenties
Soms wilt u uw watcher alleen activeren wanneer de apparaatadvertenties binnen bereik zijn gekomen. U kunt uw eigen bereik definiëren, houd er rekening mee dat de normale waarden tussen 0 en -128 liggen.
// 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);
callbacks
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
}
Opmerking: dit is alleen voor het luisteren op de voorgrond.
Beoordeling van de afstand op basis van RSSI van een Bluetooth LE-advertentie
Wanneer de callback van uw Bluetooth LE Watcher wordt geactiveerd, bevatten de eventArgs een RSSI-waarde die u de sterkte van het ontvangen signaal aangeeft (hoe sterk de
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
// The received signal strength indicator (RSSI)
Int16 rssi = eventArgs.RawSignalStrengthInDBm;
}
Dit kan grofweg worden vertaald in afstand, maar mag niet worden gebruikt om ware afstanden te meten, omdat elke afzonderlijke radio anders is. Verschillende omgevingsfactoren kunnen de afstand bemoeilijken (zoals muren, behuizingen rond de radio of zelfs luchtvochtigheid).
Een alternatief voor het beoordelen van pure afstand is het definiëren van "emmers". Radio's hebben de neiging om 0 tot -50 DBm te rapporteren als ze heel dichtbij zijn, -50 tot -90 als ze op middellange afstand zijn, en onder -90 als ze ver weg zijn. Probeer het uit en probeer het beste om te bepalen wat deze emmers voor uw toepassing zijn.