Объявления Bluetooth LE
В этом разделе представлен обзор маяков рекламы Bluetooth Low Energy (LE) для приложений универсальная платформа Windows (UWP).
Внимание
Чтобы использовать эту функцию, необходимо объявить функцию Bluetooth в Package.appxmanifest .
<Capabilities> <DeviceCapability Name="bluetooth" /> </Capabilities>
Важные API
Поддерживаемые функции
Существует две основные функции, поддерживаемые API рекламы LE:
- Наблюдатель за рекламой: прослушивать близлежащие маяки и фильтровать их на основе полезных данных или близости.
- Издатель рекламы: определите полезные данные для Windows для объявления от имени разработчиков.
Пример
Полный функциональный пример рекламы Bluetooth LE см. в примере объявления Bluetooth на Github.
Базовая настройка
Чтобы использовать базовые функции Bluetooth LE в приложении универсальная платформа Windows, необходимо проверить возможность Bluetooth в Package.appxmanifest.
- Открытие Package.appxmanifest
- Перейдите на вкладку "Возможности"
- Найдите Bluetooth в списке слева и установите флажок рядом с ним.
Публикация объявлений
Объявления Bluetooth LE позволяют вашему устройству постоянно маякивать определенные полезные данные, называемые объявлением. Это объявление можно увидеть любым близлежащим устройством Bluetooth LE, если они настроены для прослушивания этой конкретной рекламы.
Примечание.
Для конфиденциальности пользователей срок действия рекламы связан с вашим приложением. Вы можете создать BluetoothLEAdvertisementPublisher и вызвать start в фоновой задаче для рекламы в фоновом режиме. Дополнительные сведения о фоновых задачах см. в разделе "Запуск", "Возобновление" и фоновые задачи.
Существует множество различных способов добавления данных в объявление. В этом примере показан общий способ создания рекламы для конкретной компании.
Сначала создайте издателя рекламы, который управляет тем, является ли устройство маяком определенной рекламы.
BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();
Во-вторых, создайте пользовательский раздел данных. В этом примере используется неназначенные значения CompanyId 0xFFFE и добавляет текст Hello World в объявление.
// 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);
Теперь, когда издатель был создан и настроен, можно вызвать start , чтобы начать рекламу.
publisher.Start();
Просмотр рекламных объявлений
В следующем коде показано, как создать наблюдатель за рекламой Bluetooth LE, задать обратный вызов и начать смотреть все объявления 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
}
Активное сканирование
Чтобы получить объявления ответов сканирования, задайте следующее после создания наблюдателя. Обратите внимание, что это приведет к большему энергопотреблению и недоступно в фоновом режиме.
watcher.ScanningMode = BluetoothLEScanningMode.Active;
Просмотр определенного шаблона рекламы
Иногда вы хотите слушать определенное объявление. В этом случае прослушивайте рекламу, содержащую полезные данные с составленной компанией (идентифицированной как 0xFFFE) и содержащей строку Hello World в объявлении. Это можно связать с примером "Базовая публикация", чтобы иметь одну рекламу компьютеров Windows и другую проверку. Перед запуском наблюдателя обязательно установите этот фильтр рекламы!
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);
Наблюдение за объявлением поблизости
Иногда вы хотите активировать ваш наблюдатель, когда реклама устройства пришла в диапазон. Вы можете определить собственный диапазон, просто обратите внимание, что значения будут обрезаться в диапазоне от 0 до -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);
Расстояние от гаугинга
Когда активируется обратный вызов Bluetooth LE Watcher, событиеArgs включает значение RSSI, указывающее уровень полученного сигнала (как сильный сигнал Bluetooth).
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
// The received signal strength indicator (RSSI)
Int16 rssi = eventArgs.RawSignalStrengthInDBm;
}
Это может быть грубо переведено на расстояние, но не следует использовать для измерения истинных расстояний, так как каждый отдельный радио отличается. Различные экологические факторы могут затруднить расстояние для датчика (например, стены, случаи вокруг радио или даже влажности воздуха).
Альтернативой судить чистое расстояние является определение "контейнеров". Радио, как правило, сообщает 0 до -50 DBm, когда они очень близки, -50 до -90, когда они находятся в среднем расстоянии, и ниже -90, когда они далеко. Пробная версия и ошибка лучше всего определить, что вы хотите, чтобы эти контейнеры были для вашего приложения.