Под сервером 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. |