- Термінології, пов'язані з 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 Advertising: BLE Advertising - це виразний термін, який вказує пристрою Bluetooth бути видимим для всіх, щоб він міг з'єднатись і встановити з'єднання. Це може розглядатися як односторонній зв'язок. Тут сервер продовжує рекламувати дані, очікуючи, що сервер їх отримає. BLE Beacon - це різновид BLE.
UUID (Універсальний унікальний ідентифікатор): Кожному пристрою BLE Bluetooth при запрограмуванні програміста надається Універсальний унікальний ідентифікаційний номер. Ви можете сприймати цей ідентифікатор як послідовність чисел, що представляє функціональність / роль пристрою BLE. Знову ж таки, існує два типи UUID. Один - це UUID служби, а інший - Характеристичний UUID.
Послуга GATT: GATT означає загальний профіль атрибутів; це визначає деякі стандартні способи, за допомогою яких два пристрої BLE повинні завжди спілкуватися. Цей протокол атрибутів (ATT) попередньо визначений і є загальним для всіх пристроїв BLE, тому будь-які два пристрої BLE можуть ідентифікувати один одного. Тож GATT був відповіддю на наше попереднє запитання.
Методика, за допомогою якої два пристрої BLE повинні передавати дані вперед і назад, визначається концепцією, яка називається послугами та характеристиками.
Служба BLE / характеристика BLE: Службовий UUID повідомляє нам, який тип послуги збирається виконувати пристрій BLE, а Характеристичний UUID повідомляє, які параметри чи функції виконуватиме ця служба. Отже, кожна Служба матиме одну або кілька характеристик. Добре! Звідки у програміста цей UUID? Кожен UUID вже визначений GATT (загальний профіль атрибутів), ви можете відвідати їх веб-сайт і вибрати UUID відповідно до проекту. Я знаю, що це трохи відскочило нам над головою; спробуємо зрозуміти це на прикладі.
Припустимо, пристрій BLE аудіоплеєра. Спочатку, коли ви поєднуєте його з телефоном, телефон ідентифікує його як аудіопристрій, а також відображає рівень заряду акумулятора в рядку стану. Отже, для цього аудіоплеєр повинен якимось чином сказати вашому телефону, що він готовий поділитися рівнем заряду акумулятора та відсотком заряду, який він має в ньому. Це робиться за допомогою UUID, існує конкретний UUID, який повідомляє, що BLE-кістки нададуть детальну інформацію про рівень заряду акумулятора, який UUID, який повідомляє, що тип послуги називається Service UUID, знову може бути так багато параметрів обмінюватися на виконання послуги, як значення батареї на такому параметрі, кожен параметр матиме свій власний UUID, і вони називаються характеристичним UUID.Загальною функцією, що виконується характеристикою, є читання, запис, сповіщення та вказівка.
Дескриптор BLE: Дескриптор - це необов’язковий атрибут, який присутній усередині Характеристики. Дескриптор зазвичай вказує, як отримати доступ до характеристики.
BLE маяк: маяк Bluetooth більше схожий на перемикач наближення, який виконує певну заздалегідь визначену дію, коли користувач потрапляє в діапазон (безпосередня близькість). Він постійно рекламує свою особистість і, отже, готовий завжди створювати пари.
BLE2902: Я все ще скептично ставлюся до цього, але ви можете сприймати це як частину програмного забезпечення на стороні клієнта, яка інформує сервер про ввімкнення та вимкнення сповіщення, це допоможе нам заощадити енергію
Сподіваємось, ви приблизно зрозуміли, добре, що нам не потрібно знати багато, оскільки всі ручні роботи вже зроблені для нас, хоча в бібліотеках.
Підготовка обладнання
Проект не вимагає налаштування апаратного забезпечення, але переконайтеся, що ви додали деталі плати ESP32 на вашу Arduino IDE і спробували мінімальну програму мигання, щоб перевірити, чи все працює належним чином. Ви скептично ставитесь до того, як це зробити, ви можете дотримуватися Посібника з початку роботи з ESP32 з Arduino, щоб зробити те саме.
Також для тестування служб BLE ми будемо використовувати додаток android nRF на своєму мобільному телефоні, який можна безпосередньо завантажити з PlayStore. Він також доступний у магазині Itunes для користувачів Iphone. Якщо ви плануєте тривалий час працювати з BLE, ця програма дійсно стане в нагоді для налагодження.
Програмування ESP32 для індикації рівня заряду акумулятора за допомогою служби GATT
На цей час я припускаю, що ви вже чітко уявляєте, яка послуга GATT і як вона реалізована за допомогою служб та характерних моделей. Тепер давайте заглибимося в програму, щоб дізнатися, як вона реалізована в ESP32 за допомогою IDE Arduino. Перш ніж продовжувати, я хотів би використати цей простір, щоб подякувати Андреасу Спіесу за його відео BLE, яке зробило речі на моїй стороні зрозумілими.
Ми розпочинаємо програму з імпорту необхідних бібліотек у наш ескіз. Є багато речей, які потрібно налаштувати, щоб використовувати функціональність BLE ESP32, сподіваємось, хоча завдяки Нілу Колбану, який вже зробив важку роботу за нас і надав бібліотеки. Якщо ви хочете зрозуміти функціональність бібліотек, ви можете звернутися до його документації на сторінці github.
#включати
Далі ми повинні визначити функцію зворотного виклику сервера для нашого пристрою Bluetooth. До цього давайте зрозуміти, що таке функція зворотного виклику в BLE.
Що таке функція зворотного виклику в BLE?
Коли BLE працює як сервер, важливо визначити функцію зворотного виклику сервера. З BLE існує багато типів зворотних викликів, але, простіше кажучи, ви розглядаєте їх як підтвердження, яке виконується, щоб переконатися, що дія була виконана. Серверний зворотний виклик використовується для забезпечення успішного встановлення зв’язку між клієнтом та сервером.
Ми використовуємо наступні рядки коду для здійснення зворотного виклику сервера.
bool _BLEClientConnected = false; клас MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Усередині функції налаштування порожнечі ми ініціюємо послідовний зв'язок на 115200 для налагодження, а потім ініціалізуємо пристрій Bluetooth за допомогою функції InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Індикатор рівня заряду батареї - BLE"); InitBLE (); }
InitBLE це місце, де все відбувається диво. Ми повинні створити сервер Bluetooth і скористатися послугою рівня заряду акумулятора тут. Але перед цим ми повинні визначити UUID для обслуговування, характеристики та дескриптора для зчитування рівня заряду акумулятора. Весь UUID можна отримати на веб-сайті служби Bluetooth GATT. У нашому випадку ми намагаємось використовувати службу акумулятора, а UUID для неї визначається як 0X180F, як показано нижче.
Далі нам потрібно знати Характеристику, пов’язану з цією послугою. Щоб знати, що просто натисніть на Сервіс акумулятора, і ви потрапите на сторінку Характеристики сервісу, де згадується, що Рівень заряду акумулятора - це назва характеристик, і воно приймає значення від 0 до 100. Також зверніть увагу, що ми можемо виконати лише два дії з цією характеристикою, одна з них - читати, що є обов’язковою, а інша - повідомляти, що є необов’язковою. Отже, ми повинні надіслати значення заряду батареї клієнту (телефону), що є обов’язковим, і за потреби ми можемо повідомити телефон про те, що є необов’язковим.
Але почекайте, ми все ще не знайшли значення UUID для характеристичного рівня заряду. Для цього перейдіть на сторінку Характеристика батареї та виконайте пошук за назвою рівня заряду акумулятора, ви знайдете його UUID як 0X2A19, його знімок показано нижче.
Тепер, коли ми маємо всі значення, давайте поставимо його програмою, як показано нижче. Назва BatterySerivce , BatteryLevelCharacteristic і BatteryLevelDescriptor є змінні відносяться до служби, Характеристика і Descriptor, що ми використовуємо в програмі. Значення для дескриптора 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 Battery"); // Створення 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 рівень = 57; порожня петля () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); затримка (5000); рівень ++; Serial.println (int (рівень)); якщо (int (рівень) == 100) рівень = 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, частота серцевих скорочень тощо.