ESP32:Примеры/Bluetooth Low Energy:сканирование
Bluetooth Low Energy:сканирование
Скетч-пример сканирует ближайшие Bluetooth-устройства и, найдя их, показывает информацию о них в мониторе порта. Этот скетч также можно найти по этой ссылке.
Справочная информация
Bluetooth Low Energy (BLE) в ESP32
В этом Разделе мы изучим, что такое BLE (означает «Bluetooth low energy», что можно перевести как «Bluetooth с пониженным энергопотреблением») и как использовать его на практике. Чип ESP32 оснащен не только WiFi-компонентами, но и компонентами для передачи данных по Bluetooth и Bluetooth Low Energy (BLE).
В этом Разделе мы рассмотрим следующее:
- Основы Bluetooth Low Energy (BLE)
- Терминология BLE: UUID, сервис, характеристика и свойства
- Взаимодействие между сервером и клиентом
Что такое Bluetooth?
Bluetooth – это беспроводной стандарт связи для обмена данными на коротком расстоянии. Как и WiFi, Bluetooth работает на частоте 2.4 ГГц.
Bluetooth применяется во множестве разных ситуаций, где требуются беспроводные управление и передача данных. Например:
- Передача аудиоданных в наушники или аудиосистему автомобиля
- Коммуникация между периферийными устройствами и ПК
- Передача данных между Bluetooth-устройствами
Другими словами, Bluetooth используется в ситуациях, когда для передачи данных между устройствами требуется непрерывное сквозное («точка-точка») подключение.
Что такое Bluetooth Low Energy (BLE)?
Bluetooth Low Energy (BLE) – это энергосберегающий вариант Bluetooth, и его главная область применения – это передача маленьких порций данных на короткие расстояния. Этот стандарт предназначен для очень маломощных проектов, питаемых от батареек-таблеток.
В отличие от Bluetooth, который включен постоянно, BLE-устройство постоянно находится в спящем режиме, кроме ситуаций, когда оно подключено к другим устройствам. Благодаря этому BLE-устройства потребляют очень мало питания. Эта функция крайне полезна для коммуникации типа M2M (англ. «machine-to-machine», т.е. «между машинами»), т.к. позволяет делать проекты из маленьких устройств, питаемых от батареек и работающих очень долгое время.
Благодаря этому стандарт BLE идеален для проектов, где требуется периодический обмен небольшими порциями данных – например, в медицине, фитнесе, отслеживании объектов, навигации, безопасности и домашней автоматизации.
О других отличиях между Bluetooth и BLE можно почитать в этой статье или просто ознакомиться с ними в таблице ниже:
Сервер и клиент Bluetooth
В стандарте Bluetooth Low Energy предусмотрено два типа устройств: сервер и клиент. В нашем примере ESP32 работает в качестве сервера, а смартфон – в качестве клиента.
Сервер оповещает о своем существовании, чтобы его могли найти другие устройства, а также содержит данные для считывания клиентом. Клиент сканирует близлежащие устройства и, найдя искомый сервер, подключается к нему и начинает прослушивать входящие данные. Этот тип коммуникации называют «сквозным» или «точка-точка».
Стандарт BLE предусматривает и другие типы подключения:
- Режим вещания. Сервер передает данные нескольким клиентам, подключенным к нему.
- Ячеистая сеть. Все устройства подключены друг к другу. Это тип соединения, когда в сети несколько устройств, и у каждого из них по несколько подключений.
Теперь давайте рассмотрим несколько важных терминов, касающихся BLE.
GATT
GATT расшифровывается как «generic attributes» («общие атрибуты»). Эта спецификация определяет иерархию данных, которую BLE-устройство демонстрирует другим BLE-устройствам, подключенным к нему. Другими словами, GATT определяет то, как два BLE-устройства отправляют и получают стандартные сообщения.
На верхнем уровне этой иерархии – профиль, состоящий из одного или более сервисов. Каждый сервис содержит как минимум одну характеристику, а также может отсылать к другим сервисам.
Характеристики всегда находятся внутри сервисов, и это то место, где, собственно, хранятся данные во всей этой GATT-иерархии. Характеристика всегда содержит два атрибута: объявление характеристики (содержит метаданные о данных) и значение характеристики.
Кроме того, после значения характеристики могут идти дескрипторы, которые дополняют метаданные, содержащиеся в объявлении характеристики.
UUID
Каждый сервис, характеристика и дескриптор имеют собственный UUID (англ. «universally unique identifier», что переводится как «универсальный уникальный идентификатор»). UUID – это уникальное 128-битное (16-байтное) число вроде такого:
55072829-bc9e-4c53-938a-74a6d4c78776
Сокращенные UUID для всех сервисов, характеристик, профилей и т.д. можно найти на сайте Bluetooth SIG. К примеру, в неполной таблице ниже представлены сокращенные UUID для Bluetooth-сервисов. Полностью эту таблицу можно найти по этой ссылке.
Но если вашему приложению нужен собственный UUID, его можно сгенерировать при помощи этого UUID-генератора.
Итак, если вкратце, в UUID хранится уникальная идентифицирующая информация. С его помощью, к примеру, можно идентифицировать какой-либо сервис, предлагаемый Bluetooth-устройством.
Сервис «Battery Service»
Для примера давайте рассмотрим сервис «Battery Service». Он используется в большинстве питаемых от батареи BLE-устройств с целью определения текущего уровня заряда батареи (в процентах). Если BLE-устройство было сделано как следует, оно должно использовать стандартизированный сервис под названием «Battery Service».
Этот сервис позволяет приложениям, которые подключены к BLE-устройству, постоянно знать процент заряда батареи независимо от производителя устройства, т.к. они используют для этого уникальный ID сервиса, обозначающий уровень заряда батареи.
Характеристика «Battery Level»
О характеристиках сервиса «Battery Service» можно узнать по этой ссылке. Нам же понадобится характеристика «Battery Level», возвращающая текущий уровень заряда батареи в диапазоне от 0 до 100 процентов.
Итак, если у вас есть BLE-устройство с батареей (то есть сервер с сервисом «Battery Service», рассылающий оповещения с характеристикой «Battery Level»), то клиент (то есть ваш смартфон, подключенный к этому BLE-устройству) может видеть уровень заряда батареи этого BLE-устройства, т.к. это широко используемый сервис со стандартной характеристикой.
Свойства характеристики «Battery Level»
Как мы уже говорили ранее, у одного сервиса может быть одна или несколько характеристик. Характеристика – это данные, передаваемые между клиентом и сервером. Характеристика может иметь разные свойства. К примеру, характеристика «Battery Level» предназначена только для чтения, и это обязательное требование для ее работы.
Вы также можете, если хотите, активировать свойство «Notify» (оно опционально), чтобы BLE-устройства, к примеру, сообщали об уровне заряда своей батареи каждые X секунд.
В разных характеристиках могут быть разные свойства.
Структура Bluetooth-устройства
На рисунке ниже показано Bluetooth-устройство с сервисом «Battery Service», содержащим характеристику «Battery Level».
Понимать эту иерархию очень важно, т.к. это упростит понимание того, как использовать BLE и создавать собственные проекты, использующие эту функцию.
Более подробно о стандартных сервисах можно почитать на этой странице. Вы также можете создавать новые сервисы, которых в этом списке нет.
Это лишь базовая теория о BLE-устройствах, взаимодействии между клиентом и сервером, а также о некоторых стандартах, о которых нужно знать, чтобы работать с Bluetooth Low Energy. Стоит отметить, что мы затронули тему BLE поверхностно, и впереди нас ждет еще много интересного. Мы лишь рассмотрели несколько функций, имеющих отношение к нашим проектам.
Настоятельно рекомендуем почитать эту статью о BLE на «Википедии» – там о BLE рассказано более подробно.
Также советуем добавить в закладки сайт bluetooth.com, т.к. он содержит информацию о стандартных сервисах и UUID, которые вы будете использовать в BLE-устройствах и приложениях.
Тестируем код
Убедитесь, что в IDE Arduino выбраны правильная плата и COM-порт для этой ESP32. Чтобы не ошибиться и загрузить скетч на правильную плату, другую ESP32 можно на время отключить от ПК.
После загрузки кода у вас должны работать две ESP32:
- Одна – со скетчем «BLE_notify»(можно скопировать из примера Bluetooth Low Energy: уведомления)
- Другая – со скетчем «BLE_scan»(можно скопировать из раздела ниже)
Откройте монитор порта для ESP32 со скетчем «BLE_scan», нажмите на этой ESP32 кнопку EN, чтобы перезапустить плату, а затем подождите несколько секунд, пока она просканирует близлежащие устройства.
Спустя несколько секунд она должна найти BLE-устройство под названием «MyESP32» – это ESP32, на которой запущен скетч «BLE_notify».
Скетч «BLE_scan» также напечатает в мониторе порта дополнительную информацию вроде адреса и мощности передающего сигнала (txPower).
Необходимое оборудование
- Плата ESP32 - 2шт.;
Схема
Для данного примера нужны только 2 платы.
Код
/*
Основан на скетче-примере Нила Колбана для IDF:
https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
Порт в ESP32-адддон для IDE Arduino – Эвандро Коперчини
*/
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
int scanTime = 30; // в секундах
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());
// "Устройство, рассылающее оповещения о себе: "
}
};
void setup() {
Serial.begin(115200);
Serial.println("Scanning..."); // "Сканирование..."
BLEDevice::init("");
// создаем новый объект для сканирования:
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
// активное сканирование более энергоемко, но работает быстрее:
pBLEScan->setActiveScan(true);
BLEScanResults foundDevices = pBLEScan->start(scanTime);
Serial.print("Devices found: "); // "Найденные устройства: "
Serial.println(foundDevices.getCount());
Serial.println("Scan done!"); // "Сканирование завершено!"
}
void loop() {
// вставьте сюда свой главный код, он будет постоянно повторяться
delay(2000);
}
См.также
Внешние ссылки