Я изучаю BlueZ и BLE. В каталоге bluez/test находится "пример сервера gatt" на python. Я прочитал код и почти понял, как он работает, но что-то не понятно. Например, существует этот метод, который уведомляет об изменении значения характеристики (в данном примере это значение уровня заряда батареи):
def notify_battery_level(self):
if not self.notifying:
return
self.PropertiesChanged(
GATT_CHRC_IFACE,
{ 'Value': [dbus.Byte(self.battery_lvl)] }, [])
Метод PropertiesChanged определен так:
@dbus.service.signal(DBUS_PROP_IFACE,
signature='sa{sv}as')
def PropertiesChanged(self, interface, changed, invalidated):
pass
Я начинаю рекламу и запускаю этот пример, затем использую на своем смартфоне приложение сканера BLE для считывания характеристики (в данном случае уровня заряда батареи). Ну, self.battery_lvl - это целое число (например, 24), но на самом сканере в качестве значения характеристики я вижу "уровень заряда батареи 24%". Проблема в том, что нигде в коде не добавлен "% уровень заряда батареи" к self.battery_lvl (просто 24). Так, где эта дополнительная информация добавлена? Извините за мой английский. Если вам нужна дополнительная информация, пожалуйста, сообщите мне
В примере уровня заряда батареи используется UUID службы Bluetooth (0x180F) и формат атрибута (см. Это). Таким образом, когда приложение для мобильного телефона находит службу и видит UUID, оно будет знать, что это служба батареи, и добавит% при чтении значения. Это является основным преимуществом при использовании принятых услуг/характеристик по сравнению с пользовательскими, вы можете добавить интеллектуальные данные на удаленном конце, потому что локальный конец имеет предопределенный формат. Обратите внимание, что это также относится к принятой службе/характеристике сердечного ритма (приложение сразу добавит уд./Мин.), Принятой службе температуры/характеристике (приложение сразу добавит (° C) и т.д.
Для полного списка принятых услуг и характеристик, пожалуйста, смотрите эти ссылки: -
Для дальнейшего чтения по этой теме: -
Надеюсь, это поможет.