bluetooth
Rozpocznij korzystanie z Bluetooth LE w systemie Windows
Szukaj…
Uwagi
Dokumentacja
- Reklama - reprezentacja ładunku reklamy Bluetooth LE.
- Wydawca reklam - zarządza wysyłaniem reklam Bluetooth LE.
- Watcher reklamy - Zarządza oglądaniem reklam Bluetooth LE.
Notatki
- Windows 10 może działać tylko w trybie centralnym, więc może łączyć się tylko z urządzeniami obsługującymi tryb peryferyjny. Z tego powodu dwa urządzenia z systemem Windows 10 nie mogą połączyć się przez Bluetooth LE.
- Windows 10 musi być sparowany z urządzeniem Bluetooth LE, aby się z nim połączyć.
Początkowe ustawienia
Aby korzystać z dowolnej funkcji Bluetooth w aplikacji Universal Windows Platform, musisz sprawdzić zdolność Bluetooth
w Package.appxmanifest
.
- Otwórz
Package.appxmanifest
- Przejdź do zakładki
Capabilities
- Znajdź
Bluetooth
po lewej stronie i zaznacz pole obok niego
Utwórz reklamę LE Bluetooth
Ten przykład pokazuje, jak zareklamować niestandardowy ładunek z urządzenia z systemem Windows 10 na pierwszym planie. Ładunek korzysta z utworzonej firmy (oznaczonej jako 0xFFFE) i reklamuje ciąg Hello World
w reklamie.
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();
Uwaga: dotyczy to wyłącznie reklam na pierwszym planie (gdy aplikacja jest otwarta).
Słuchaj reklamy Bluetooth LE
Ogólne słuchanie
Ten przykład pokazuje, jak nasłuchiwać określonej reklamy.
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();
Filtr reklam: Słuchanie określonej reklamy
Czasami chcesz słuchać konkretnej reklamy. W takim przypadku nasłuchuj reklamy zawierającej ładunek utworzonej firmy (oznaczonej jako 0xFFFE) i zawierającej w reklamie ciąg Hello World. Można to sparować z przykładem Utwórz reklamę LE LE Bluetooth, aby reklama jednego komputera z systemem Windows i inny odsłuch.
Uwaga: pamiętaj o ustawieniu tego filtru reklam przed uruchomieniem obserwatora!
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);
Filtr sygnałów: nasłuchiwanie reklam proksymalnych
Czasami chcesz uruchomić obserwatora tylko wtedy, gdy reklama urządzenia znajdzie się w zasięgu. Możesz zdefiniować własny zakres, zwróć uwagę, że wartości normalne wynoszą od 0 do -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);
Callbacki
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
}
Uwaga: służy tylko do słuchania na pierwszym planie.
Ocena odległości na podstawie RSSI z reklamy Bluetooth LE
Po uruchomieniu oddzwaniania twojego zegarka Bluetooth LE Watcher eventArgs zawiera wartość RSSI informującą o sile odbieranego sygnału (jak silny jest
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
// The received signal strength indicator (RSSI)
Int16 rssi = eventArgs.RawSignalStrengthInDBm;
}
Można to z grubsza przełożyć na odległość, ale nie powinno się jej używać do pomiaru rzeczywistych odległości, ponieważ każde radio jest inne. Różne czynniki środowiskowe mogą utrudniać pomiar odległości (np. Ściany, obudowy wokół radia, a nawet wilgotność powietrza).
Alternatywą dla oceny odległości jest zdefiniowanie „segmentów”. Radia zgłaszają od 0 do -50 DBm, gdy są bardzo blisko, od -50 do -90, gdy znajdują się w średniej odległości, a poniżej -90, gdy są daleko. Próbę i błąd najlepiej jest określić, jakie mają być te segmenty dla Twojej aplikacji.