Пример кода для доступа к обслуживанию батареи с устройства ble в C с использованием bluez

У меня есть устройство ble, которое выдает состояние батареи в качестве службы батареи. Мне нужно прочитать информацию о батарее с моего устройства ble, используя язык программирования C из Linux, используя bluez. Я не мог нигде найти подходящего примера для этой цели, хотя есть примеры классического bluetooth. Я могу обнаружить свое устройство ble, используя пример кода здесь< /а>. Как я могу подключиться к моему устройству (у меня есть адрес устройства после сканирования)? Как я могу запросить обслуживание аккумулятора для моего устройства (я знаю дескриптор обслуживания моего аккумулятора)? Ожидается пример кода.


person Bill Goldberg    schedule 15.03.2017    source источник


Ответы (2)


У меня нет примера кода, но я могу указать вам исходный код, аналогичный тому, что вы сделали. Чтобы прочитать обслуживание батареи, вам понадобятся следующие шаги: -

  1. Как вы упомянули, просканируйте и определите адрес, который вы ищете. Это также можно найти в hcitool.c по адресу: -

static void cmd_lescan(int dev_id, int argc, char **argv) {...}

  1. Как только ваше устройство будет найдено, подключитесь к нему. Источник для этого можно найти по адресу hcitool.c, в:-

static void cmd_lecc(int dev_id, int argc, char **argv) {...}

  1. Затем вам нужно выполнить обнаружение характеристики, чтобы найти дескриптор характеристики, поскольку вы знаете UUID. Если ваше устройство использует принятый сервис батареи, то искомой характеристикой является 2A19. Код для обнаружения характеристик можно найти по адресу gatttool.c, по адресу:-

статические гбулевы характеристики (gpointer user_data) {...}

  1. Зная дескриптор, вы затем переходите к чтению значения характеристики. Код для этого можно найти в gatttool.c, в:-

static void char_read_cb(статус guint8, const guint8 *pdu, guint16 plen, gpointer user_data) {...}

В качестве альтернативы вы можете просто прочитать данные характеристики, используя UUID характеристики, если он вам уже известен. Это можно найти в gatttool.c по адресу: -

static void char_read_by_uuid_cb (статус guint8, const guint8 *pdu, guint16 plen, gpointer user_data)

Если вы новичок в BlueZ, я рекомендую начать с Инструменты командной строки BlueZ. Это поможет вам лучше понять, что происходит под капотом в исходном коде. Чтобы добиться того, чего вы хотите, с помощью инструментов командной строки, вам просто нужно:

- hcitool lescan
- gatttool -b 00:11:22:33:44:55 --characteristics 
- gatttool -b 00:11:22:33:44:55 --char-read --uuid=0x2A19

Где 00:11:22:33:44:55 нужно заменить на адрес устройства с сервисом батареи.

Надеюсь, это поможет.

person Youssif Saeed    schedule 21.03.2017
comment
Большое спасибо @yousif saeed: Не могли бы вы сказать, как я могу получить аргумент gpointer user_data функции «характеристики», о которой вы упоминали выше? - person Bill Goldberg; 23.03.2017

В большинстве примеров предлагается извлечь исходный код из Bluez, чтобы прочитать характеристики GATT. gattlib (C-библиотека) не требует от вас этого и построена на базе Bluez.

В библиотеке есть два примера, которые вы можете использовать для считывания уровня заряда батареи.

Вы можете использовать notification пример с подпиской на батарею уведомление об уровне. Или вы можете использовать read_write пример, чтобы прочитать уровень заряда батареи.

person OlivierM    schedule 05.03.2019