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. |