Вопросы и ответы о разработчике Bluetooth

В этой статье содержатся ответы на часто задаваемые вопросы по API Bluetooth UWP.

Какие API используются? Bluetooth Classic (RFCOMM) или Bluetooth Low Energy (GATT)?

Существуют различные обсуждения в Интернете вокруг этой общей темы, поэтому давайте будем держать этот ответ в квадрате на разницу в отношении Windows. Ниже приведены некоторые общие рекомендации.

Bluetooth LE (Windows.Devices.Bluetooth.GenericAttributeProfile)

Используйте API GATT при взаимодействии с устройством, поддерживающим Bluetooth Low Energy. Если ваш вариант использования нечасто, низкая пропускная способность или требует низкой мощности, Bluetooth Low Energy является ответом. Основное пространство имен, включающее эту функцию, — Windows.Devices.Bluetooth.GenericAttributeProfile.

Если не использовать Bluetooth LE

  • Сценарии высокой пропускной способности и высокой частоты. Если вам нужно постоянно синхронизироваться с большими объемами данных, рассмотрите возможность использования Bluetooth классической или даже Wi-Fi.

Bluetooth Classic (Windows.Devices.Bluetooth.Rfcomm)

API RFCOMM предоставляют разработчикам сокет для выполнения двунаправленного обмена данными по последовательному порту. После получения сокета методы написания и чтения довольно стандартны. Реализация этого представлена в примере Rfcomm Chat.

Если не использовать Bluetooth Rfcomm

  • Уведомления. Протокол Bluetooth GATT имеет определенную команду для этого и приведет к значительно меньшему энергопотреблению и более быстрому времени отклика.
  • Проверка близости или обнаружения присутствия. Лучше использовать API рекламы и подключиться через Bluetooth LE.

Почему устройство Bluetooth LE перестает отвечать после отключения?

Наиболее распространенной причиной этого является то, что удаленное устройство потеряло сведения о связывании. Большое количество старых устройств Bluetooth не требует проверки подлинности. Чтобы защитить пользователя, все транзакции связывания, выполненные из приложения "Параметры", потребуют проверки подлинности, и некоторые устройства не были разработаны с учетом этого.

Начиная с Windows 10 выпуска 1511, разработчики имеют контроль над подтверждением связывания. Пример перечисления и связывания устройств содержит сведения о различных аспектах связывания новых устройств.

В этом примере мы инициируем связывание с устройством без шифрования. Обратите внимание, что это будет работать только в том случае, если удаленное устройство не требует шифрования или проверки подлинности для работы.

// Get ceremony type and protection level selections
// You must select at least ConfirmOnly or the pairing attempt will fail
    DevicePairingKinds ceremonySelected = DevicePairingKinds.ConfirmOnly;

//  Workaround remote devices losing pairing information
    DevicePairingProtectionLevel protectionLevel = DevicePairingProtectionLevel.None

    DeviceInformationCustomPairing customPairing = deviceInfoDisp.DeviceInformation.Pairing.Custom;

// Declare an event handler - you don't need to do much in PairingRequestedHandler since the ceremony is "None"
    customPairing.PairingRequested += PairingRequestedHandler;
    DevicePairingResult result = await customPairing.PairAsync(ceremonySelected, protectionLevel);

Необходимо ли связать устройства Bluetooth перед их использованием?

Прежде чем использовать устройства Bluetooth RFCOMM (классическая модель), вам не нужно связывать устройства. Начиная с Windows 10 выпуска 1607, вы можете просто запросить ближайшие устройства и подключиться к ним. В обновленном примере чата RFCOMM показаны эти функции.

(14393 и ниже) Эта функция недоступна для Bluetooth Low Energy (клиент GATT), поэтому вам по-прежнему придется связаться с помощью страницы параметров или с помощью API Windows.Devices.Enumeration для доступа к этим устройствам.

(15030 и выше) Связывание устройств Bluetooth больше не требуется. Используйте новые api Async, такие как GetGattServicesAsync и GetCharacteristicsAsync, чтобы запросить текущее состояние удаленного устройства. Дополнительные сведения см. в документации клиента.

Когда следует связаться с устройством перед взаимодействием с ним?

Как правило, если требуется надежная, долгосрочная связь с устройством, свяжься с ним путем перенаправления пользователя на страницу параметров или с помощью API перечисления устройств и связывания. Если вам просто нужно прочитать информацию с устройства, которое предоставляется публично (датчик температуры или маяк), то подключите или прослушивайте объявления без каких-либо усилий, чтобы связаться с устройством. Это позволит предотвратить проблемы взаимодействия в долгосрочной перспективе, так как большое количество устройств не поддерживает связывание.

Поддерживают ли все устройства Windows периферийную роль?

№ Это зависимый от оборудования компонент, но предоставляется метод BluetoothAdapter.IsPeripheralRoleSupported, чтобы запрашивать, поддерживается ли она или нет. В настоящее время поддерживаемые устройства включают Windows Phone на 8992+ и RPi3 (Windows IoT).

Можно ли получить доступ к этим API из Win32?

Да, все эти API должны работать. В этом блоге подробно описан способ вызова API Windows из классических приложений.

Должна ли эта функция существовать в определенном номере SKU?

Bluetooth LE: Да, все функции доступны в OneCore и должны быть доступны на последних устройствах в стеке Bluetooth LE.

Предостережение. Периферийная роль зависит от оборудования, а некоторые выпуски Windows Server не поддерживают Bluetooth.

Bluetooth BR/EDR (классическая модель): некоторые варианты существуют, но в основном они имеют очень похожую поддержку уровня профиля. Ознакомьтесь с документацией по RFCOMM и этими поддерживаемыми документами профиля для ПК и телефона