- Терминология, относящаяся к BLE (Bluetooth Low Energy)
- Подготовка оборудования
- Программирование ESP32 для индикации уровня заряда батареи с помощью службы GATT
- Тестирование вашего сервиса GATT на ESP32 BLE
Беспроводные наушники, браслеты для фитнеса, динамики Bluetooth, наушники-вкладыши, мобильные телефоны, ноутбуки… вокруг нас так много устройств Bluetooth, и большинство из них работают от батарей. Вы когда-нибудь задумывались над тем, как при подключении устройства Bluetooth к мобильному телефону он автоматически распознает, что подключенное устройство является компьютером, аудиоустройством или мобильным телефоном? Для некоторых устройств наш телефон может даже автоматически отображать процент заряда батареи подключенного устройства на панели уведомлений. Как все это происходит само по себе? Между телефоном и устройством Bluetooth должен быть общий протокол!
Сохраняйте любопытство, вы получите ответы на эти вопросы, когда мы попытаемся понять Bluetooth Low Energy (сокращенно BLE) с помощью популярного модуля ESP32. В отличие от классического Bluetooth в ESP32, BLE работает только тогда, когда связь активирована, и остается в спящем режиме, в противном случае это делает его правильным выбором для приложений с батарейным питанием. BLE также может формировать ячеистые сети и действовать как маяки. Обычно модули BLE работают либо как сервер, либо как клиент, здесь мы будем использовать ESP32 BLE в качестве сервера.
Здесь мы разделили весь ESP32 Bluetooth на три сегмента для простоты понимания.
1. Последовательный Bluetooth на переключателе ESP32 с мобильного телефона
2 . Сервер BLE для отправки данных об уровне заряда батареи на мобильный телефон с помощью службы GATT
3. Клиент BLE для сканирования устройств BLE и работы в качестве маяка.
Мы уже рассмотрели первую статью; в этой статье мы узнаем, как заставить ESP32 BLE работать в качестве сервера и использовать службу GATT для отправки информации об уровне заряда батареи. В целях тестирования мы будем отправлять жестко запрограммированные значения из ESP32 в виде процента заряда батареи на наш мобильный телефон через службу BLE GATT, таким образом, наш мобильный телефон будет предполагать, что ESP32 - это устройство Bluetooth с питанием от батареи, которое пытается отправить процент своего заряда батареи. Прежде чем вдаваться в подробности, мы разберем несколько терминов, связанных с Bluetooth Low Energy.
Терминология, относящаяся к BLE (Bluetooth Low Energy)
Сервер BLE: Как было сказано ранее, BLE может быть запрограммирован для работы либо как сервер, либо как клиент. При работе в качестве сервера BLE может только предоставлять данные, но не может инициировать соединение. Примером может служить фитнес-браслет. Сервер может отправлять информацию только в том случае, если клиент запрашивает ее.
Чаще всего BLE ESP32 используется в качестве сервера. На каждом сервере будет одна или несколько служб, и аналогично каждая служба будет иметь одну или несколько характеристик, связанных с ней. Внутри характеристики может быть ноль, один или более одного дескриптора. Каждая служба, характеристика или дескриптор будет иметь свой собственный заранее определенный уникальный идентификатор, называемый UUID.
Клиент BLE: клиент может сканировать соединение и слушать другие устройства Bluetooth. Примером может служить ваш мобильный телефон. Обратите внимание, что большинство аппаратных устройств BLE может работать как сервер и как клиент, это программное обеспечение, которое определяет роль устройства.
Периферийное устройство / Центральное устройство: в сети BLE может быть только одно центральное устройство, но может быть столько периферийных устройств, сколько требуется. Центральное устройство может подключаться ко всем периферийным устройствам одновременно, но периферийное устройство может подключаться только к центральному устройству, таким образом, никакие два периферийных устройства не могут обмениваться данными друг с другом. Лучшим примером для центрального устройства будут наши смартфоны, а для периферийного устройства - наш Bluetooth-наушник или фитнес-браслеты.
BLE-реклама: BLE-реклама - это забавный термин, обозначающий, что устройство Bluetooth должно быть видимым для всех, чтобы оно могло сопрягаться и устанавливать соединение. Это можно рассматривать как одностороннюю связь. Здесь сервер продолжает рекламировать данные, ожидая, что сервер их получит. BLE Beacon - это разновидность BLE.
UUID (универсальный уникальный идентификатор): каждому устройству BLE Bluetooth присваивается универсальный уникальный идентификационный номер при программировании программистом. Вы можете думать об этом идентификаторе как о последовательности чисел, которая представляет функциональность / роль устройства BLE. Опять же, есть два типа UUID. Один - это UUID службы, а другой - характеристический UUID.
Служба GATT: GATT расшифровывается как Generic Attribute Profile; это определяет некоторые стандартные способы, с помощью которых два устройства BLE должны всегда взаимодействовать. Этот протокол атрибутов (ATT) предопределен и является общим для всех устройств BLE, поэтому любые два устройства BLE могут идентифицировать друг друга. Итак, GATT был ответом на наш предыдущий вопрос.
Метод, с помощью которого два устройства BLE должны отправлять данные и обратно, определяется концепцией, называемой услугами и характеристиками.
Служба BLE / характеристика BLE: UUID службы сообщает нам, какой тип службы будет выполнять устройство BLE, а характеристический UUID сообщает, какие параметры или функции будут выполняться этой службой. Таким образом, каждая служба будет иметь одну или несколько характеристик. Хорошо! Откуда у программиста этот UUID? Каждый UUID уже определен GATT (Generic Attribute Profile), вы можете посетить их веб-сайт и выбрать UUID в соответствии с требованиями проекта. Я знаю, что это немного отскочило от нашей головы; давайте попробуем разобраться в этом на примере.
Предположим, устройство BLE аудиоплеера. Первоначально, когда вы соединяете его с телефоном, ваш телефон определяет его как аудиоустройство, а также отображает уровень заряда батареи в строке состояния. Итак, чтобы это произошло, аудиоплеер должен каким-то образом сообщить вашему телефону, что он готов поделиться уровнем заряда батареи и процентом заряда, который у него есть. Это делается с помощью UUID, есть определенный UUID, который сообщает, что игральные кости BLE собираются предоставить подробную информацию об уровне заряда батареи, этот UUID, который сообщает, что тип службы называется Service UUID, опять же, может быть так много параметров, которые должны можно обменять на выполнение услуги, например, значение батареи в таком параметре, каждый параметр будет иметь свой собственный UUID, и они называются характеристическим UUID.Общая функция, выполняемая характеристикой, - это чтение, запись, уведомление и указание.
Дескриптор BLE: Дескриптор - это необязательный атрибут, который присутствует внутри характеристики. Дескриптор обычно указывает, как получить доступ к характеристике.
BLE Beacon: Bluetooth Beacon больше похож на бесконтактный переключатель, который выполняет некоторые заранее определенные действия, когда пользователь попадает в зону действия (близость). Он постоянно рекламирует свою идентичность и, следовательно, всегда готов к спариванию.
BLE2902: я все еще скептически отношусь к этой вещи, но вы можете думать об этом как о части программного обеспечения на стороне клиента, которая сообщает серверу включить или выключить уведомление, это поможет нам в экономии энергии
Надеюсь, у вас есть приблизительное представление, хорошо то, что нам не нужно много знать, поскольку вся ручная работа уже сделана за нас, хотя библиотеки.
Подготовка оборудования
Проект не требует настройки оборудования, но убедитесь, что вы добавили сведения о плате ESP32 в свою Arduino IDE и попробовали минимальный образец программы мигания, чтобы проверить, все ли работает должным образом. Вы скептически относитесь к тому, как это сделать, вы можете следовать руководству Начало работы с ESP32 с Arduino, чтобы сделать то же самое.
Также для тестирования сервисов BLE мы будем использовать приложение nRF для Android на нашем мобильном телефоне, которое можно напрямую загрузить из PlayStore. Он также доступен в магазине Itunes для пользователей Iphone. Если вы планируете работать с BLE в течение длительного времени, это приложение действительно пригодится в целях отладки.
Программирование ESP32 для индикации уровня заряда батареи с помощью службы GATT
К этому времени я предполагаю, что у вас есть четкое представление о том, что такое сервис GATT и как он реализован с использованием сервисных и характерных моделей. Теперь давайте погрузимся в программу, чтобы узнать, как она реализована в ESP32 с использованием Arduino IDE. Прежде чем мы продолжим, я хотел бы использовать это место, чтобы поблагодарить Андреаса Списса за его видео BLE, которое прояснило ситуацию с моей стороны.
Мы начинаем программу с импорта необходимых библиотек в наш скетч. Есть много вещей, которые нужно настроить, чтобы использовать функциональность ESP32 BLE, надеюсь, благодаря Нилу Колбану, который уже проделал для нас тяжелую работу и предоставил библиотеки. Если вы хотите понять функциональность библиотек, вы можете обратиться к его документации на странице github.
#включают
Затем мы должны определить функцию обратного вызова сервера для нашего устройства Bluetooth. Перед этим давайте разберемся, что такое функция обратного вызова в BLE.
Что такое функция обратного вызова в BLE?
Когда BLE работает как сервер, важно определить функцию обратного вызова сервера. Есть много типов обратных вызовов, связанных с BLE, но, проще говоря, вы рассматриваете их как подтверждение, выполняемое, чтобы убедиться, что действие было завершено. Обратный вызов сервера используется для обеспечения успешного установления соединения между клиентом и сервером.
Мы используем следующие строки кода для выполнения обратного вызова сервера.
bool _BLEClientConnected = false; класс MyServerCallbacks : общедоступные BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; недействительным onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Внутри функции настройки void мы инициируем последовательную связь по адресу 115200 для отладки, а затем инициализируем устройство Bluetooth с помощью функции InitBLE .
void setup () { Serial.begin (115200); Serial.println («Индикатор уровня заряда батареи - BLE»); InitBLE (); }
InitBLE это место, где все происходит волшебство. Мы должны создать сервер Bluetooth и использовать здесь службу уровня заряда батареи. Но перед этим мы должны определить UUID для службы, характеристики и дескриптор для чтения уровня заряда батареи. Все UUID можно получить на веб-сайте службы Bluetooth GATT. В нашем случае мы пытаемся использовать службу Battery, и UUID для нее определяется как 0X180F, как показано ниже.
Затем нам нужно знать характеристику, связанную с этой услугой. Чтобы узнать, что просто нажмите на Battery Service, и вы попадете на страницу Service Characteristics, где упоминается, что уровень заряда батареи - это название характеристик, принимающее значение от 0 до 100. Также обратите внимание, что мы можем выполнить только два действия с этой характеристикой: одно - Чтение, которое необходимо выполнить, а другое - Уведомление, которое является необязательным. Поэтому мы должны отправить значение батареи клиенту (Телефон), что является обязательным, и при необходимости мы можем уведомить телефон о том, что является необязательным.
Но подождите, мы все еще не нашли значение UUID для характеристического уровня заряда батареи. Для этого перейдите на страницу характеристик батареи и найдите имя уровня заряда батареи, вы найдете его UUID как 0X2A19, его снимок показан ниже.
Теперь, когда у нас есть все значения, давайте запишем программу, как показано ниже. Имя BatterySerivce , BatteryLevelCharacteristic и BatteryLevelDescriptor - это определяемые пользователем переменные для ссылки на службу, характеристику и дескриптор, которые мы используем в программе. Значение для дескриптора 0X2901 используется, когда размер значения составляет 8 бит, дополнительную информацию можно найти на странице описания дескриптора.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Вернемся к функции initBLE . Сначала нам нужно запустить сервер BLE и заставить его рекламировать имя. В следующих строках используются для запуска BLE в качестве сервера. Имя, которое я дал своему серверу BLe, - «BLE Battery», но вы можете выбрать свое собственное.
BLEDevice:: init ("Батарея BLE"); // Создание сервера BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (новый MyServerCallbacks ());
Затем нам нужно запустить службу GATT, поскольку мы уже определили UUID, мы можем просто запустить службу, используя строку ниже.
// Создание службы BLE BLEService * pBattery = pServer-> createService (BatteryService);
После запуска службы мы можем связать дескриптор с характеристиками и установить значения. Служба BLE2902 также добавляется сюда, как показано ниже.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue («Процент 0–100»); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (новый BLE2902 ());
Наконец, все настроено, теперь все, что осталось, это попросить ESP32 рекламировать, чтобы другие устройства, такие как наш телефон, могли обнаружить его и подключиться к нему, а при подключении к клиенту он должен инициировать службу батареи, которая может быть выполнена через следующие строки.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Запускаем рекламу pServer-> getAdvertising () -> start ();
Пока все хорошо, последний шаг - сообщить дескриптору, какое значение заряда батареи в процентах должно быть отправлено клиенту (телефону). Это значение может быть от 0 до 100, как мы читали ранее, для простоты я просто жестко запрограммировал значение батареи, равное 57, а затем увеличиваю его каждые 5 секунд и начинаю с 0, когда оно достигает 100. Код для выполнения это показано ниже. Обратите внимание, что отправляемое значение имеет формат unit8_t.
uint8_t level = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); задержка (5000); level ++; Serial.println (int (уровень)); если (int (level) == 100) level = 0; }
Тестирование вашего сервиса GATT на ESP32 BLE
Полный код пояснялось выше приведен в конце страницы. Загрузите код на свою плату ESP32. После загрузки ваш телефон должен обнаружить Bluetooth-устройство под названием «BLE Battery» Сопряжение с ним.
Затем установите приложение nRF для Android, откройте его и подключитесь к устройству BLE Battery BLE. Разверните раздел «Обслуживание батарей», и вы увидите следующий экран.
Как вы можете видеть, приложение автоматически определило, что BLE обеспечивает обслуживание батареи и имеет характеристики уровня заряда батареи из-за UUID, который мы использовали в программе. Вы также можете увидеть, что текущее значение заряда батареи, равное 67%, подождите 5 секунд, и вы также можете заметить, что оно увеличивается.
Самое интересное в использовании BLE заключается в том, что теперь любое приложение, работающее с BLE, будет думать, что ваш ESP32 - это устройство BLE, которое уведомляет об уровне заряда батареи. Чтобы опробовать его, я использовал приложение под названием BatON, которое определило ESP32 как устройство Bluetooth с питанием от батареи и выдало процентное уведомление на моем телефоне, как это
Круто!! Правильно? Я также показал полную работу на видео ниже. Теперь, когда вы узнали, как использовать службы BLE Battery с ESP32, вы можете попробовать и другие службы GATT, которые очень интересны, такие как частота пульса, HID, частота пульса и т. Д. Удачи….