- Terminologie związane z BLE (Bluetooth Low Energy)
- Przygotowanie sprzętu
- Programowanie ESP32 do wskazywania poziomu akumulatora za pomocą usługi GATT
- Testowanie usługi GATT na ESP32 BLE
Słuchawki bezprzewodowe, opaski fitness, głośniki Bluetooth, słuchawki douszne, telefony komórkowe, laptopy… wokół nas jest tak wiele urządzeń Bluetooth, a większość z nich działa na baterie. Czy kiedykolwiek zastanawiałeś się, jak po podłączeniu urządzenia Bluetooth do telefonu komórkowego urządzenie automatycznie rozpoznaje, że podłączone urządzenie to komputer, urządzenie audio lub telefon komórkowy? W przypadku niektórych urządzeń nasz telefon może nawet automatycznie wyświetlać procent baterii podłączonego urządzenia na pasku powiadomień. Jak to wszystko dzieje się samodzielnie? Powinien istnieć jakiś wspólny protokół współdzielony między telefonem a urządzeniem Bluetooth, prawda!
Bądź ciekawy, otrzymasz odpowiedzi na te pytania, gdy spróbujemy zrozumieć Bluetooth Low Energy (w skrócie BLE) dzięki popularnemu modułowi ESP32. W przeciwieństwie do klasycznego Bluetooth w ESP32, BLE działa tylko wtedy, gdy komunikacja jest aktywna, aw przeciwnym razie pozostaje w trybie uśpienia, co czyni go właściwym wyborem dla aplikacji zasilanych bateryjnie. BLE może również tworzyć sieci kratowe i działać jako sygnały nawigacyjne. Zwykle moduły BLE działają jako serwer lub jako klient, tutaj użyjemy ESP32 BLE jako serwera.
Tutaj podzieliliśmy cały ESP32 Bluetooth na trzy segmenty dla ułatwienia zrozumienia.
1. Szeregowy Bluetooth na ESP32 przełączający LED z telefonu komórkowego
2 . Serwer BLE do wysyłania danych o poziomie baterii do telefonu komórkowego za pomocą usługi GATT
3. Klient BLE do skanowania urządzeń BLE i działania jako beacon.
Omówiliśmy już pierwszy artykuł; W tym artykule dowiemy się, jak sprawić, aby ESP32 BLE działał jako serwer i używać usługi GATT do wysyłania informacji o poziomie baterii. W celach testowych wyślemy zakodowane wartości z ESP32 jako procent baterii do naszego telefonu komórkowego za pośrednictwem usługi BLE GATT, w ten sposób nasz telefon komórkowy przyjmie, że ESP32 jest urządzeniem Bluetooth na baterie, które próbuje przesłać procent baterii do swojego telefonu komórkowego. Zanim przejdziemy do szczegółów, zrozumiemy kilka terminologii związanych z Bluetooth Low Energy.
Terminologie związane z BLE (Bluetooth Low Energy)
Serwer BLE: Jak powiedziano wcześniej, BLE można zaprogramować tak, aby działał jako serwer lub jako klient. Pracując jako serwer, BLE może dostarczać tylko dane, nie może zainicjować połączenia. Przykładem może być zespół fitness. Serwer może wysyłać informacje tylko wtedy, gdy zażąda ich klient.
Najczęściej BLE ESP32 jest używany jako serwer. Każdy Serwer będzie zawierał jedną lub więcej Usług i podobnie każda usługa będzie miała jedną lub więcej cech związanych z nią. Cecha może zawierać zero, jeden lub więcej deskryptorów. Każda usługa, cecha lub deskryptor będzie mieć swój własny, predefiniowany unikalny identyfikator zwany UUID.
Klient BLE: Klient może skanować połączenie i słuchać innych urządzeń Bluetooth. Przykładem może być Twój telefon komórkowy. Należy pamiętać, że większość urządzeń sprzętowych BLE może działać jako serwer i jako klient, to oprogramowanie decyduje o roli urządzenia.
Urządzenie peryferyjne / urządzenie centralne: W sieci BLE może być tylko jedno urządzenie centralne, ale może mieć dowolną liczbę urządzeń peryferyjnych. Urządzenie centralne może łączyć się ze wszystkimi urządzeniami peryferyjnymi w tym samym czasie, ale urządzenie peryferyjne może łączyć się tylko z urządzeniem centralnym, w ten sposób żadne dwa urządzenia peryferyjne nie mogą wymieniać danych między sobą. Najlepszym przykładem dla urządzenia centralnego będą nasze smartfony, a dla urządzeń peryferyjnych nasze słuchawki Bluetooth lub opaski fitness.
Reklama BLE: Reklama BLE to naukowy termin, który mówi, że urządzenie Bluetooth jest widoczne dla wszystkich, aby mogło sparować się i nawiązać połączenie. Można to uznać za komunikację jednokierunkową. Tutaj serwer przechowuje dane reklamowe, oczekując, że serwer je otrzyma. BLE Beacon to typ BLE.
UUID (Universal Unique Identifier): Każde urządzenie BLE Bluetooth otrzymuje uniwersalny unikalny numer identyfikacyjny po zaprogramowaniu przez programistę. Możesz myśleć o tym identyfikatorze jako o sekwencji liczb, która reprezentuje funkcjonalność / rolę urządzenia BLE. Ponownie istnieją dwa rodzaje UUID. Jednym z nich jest identyfikator UUID usługi, a drugim charakterystyczny identyfikator UUID.
Usługa GATT: GATT to skrót od Generic Attribute Profile; określa to kilka standardowych sposobów, za pomocą których dwa urządzenia BLE powinny zawsze się komunikować. Ten protokół atrybutu (ATT) jest wstępnie zdefiniowany i jest wspólny dla wszystkich urządzeń BLE, dzięki czemu każde dwa urządzenia BLE mogą się wzajemnie identyfikować. Zatem GATT był odpowiedzią na nasze poprzednie pytanie.
Technika, za pomocą której dwa urządzenia BLE powinny wysyłać dane tam iz powrotem, jest zdefiniowana przez pojęcie zwane usługami i charakterystyką.
Charakterystyka usługi BLE / BLE: Identyfikator UUID usługi informuje nas, jaki typ usługi ma wykonać urządzenie BLE, a charakterystyczny identyfikator UUID informuje, jakie parametry lub funkcje będą wykonywane przez tę usługę. Tak więc każda Usługa będzie miała pod sobą jedną lub więcej cech. W porządku! Skąd programista ma ten UUID? Każdy UUID jest już zdefiniowany przez GATT (Generic Attribute Profile), możesz odwiedzić ich stronę internetową i wybrać UUID zgodnie z wymaganiami projektu. Wiem, że odbiło się trochę nad naszą głową; spróbujmy to zrozumieć na przykładzie.
Załóżmy, że urządzenie BLE jest odtwarzaczem audio. Początkowo po sparowaniu go z telefonem, telefon identyfikuje go jako urządzenie audio, a także wyświetla poziom naładowania baterii na pasku stanu. Tak więc, aby tak się stało, odtwarzacz audio musi w jakiś sposób powiedzieć telefonowi, że jest skłonny dzielić poziom naładowania baterii i procent naładowania, który ma w baterii. Odbywa się to za pomocą UUID, istnieje konkretny UUID, który mówi, że kości BLE będą dostarczać szczegółowe informacje o poziomie baterii.Ten UUID, który mówi, że rodzaj usługi nazywa się Service UUID, znowu może być tak wiele parametrów, które muszą będą wymieniane na wykonanie usługi jak wartość baterii na takim parametrze, każdy parametr będzie miał swój własny UUID i są one nazywane charakterystycznymi UUID.Wspólną funkcją pełnioną przez cechę jest odczyt, zapis, powiadomienie i wskazanie.
Deskryptor BLE: Deskryptor jest opcjonalnym atrybutem, który znajduje się wewnątrz cechy. Deskryptor zwykle określa, jak uzyskać dostęp do cechy.
BLE Beacon: Bluetooth Beacon jest bardziej jak przełącznik zbliżeniowy, który wykonuje określoną wcześniej akcję, gdy użytkownik znajdzie się w zasięgu (bliskiej odległości). Cały czas reklamuje swoją tożsamość i dlatego jest zawsze gotowy do parowania.
BLE2902: Nadal jestem sceptyczny, ale możesz o tym myśleć jako o oprogramowaniu po stronie klienta, które informuje serwer, aby włączyć lub wyłączyć powiadomienia, co pomoże nam oszczędzać energię
Mam nadzieję, że masz przybliżony pomysł, dobre jest to, że nie potrzebujemy dużo wiedzieć, ponieważ cała praca ręczna jest już wykonana dla nas przez biblioteki.
Przygotowanie sprzętu
Projekt nie wymaga konfiguracji sprzętu, ale upewnij się, że dodałeś szczegóły płyty ESP32 do swojego Arduino IDE i wypróbowałeś minimalny program migania próbki, aby sprawdzić, czy wszystko działa zgodnie z oczekiwaniami. Jeśli jesteś sceptyczny, jak to zrobić, możesz postępować zgodnie z samouczkiem Pierwsze kroki z ESP32 z Arduino, aby zrobić to samo.
Aby przetestować usługi BLE, będziemy korzystać z aplikacji nRF na Androida, którą można pobrać bezpośrednio z PlayStore. Jest również dostępny w sklepie Itunes dla użytkowników Iphone. Jeśli planujesz pracować z BLE przez długi czas, ta aplikacja naprawdę przyda się do debugowania.
Programowanie ESP32 do wskazywania poziomu akumulatora za pomocą usługi GATT
W tym czasie zakładam, że masz już pojęcie o tym, jaka usługa GATT i jak jest wdrażana przy użyciu usług i charakterystycznych modeli. Teraz zanurzmy się w programie, aby dowiedzieć się, jak jest zaimplementowany w ESP32 przy użyciu Arduino IDE. Zanim przejdziemy dalej, chciałbym wykorzystać to miejsce, aby podziękować Andreasowi Spiessowi za jego wideo BLE, które bardzo jasno pokazało sprawę z mojej strony.
Program rozpoczynamy od zaimportowania wymaganych bibliotek do naszego szkicu. Jest wiele rzeczy do skonfigurowania, aby móc korzystać z funkcjonalności BLE ESP32, ale mam nadzieję, że dzięki Neilowi Kolbanowi, który wykonał już dla nas ciężką pracę i dostarczył biblioteki. Jeśli chcesz zrozumieć funkcjonalność bibliotek, możesz zapoznać się z jego dokumentacją na stronie github.
#zawierać
Następnie musimy zdefiniować funkcję oddzwaniania serwera dla naszego urządzenia Bluetooth. Wcześniej zrozumiemy, czym jest funkcja zwrotna w BLE.
Co to jest funkcja wywołania zwrotnego w BLE?
Gdy BLE działa jako serwer, ważne jest zdefiniowanie funkcji wywołania zwrotnego serwera. Istnieje wiele typów wywołań zwrotnych powiązanych z BLE, ale w uproszczeniu traktujesz je jako potwierdzenie wykonywane w celu upewnienia się, że akcja została zakończona. Wywołanie zwrotne serwera służy do zapewnienia pomyślnego nawiązania połączenia między klientem a serwerem.
Używamy następujących wierszy kodu, aby wykonać wywołanie zwrotne serwera.
bool _BLEClientConnected = false; class MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
W ramach funkcji void setup inicjujemy komunikację szeregową pod adresem 115200 w celu debugowania, a następnie inicjalizujemy urządzenie Bluetooth za pomocą funkcji InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Wskaźnik poziomu baterii - BLE"); InitBLE (); }
InitBLE jest miejscem, gdzie wszystko dzieje się magia. Musimy stworzyć serwer Bluetooth i skorzystać tutaj z usługi Battery Level. Ale wcześniej musimy zdefiniować UUID dla usługi, cechy i deskryptora do odczytu poziomu baterii. Cały UUID można uzyskać ze strony internetowej usługi Bluetooth GATT. W naszym przypadku próbujemy użyć usługi baterii, a UUID jest zdefiniowany jako 0X180F, jak pokazano poniżej.
Następnie musimy znać charakterystykę związaną z tą usługą. Aby to wiedzieć, po prostu kliknij Serwis baterii, a zostaniesz przeniesiony na stronę Charakterystyka usługi, na której jest napisane, że poziom baterii to nazwa charakterystyk i przyjmuje wartość od 0 do 100. Pamiętaj również, że możemy wykonać tylko dwa akcje z tą cechą, jedna to Odczyt, która jest obowiązkowa, a druga to Powiadomienie, które jest opcjonalne. Musimy więc przesłać klientowi wartość baterii (Telefon), co jest obowiązkowe i w razie potrzeby możemy powiadomić telefon o tym, która jest opcjonalna.
Ale czekaj, nadal nie znaleźliśmy wartości UUID dla charakterystycznego poziomu baterii. Aby to zrobić, przejdź do strony Charakterystyka baterii i wyszukaj nazwę poziomu baterii, a znajdziesz jej UUID jako 0X2A19, migawka tego samego jest pokazana poniżej.
Teraz, gdy mamy już wszystkie wartości, umieśćmy go w programie, jak pokazano poniżej. Nazwy BatterySerivce , BatteryLevelCharacteristic i BatteryLevelDescriptor to zmienne zdefiniowane przez użytkownika, odnoszące się do usługi, cechy i deskryptora, których używamy w programie. Wartość dla deskryptora 0X2901 jest używana, gdy rozmiar wartości jest 8-bitowy. Więcej informacji można znaleźć na stronie Opis deskryptora.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Wracając do funkcji initBLE . Najpierw musimy uruchomić serwer BLE i sprawić, by reklamował się z nazwą. Na następujące linie są używane do uruchamiania BLE jako serwer. Nazwa, którą nadałem mojemu serwerowi BLe to „Bateria BLE”, ale możesz wybrać własną.
BLEDevice:: init ("Bateria BLE"); // Utwórz serwer BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (new MyServerCallbacks ());
Następnie musimy uruchomić usługę GATT, ponieważ mamy już zdefiniowany UUID, możemy po prostu uruchomić usługę korzystając z poniższej linii.
// Utwórz usługę BLE BLEService * pBattery = pServer-> createService (BatteryService);
Po uruchomieniu usługi możemy połączyć deskryptor z charakterystyką i ustawić wartości. Usługa BLE2902 została również dodana, jak pokazano poniżej.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Percentage 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (nowy BLE2902 ());
Wreszcie wszystko jest ustawione, teraz pozostaje tylko poprosić ESP32 o ogłoszenie, aby inne urządzenia, takie jak nasz telefon, mogły go wykryć i połączyć się z nim, a po podłączeniu do klienta powinno zainicjować usługę baterii, którą można wykonać za pomocą następujące wiersze.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Rozpocznij reklamowanie pServer-> getAdvertising () -> start ();
Czy to do tej pory dobrze, ostatnim krokiem jest wskazanie deskryptorowi, jaka jest wartość baterii w procentach, która ma zostać wysłana do klienta (Telefon). Ta wartość może wynosić od 0 do 100, jak czytaliśmy wcześniej, aby uprościć sprawę, po prostu zakodowałem na stałe wartość baterii na 57, a następnie zwiększam ją co 5 sekund i zaczynaj od 0, gdy osiągnie 100. Kod do zrobienia to jest pokazane poniżej. Zwróć uwagę, że wysyłana wartość ma format jednostka8_t.
uint8_t level = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); opóźnienie (5000); poziom ++; Serial.println (int (poziom)); if (int (level) == 100) level = 0; }
Testowanie usługi GATT na ESP32 BLE
Kompletny kod wyjaśniono powyżej jest podany na końcu strony. Prześlij kod do swojej płyty ESP32. Po załadowaniu telefon powinien wykryć urządzenie Bluetooth o nazwie „Bateria BLE”. Sparuj z nim.
Następnie zainstaluj aplikację nRF na Androida, otwórz ją i połącz się z urządzeniem BLE Battery BLE. Rozwiń sekcję Serwis baterii i powinieneś znaleźć następujący ekran.
Jak widać, aplikacja automatycznie zidentyfikowała, że BLE zapewnia obsługę baterii i ma charakterystykę poziomu baterii ze względu na identyfikator UUID, którego użyliśmy w programie. Możesz również zobaczyć, że aktualna wartość baterii, która wynosi 67%, czeka przez 5 sekund, a także możesz zauważyć, że wzrasta.
Fajną rzeczą w używaniu BLE jest to, że teraz każda aplikacja, która współpracuje z BLE, pomyśli, że twój ESP32 jest urządzeniem BLE, które powiadamia o poziomie baterii. Aby to wypróbować, użyłem aplikacji o nazwie BatON, a aplikacja zidentyfikowała ESP32 jako urządzenie Bluetooth zasilane bateryjnie i podała procentowe powiadomienie na moim telefonie w ten sposób
Fajne!! Dobrze? Całość pracy pokazałem również na poniższym filmie. Teraz, gdy nauczyłeś się korzystać z usług BLE Battery z ESP32, możesz wypróbować również inne usługi GATT, które są bardzo interesujące, takie jak tętno, HID, tętno itp. Baw się dobrze….