Программирование ARM ESP-IDF: обмен данными между сервером BLE и клиентом BLE Fri, March 29 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

ESP-IDF: обмен данными между сервером BLE и клиентом BLE Печать
Добавил(а) microsin   

Под сервером BLE подразумевается устройство BLE (peripheral), которое выдает оповещение в эфир (advertising). Под клиентом BLE понимается главное устройство (central), которое подключается к серверу BLE и управляет процессом обмена.

[Поддержка характеристик GATTS сервера в актуальном состоянии]

Данные передаются от сервера к клиенту по запросу сервера. Сервер должен поддерживать в актуальном состоянии значение своих характеристик (переменных GATTS), чтобы клиент мог прочитать их текущее значение. Это актуально для значений характеристик, которые имеют в своем составе как флаги доступа ESP_GATT_CHAR_PROP_BIT_WRITE, ESP_GATT_CHAR_PROP_BIT_READ, ESP_GATT_CHAR_PROP_BIT_NOTIFY, так и различные комбинации этих флагов.

Сервер может модифицировать переменные GATTS следующим образом:

err = esp_ble_gatts_set_attr_value(gatts_handle_table[attr_idx],
                                   size,
                                   (uint8_t*)&value);

Здесь массив gatts_handle_table это таблица дескрипторов базы характеристик GATTS, которая заполняется при обработке события ESP_GATTS_CREAT_ATTR_TAB_EVT профиля gatts_profile_event_handler. Переменная size это размер модифицируемых данных атрибута, value это буфер, где содержаться данные, которые будут копироваться в атрибут.

[Передача оповещения об изменении характеристики]

Сервер может выдавать оповещение NOTIFY клиенту BLE следующим образом:

1. При декларации характеристики нужно указать в её свойствах признак ESP_GATT_CHAR_PROP_BIT_NOTIFY.

#define CHAR_DECLARATION_SIZE (sizeof(uint8_t))
static const uint16_t character_declaration_uuid = ESP_GATT_UUID_CHAR_DECLARE;
static const uint8_t char_prop_read_notify       = ESP_GATT_CHAR_PROP_BIT_READ
                                                 | ESP_GATT_CHAR_PROP_BIT_NOTIFY;
 
const esp_gatts_attr_db_t gatt_db[MAX_NOT_USED_IDX] =
..
   [IDX_CHAR_N] =
   {
      {ESP_GATT_AUTO_RSP},
      {
         ESP_UUID_LEN_16,
         (uint8_t *)&character_declaration_uuid,
         ESP_GATT_PERM_READ,
         CHAR_DECLARATION_SIZE,
         CHAR_DECLARATION_SIZE,
         (uint8_t *)&char_prop_read_notify
      }
   },
..

2. При необходимости надо вызвать обновление атрибута функцией esp_ble_gatts_set_attr_value (см. выше), чтобы поддерживать значение характеристики в актуальном состоянии.

3. После обновления значения характеристики надо вызвать esp_ble_gatts_send_indicate:

err = esp_ble_gatts_send_indicate(gatts_if,
                                  conn_id,
                                  gatts_handle_table[attr_idx],
                                  size,
                                  (uint8_t*)&value,
                                  false);

Здесь gatts_if это идентификатор профиля, заполняется при обработке события ESP_GATTS_REG_EVT в gatts_profile_event_handler. Переменная conn_id это идентификатор соединения, заполняется в при обработке события ESP_GATTS_CONNECT_EVT в gatts_profile_event_handler. Массив gatts_handle_table это таблица дескрипторов базы характеристик GATTS, которая заполняется при обработке события ESP_GATTS_CREAT_ATTR_TAB_EVT профиля gatts_profile_event_handler. Переменная size это размер модифицируемых данных атрибута, value это буфер, где содержаться данные, которые будут копироваться в атрибут. Параметр false указывает, что от клиента подтверждение не требуется.

Послать обновление можно только для одной характеристики. Если также надо послать обновление для другой характеристики, то нужна пауза.

[Ссылки]

1. ESP-IDF GATT SERVER API site:espressif.com.

 

Добавить комментарий


Защитный код
Обновить

Top of Page