Каталог

Bluetooth Low Energy с ESP32 на Arduino

ESP32 поставляется не только с Wi-Fi, но также с Bluetooth и Bluetooth Low Energy (BLE). Этот пост представляет собой краткое введение в BLE с использованием ESP32. Сначала мы рассмотрим, что такое BLE и для чего он может быть использован, а затем посмотрим на некоторые примеры использования ESP32 с Arduino IDE. Для простого ознакомления мы создадим BLE-сервер на ESP32 и BLE-сканер на ESP32, чтобы найти этот сервер.

Введение в Bluetooth Low Energy

Для быстрого ознакомления с BLE вы можете посмотреть видео ниже или пролистать вниз для письменного объяснения.

Рекомендуемое чтение: узнайте, как использовать ESP32 Bluetooth Classic с Arduino IDE для обмена данными между ESP32 и смартфоном на Android.

Что такое Bluetooth Low Energy?

Bluetooth Low Energy, сокращенно BLE, является энергосберегающим вариантом Bluetooth. Основное применение BLE заключается в передаче небольших объемов данных на короткие расстояния (низкая пропускная способность). В отличие от Bluetooth, который всегда включен, BLE постоянно находится в спящем режиме, за исключением момента, когда устанавливается соединение.

Это делает его потребление энергии очень низким. BLE потребляет примерно в 100 раз меньше энергии, чем Bluetooth (в зависимости от случая использования).

Кроме того, BLE поддерживает не только точечную связь, но и режим вещания, а также mesh-сети.

Взгляните на таблицу ниже, которая более подробно сравнивает BLE и Bluetooth Classic.

  Bluetooth Low Energy (LE) Bluetooth Basic Rate/Enhanced Data Rate (BR/EDR)
Оптимизировано для... Передача данных короткими импульсами Непрерывная передача данных
Частотный диапазон 2,4 ГГц ISM диапазон (2,402 – 2,480 ГГц используется) 2,4 ГГц ISM диапазон (2,402 – 2,480 ГГц используется)
Каналы 40 каналов с интервалом 2 МГц (3 рекламных канала / 37 каналов данных) 79 каналов с интервалом 1 МГц
Использование каналов Спектральное уплотнение с частотным скачком (FHSS) Спектральное уплотнение с частотным скачком (FHSS)
Модуляция GFSK GFSK, π/4 DQPSK, 8DPSK
Потребление энергии ~0,01x до 0,5x от эталона (в зависимости от использования) 1 (эталонное значение)
Скорость передачи данных LE 2M PHY: 2 Мбит/с
LE 1M PHY: 1 Мбит/с
LE Coded PHY (S=2): 500 Кбит/с
LE Coded PHY (S=8): 125 Кбит/с
EDR PHY (8DPSK): 3 Мбит/с
EDR PHY (π/4 DQPSK): 2 Мбит/с
BR PHY (GFSK): 1 Мбит/с
Максимальная мощность Tx* Класс 1: 100 мВт (+20 дБм)
Класс 1.5: 10 мВт (+10 дБм)
Класс 2: 2,5 мВт (+4 дБм)
Класс 3: 1 мВт (0 дБм)
Класс 1: 100 мВт (+20 дБм)
Класс 2: 2,5 мВт (+4 дБм)
Класс 3: 1 мВт (0 дБм)
Сетевые топологии Точка-точка (включая пиконет)
Вещание
Сеточная сеть
Точка-точка (включая пиконет)

Благодаря своим свойствам, BLE подходит для приложений, которые нуждаются в периодическом обмене небольшими объемами данных и работают на батарейке типа "монета". Например, BLE широко используется в здравоохранении, фитнесе, отслеживании, маяках, безопасности и домашней автоматизации.

BLE-сервер и клиент

С Bluetooth Low Energy существует два типа устройств: сервер и клиент. ESP32 может выступать как клиентом, так и сервером.

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

Как уже упоминалось, BLE также поддерживает режим вещания и mesh-сети:

  • Режим вещания: сервер передает данные многим подключенным клиентам;
  • Mesh-сеть: все устройства подключены друг к другу, это связь "многие ко многим".

Хотя режим вещания и mesh-сети возможно реализовать, они были разработаны совсем недавно, поэтому в настоящее время существует не так много примеров их использования с ESP32.

GATT

GATT означает Generic Attributes и определяет иерархическую структуру данных, которая доступна подключенным BLE-устройствам. Это означает, что GATT определяет способ, которым два устройства BLE отправляют и получают стандартные сообщения. Понимание этой иерархии важно, так как это упростит использование BLE и написание ваших приложений.

BLE-сервис

На самом верхнем уровне иерархии находится профиль, который состоит из одного или нескольких сервисов. Обычно устройство BLE содержит более одного сервиса.

Каждый сервис содержит по крайней мере одну характеристику или может ссылаться на другие сервисы. Сервис — это просто набор информации, например, показания сенсоров.

BLE-характеристика

Характеристика всегда принадлежит сервису, и именно в ней содержатся фактические данные в иерархии (значение). Характеристика всегда имеет два атрибута: объявление характеристики (которое предоставляет метаданные о данных) и значение характеристики.

Кроме того, значение характеристики может сопровождаться дескрипторами, которые дополнительно расширяют метаданные, содержащиеся в объявлении характеристики.

Свойства описывают, как можно взаимодействовать со значением характеристики. В основном, они содержат операции и процедуры, которые можно использовать с характеристикой:

  • Broadcast
  • Чтение
  • Запись без ответа
  • Запись
  • Уведомление
  • Указание
  • Подписанные записи с аутентификацией
  • Расширенные свойства

UUID

Каждый сервис, характеристика и дескриптор имеют UUID (универсально уникальный идентификатор). UUID — это уникальный 128-битный (16 байт) номер. Например:

55072829-bc9e-4c53-938a-74a6d4c78776

Существуют укороченные UUID для всех типов, сервисов и профилей, определенных SIG (Bluetooth Special Interest Group).

Но если вашему приложению требуется собственный UUID, вы можете сгенерировать его, используя этот сайт генерации UUID.

В резюме, UUID используется для уникальной идентификации информации. Например, он может идентифицировать определенный сервис, предоставляемый Bluetooth-устройством.

BLE с ESP32

ESP32 может выступать как BLE-сервером, так и BLE-клиентом. Существует несколько примеров использования BLE для ESP32 в библиотеке ESP32 BLE для Arduino IDE. Эта библиотека устанавливается по умолчанию при установке ESP32 на Arduino IDE.

Примечание: Вам необходимо установить дополнение для платы ESP32 в Arduino IDE. Следуйте следующему руководству, чтобы подготовить Arduino IDE для работы с ESP32, если вы еще этого не сделали.

Установка платы ESP32 в Arduino IDE 2 (Windows, Mac OS X, Linux)

В вашем Arduino IDE вы можете перейти в Файл> Примеры> BLE и исследовать примеры, которые идут с библиотекой BLE.

Примечание: чтобы увидеть примеры ESP32, вы должны выбрать плату ESP32 в меню Инструменты> Плата.

Для краткого введения в ESP32 с BLE на Arduino IDE мы создадим BLE-сервер на ESP32, а затем BLE-сканер на ESP32, чтобы найти этот сервер. Мы будем использовать и объяснять примеры, которые идут с библиотекой BLE.

Чтобы следовать этому примеру, вам понадобятся две платы разработки ESP32. Мы будем использовать плату ESP32 DOIT DEVKIT V1.

ESP32 BLE-сервер

Чтобы создать BLE-сервер на ESP32, откройте ваш Arduino IDE и выберите Файл> Примеры> BLE и выберите пример Server. Следующий код должен загрузиться:

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
void setup() {
  Serial.begin(115200); // Инициализация последовательной связи с скоростью 115200 бод
  Serial.println("Запуск работы с BLE!");
  BLEDevice::init("MyESP32"); // Инициализация BLE устройства с именем "MyESP32"
  BLEServer *pServer = BLEDevice::createServer(); // Создание BLE сервера
  BLEService *pService = pServer->createService(SERVICE_UUID); // Создание BLE сервиса
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       ); // Создание BLE характеристики с возможностями чтения и записи
  pCharacteristic->setValue("Hello World says Neil"); // Установка значения характеристики
  pService->start(); // Запуск сервиса
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); // Получение рекламы BLE
  pAdvertising->addServiceUUID(SERVICE_UUID); // Добавление UUID сервиса в рекламу
  pAdvertising->setScanResponse(true); // Установка ответа на сканирование
  pAdvertising->setMinPreferred(0x06);  // Функции для решения проблем с подключением к iPhone
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising(); // Начало рекламы BLE
  Serial.println("Характеристика определена! Теперь вы можете читать её на своем телефоне!");
}
void loop() {
  delay(2000); // Основной код повторяется каждые 2 секунды
}

Как работает код

Давайте быстро рассмотрим, как работает пример кода BLE-сервера.

Он начинается с импорта необходимых библиотек для возможностей BLE.

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

Затем необходимо определить UUID для сервиса и характеристики.

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

Вы можете оставить UUID по умолчанию или перейти на uuidgenerator.net, чтобы создать случайные UUID для ваших сервисов и характеристик.

В функции setup() начинается серийная связь с скоростью 115200.

Serial.begin(115200);

Затем создается BLE-устройство с названием "MyESP32". Вы можете изменить это название на любое другое.

BLEDevice::init("MyESP32");

На следующей строке вы устанавливаете BLE-устройство как сервер.

BLEServer *pServer = BLEDevice::createServer();

После этого создается сервис для BLE-сервера с ранее определенным UUID.

BLEService *pService = pServer->createService(SERVICE_UUID);

Затем задается характеристика для этого сервиса. Как видно, вы также используете ранее определенный UUID, и вам нужно передать в качестве аргументов свойства характеристики. В этом случае это: READ и WRITE.

BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                       CHARACTERISTIC_UUID,
                                       BLECharacteristic::PROPERTY_READ |
                                       BLECharacteristic::PROPERTY_WRITE
                                     );

После создания характеристики вы можете задать ее значение с помощью метода setValue().

pCharacteristic->setValue("Hello World says Neil");

В данном случае мы задаем значение текста "Hello World says Neil". Вы можете изменить этот текст на любой другой. В будущих проектах этот текст может быть показанием сенсора или состоянием лампы, например.

Наконец, вы можете запустить сервис и рекламу, чтобы другие BLE-устройства могли сканировать и находить это BLE-устройство.

BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();

Это всего лишь простой пример того, как создать BLE-сервер. В этом коде ничего не происходит в функции loop(), но вы можете добавить обработку при подключении нового клиента (посмотрите пример Notify для некоторого руководства).

ESP32 BLE-сканер

Создание BLE-сканера на ESP32 просто. Возьмите еще одну плату ESP32 (пока другая работает с эскизом BLE-сервера). В вашем Arduino IDE перейдите в File > Examples > BLE и выберите пример Scan. Следующий код должен загрузиться:

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
int scanTime = 5; // время сканирования в секундах
BLEScan* pBLEScan;
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("Сканирование...");
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); // создать новое сканирование
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); // активное сканирование использует больше энергии, но получает результаты быстрее
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);  // значение должно быть меньше или равно значению setInterval
}
void loop() {
  BLEScanResults *foundDevices = pBLEScan->start(scanTime, false);
  Serial.print("Найдено устройств: ");
  Serial.println(foundDevices->getCount());
  Serial.println("Сканирование завершено!");
  pBLEScan->clearResults();   // удаление результатов из буфера BLEScan для освобождения памяти
  delay(2000);
}

Этот код инициализирует ESP32 как BLE-устройство и сканирует близлежащие устройства. Загрузите этот код на вашу ESP32. Возможно, вам нужно временно отключить другую ESP32 от вашего компьютера, чтобы убедиться, что вы загружаете код на правильную плату ESP32.

Когда код загружен, и обе платы ESP32 включены:

  • Одна ESP32 с эскизом "BLE_server";
  • Другая с эскизом "BLE_scan".

Перейдите в Серийный монитор с ESP32, выполняющей эскиз "BLE_scan", нажмите кнопку ENABLE на ESP32 (с эскизом "BLE_scan"), чтобы перезагрузить и подождать несколько секунд, пока она сканирует.

Сканер нашел два устройства: одно из них — это ESP32 (оно имеет имя "MyESP32"), а другое — смарт-часы.

Тестирование BLE-сервера ESP32 с помощью смартфона

Большинство современных смартфонов имеют возможности BLE. Я использовал OnePlus, но большинство смартфонов также должно работать.

Вы можете отсканировать ваш BLE-сервер ESP32 с помощью смартфона и увидеть его сервисы и характеристики. Для этого мы будем использовать бесплатное приложение под названием nRF Connect for Mobile от Nordic, которое работает на Android (Google Play Store) и iOS (App Store).

Перейдите в Google Play Store или App Store и найдите "nRF Connect for Mobile". Установите приложение и откройте его.

nRF Connect for Mobile от Nordic

Не забудьте зайти в настройки Bluetooth и включить адаптер Bluetooth на вашем смартфоне. Вы также можете сделать его видимым для других устройств, чтобы позже протестировать другие эскизы.

Когда все готово на вашем смартфоне, и ESP32 работает с эскизом BLE-сервера, в приложении нажмите кнопку сканирования для поиска ближайших устройств. Вы должны найти ESP32 с именем "MyESP32".

Нажмите кнопку "Connect" (Подключиться).

Как видно на рисунке ниже, ESP32 имеет сервис с UUID, который вы определили ранее. Если нажать на сервис, меню развернется и покажет характеристику с UUID, которую вы также определили.

Характеристика имеет свойства READ и WRITE, и значение — это то, которое вы ранее определили в эскизе BLE-сервера. Итак, все работает исправно.

Заключение

В этом уроке мы показали вам основные принципы работы с Bluetooth Low Energy и привели несколько примеров использования ESP32. Мы изучили эскиз BLE-сервера и BLE-сканера. Это простые примеры, чтобы начать работу с BLE.

Комментарии
Отзывов еще никто не оставлял
Предзаказ
Предзаказ успешно отправлен!
Имя *
Телефон *
Добавить в корзину
Название товара
100 тг
1 шт.
Перейти в корзину
Обратный звонок
Запрос успешно отправлен!
Имя *
Телефон *
Заказ в один клик
С помощью уведомлений о заказе можно не только получать актуальную информацию по заказу, но и иметь быстрый канал связи с магазином