- Терминологии, свързани с 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, по този начин нашият Mobile ще приеме, че 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 (Generic Attribute Profile), можете да посетите техния уебсайт и да изберете UUID, както се изисква за проекта. Знам, че е отскочило малко над главата ни; нека се опитаме да го разберем с пример.
Да приемем BLE устройството на аудио плейър. Първоначално, когато го сдвоите с телефона си, телефонът го идентифицира като аудио устройство и също така показва нивото на батерията в лентата на състоянието. Така че, за да се случи това, аудио плейърът трябва по някакъв начин да каже на телефона ви, че е готов да сподели нивото на батерията и процента на зареждане, който има в батерията. Това се прави с помощта на UUID, има специфичен UUID, който казва, че BLE заровете ще предоставят подробности за нивото на батерията този UUID, който казва, че видът услуга се нарича Service UUID, отново може да има толкова много параметри, които трябва да да бъде заменен за извършване на услуга, като стойността на батерията е на такъв параметър, всеки параметър ще има свой собствен UUID и те се наричат Characteristic UUID.Общата функция, изпълнявана от характеристика, е Прочетете, напишете, уведомете и посочете.
BLE Дескриптор: Дескрипторът е незадължителен атрибут, който присъства вътре в Характеристиката. Дескриптор обикновено указва как да получите достъп до характеристика.
BLE маяк: Bluetooth маякът е по-скоро като превключвател за близост, който изпълнява някакво предварително дефинирано действие, когато потребителят влезе в обхват (непосредствена близост). Той рекламира своята идентичност през цялото време и следователно е готов да се сдвоява винаги.
BLE2902: Все още съм скептичен към това нещо, но можете да го възприемете като част от софтуера от страна на клиента, който информира сървъра да включи или изключи известието, това ще ни помогне да спестим енергия
Надявам се, че имате груба идея, доброто е, че не е нужно да знаем много, тъй като цялата ръчна работа вече е направена за нас чрез библиотеките.
Подготовка на хардуера
Проектът не изисква хардуерна настройка, но се уверете, че сте добавили подробности за платката ESP32 към вашия Arduino IDE и сте изпробвали минимална примерна програма за мигане, за да проверите дали всичко работи според очакванията. Скептични сте как да го направите, можете да следвате урока Първи стъпки с ESP32 с Arduino, за да направите същото.
Също така, за да тестваме BLE услугите, ще използваме приложението nRF android на нашия мобилен телефон, което може да бъде директно изтеглено от PlayStore. Предлага се и в Itunes Store за потребители на Iphone. Ако планирате да работите с BLE дълго време, това приложение наистина ще ви бъде полезно за отстраняване на грешки.
Програмиране на ESP32 за индикация за нивото на батерията с помощта на услугата GATT
По това време предполагам, че имате добра представа за това каква услуга GATT и как тя се прилага с помощта на услуги и характерни модели. Сега, нека се потопим в програмата, за да научим как тя се прилага в ESP32 с помощта на Arduino IDE. Преди да продължим, бих искал да използвам това пространство, за да благодаря на Andreas Spiess за видеото му BLE, което направи нещата много ясни от моя страна.
Започваме програмата, като импортираме необходимите библиотеки в нашата скица. Има много неща за конфигуриране, за да се използва функционалността BLE на ESP32, надяваме се, макар и благодарение на Нийл Колбан, който вече е направил упоритата работа за нас и е предоставил библиотеките. Ако искате да разберете функционалността на библиотеките, можете да се обърнете към неговата документация на github страница.
#include
След това трябва да дефинираме функцията за обратно извикване на сървъра за нашето Bluetooth устройство. Преди това позволява да се разбере, какво представлява функцията за обратно извикване в BLE.
Какво представлява функцията за обратно извикване в BLE?
Когато BLE работи като сървър, важно е да дефинирате функция за обратно извикване на сървър. Съществуват много видове обратно извикване, свързани с BLE, но за да го кажем по-просто, вие ги считате за потвърждение, което се извършва, за да сте сигурни, че действието е завършено. Използва се обратно извикване на сървър, за да се гарантира, че връзката между клиент и сървър е установена успешно.
Използваме следните редове код, за да извършим обратно извикване на сървър.
bool _BLEClientConnected = false; клас MyServerCallbacks : публични BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; невалидно onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Вътре във функцията за настройка на празнотата инициираме серийна комуникация на 115200 за отстраняване на грешки и след това инициализираме Bluetooth устройството чрез функцията InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Индикатор за нивото на батерията - BLE"); InitBLE (); }
В initBLE е мястото, където всичко се случва магията. Трябва да създадем Bluetooth сървър и да използваме услугата Battery Level тук. Но преди това трябва да дефинираме UUID за услуга, характеристика и дескриптор за отчитане на нивото на батерията. Всички UUID могат да бъдат получени от уебсайта на услугата Bluetooth GATT. За нашия случай се опитваме да използваме услугата за батерии и UUID за нея се определя като 0X180F, както е показано по-долу.
След това трябва да знаем характеристиките, свързани с тази услуга. За да знаете, че просто кликнете върху Сервиз на батерията и ще бъдете отведени до страницата Характеристики на услугата, където се споменава, че Нивото на батерията е името на характеристиките и приема стойността от 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 ниво = 57; невалиден цикъл () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); забавяне (5000); ниво ++; Serial.println (int (ниво)); ако (int (ниво) == 100) ниво = 0; }
Тестване на вашата услуга GATT на ESP32 BLE
В пълния код обяснено по-горе е даден в края на страницата. Качете кода на вашата платка ESP32. След като го качите, телефонът ви трябва да открие Bluetooth устройство, наречено “BLE Battery”, сдвоете се с него.
След това инсталирайте приложението nRF android и го отворете и се свържете с BLE батерията BLE устройство. Разширете раздела за обслужване на батерии и ще намерите следния екран.
Както можете да видите, приложението автоматично идентифицира, че BLE предоставя услуга за батерията и има характеристиките на ниво на батерията поради UUID, който използвахме в програмата. Можете също така да видите тази текуща стойност на батерията, която е 67%, изчакайте 5 секунди и можете също така да забележите, че се увеличава.
Готиното при използването на BLE е, че сега всяко приложение, което работи с BLE, ще мисли, че вашето ESP32 е BLE устройство, което известява за нивото на батерията. За да го изпробвам, използвах приложение, наречено BatON и приложението идентифицира ESP32 като Bluetooth устройство, захранвано от батерия, и дадох процентното известие на телефона си по този начин
Готино!! Нали? Също така показах пълната работа във видеото по-долу. Сега, след като сте се научили как да използвате услугите на BLE Battery с ESP32, можете да опитате и други услуги на GATT, които са много интересни като пулс, HID, сърдечен ритъм и т.н. Забавлявайте се….