- Terminologien im Zusammenhang mit BLE (Bluetooth Low Energy)
- Hardware vorbereiten
- Programmierung von ESP32 für die Anzeige des Batteriestands mithilfe des GATT-Dienstes
- Testen Ihres GATT-Dienstes auf ESP32 BLE
Drahtlose Kopfhörer, Fitnessbänder, Bluetooth-Lautsprecher, In-Ear-Kopfhörer, Mobiltelefone, Laptops… Es gibt so viele Bluetooth-Geräte um uns herum und die meisten dieser Geräte sind batteriebetrieben. Haben Sie sich jemals gefragt, wie beim Verbinden eines Bluetooth-Geräts mit Ihrem Mobiltelefon automatisch erkannt wird, dass es sich bei dem angeschlossenen Gerät um einen Computer, ein Audiogerät oder ein Mobiltelefon handelt? Bei einigen Geräten zeigt unser Telefon möglicherweise sogar automatisch den Batterieprozentsatz des angeschlossenen Geräts in der Benachrichtigungsleiste an. Wie passiert das alles alleine? Es sollte ein gemeinsames Protokoll zwischen dem Telefon und dem Bluetooth-Gerät geben, richtig!
Bleiben Sie neugierig, Sie werden Antworten auf diese Fragen erhalten, wenn wir versuchen, Bluetooth Low Energy (kurz BLE) mit dem beliebten ESP32-Modul zu verstehen. Im Gegensatz zu klassischem Bluetooth in ESP32 funktioniert die BLE nur, wenn eine Kommunikation aktiviert ist, und bleibt ansonsten im Ruhemodus. Dies macht sie zur richtigen Wahl für batteriebetriebene Anwendungen. BLE kann auch Mesh-Netzwerke bilden und als Beacons fungieren. Normalerweise arbeitet ein BLE-Modul entweder als Server oder als Client. Hier verwenden wir ESP32 BLE als Server.
Hier haben wir das gesamte ESP32 Bluetooth zum besseren Verständnis in drei Segmente unterteilt.
1. Serielles Bluetooth am ESP32 schaltet die LED vom Mobiltelefon um
2 . BLE-Server zum Senden von Daten zum Akkuladestand mithilfe des GATT-Dienstes an das Mobiltelefon
3. BLE-Client, um nach BLE-Geräten zu suchen und als Beacon zu fungieren.
Wir haben bereits den ersten Artikel behandelt; In diesem Artikel erfahren Sie, wie Sie den ESP32 BLE als Server einsetzen und mithilfe des GATT-Dienstes Informationen zum Batteriestand senden. Zu Testzwecken senden wir fest codierte Werte von ESP32 als Batterieprozentsatz über den BLE GATT-Dienst an unser Mobiltelefon. Auf diese Weise geht unser Mobiltelefon davon aus, dass ESP32 ein batteriebetriebenes Bluetooth-Gerät ist, das versucht, an seinen Batterieprozentsatz zu senden. Bevor wir ins Detail gehen, werden wir einige Terminologien im Zusammenhang mit Bluetooth Low Energy verstehen.
Terminologien im Zusammenhang mit BLE (Bluetooth Low Energy)
BLE-Server: Wie bereits erwähnt, kann die BLE so programmiert werden, dass sie entweder als Server oder als Client funktioniert. Wenn Sie als Server arbeiten, kann die BLE nur Daten bereitstellen, die keine Verbindung herstellen können. Beispiel wäre eine Fitnessband. Ein Server kann Informationen nur senden, wenn der Client dies anfordert.
Am häufigsten wird die BLE des ESP32 als Server verwendet. Jeder Server enthält einen oder mehrere Dienste, und in ähnlicher Weise sind jedem Dienst ein oder mehrere Merkmale zugeordnet. Ein Merkmal kann null, einen oder mehr als einen Deskriptor enthalten. Jeder Dienst, jedes Merkmal oder jeder Deskriptor verfügt über eine eigene vordefinierte eindeutige ID namens UUID.
BLE-Client: Der Client kann die Verbindung scannen und andere Bluetooth-Geräte abhören. Ein Beispiel wäre Ihr Mobiltelefon. Beachten Sie, dass die meisten BLE-Hardwaregeräte als Server und als Client fungieren können. Diese Software entscheidet über die Rolle des Geräts.
Peripheriegerät / Zentralgerät: In einem BLE-Netzwerk kann es nur ein Zentralgerät geben, es können jedoch so viele Peripheriegeräte wie erforderlich vorhanden sein. Das Zentralgerät kann gleichzeitig eine Verbindung zu allen Peripheriegeräten herstellen, das Peripheriegerät kann jedoch nur eine Verbindung zum Zentralgerät herstellen. Auf diese Weise können keine zwei Peripheriegeräte Daten untereinander austauschen. Ein bestes Beispiel für ein zentrales Gerät sind unsere Smartphones, und für ein Peripheriegerät sind unsere Bluetooth-Kopfhörer oder Fitnessbänder.
BLE-Werbung: Eine BLE-Werbung ist der geekige Begriff, um das Bluetooth-Gerät anzuweisen, für alle sichtbar zu sein, damit es eine Verbindung herstellen und herstellen kann. Es kann als Einwegkommunikation betrachtet werden. Hier setzt der Server weiterhin Werbedaten fort und erwartet, dass ein Server sie empfängt. BLE Beacon ist eine Art BLE.
UUID (Universal Unique Identifier): Jedes BLE Bluetooth-Gerät erhält eine vom Programmierer programmierte Universal Unique Identifier Number. Sie können sich diese Kennung als eine Folge von Zahlen vorstellen, die die Funktionalität / Rolle des BLE-Geräts darstellt. Wieder gibt es zwei Arten von UUID. Eine ist die Service-UUID und die andere ist die charakteristische UUID.
GATT-Service: GATT steht für Generic Attribute Profile; Dies definiert einige Standardmethoden, mit denen zwei BLE-Geräte immer kommunizieren sollten. Dieses Attributprotokoll (ATT) ist vordefiniert und gilt für alle BLE-Geräte. Auf diese Weise können sich zwei beliebige BLE-Geräte identifizieren. Das GATT war also die Antwort auf unsere vorherige Frage.
Die Technik, mit der zwei BLE-Geräte Daten hin und her senden sollen, wird durch das Konzept definiert, das als Dienste und Merkmale bezeichnet wird.
BLE-Dienst / BLE-Merkmal: Die Dienst-UUID gibt an, welche Art von Dienst das BLE-Gerät ausführen wird, und die charakteristische UUID gibt an, welche Parameter oder Funktionen von diesem Dienst ausgeführt werden. Jeder Service hat also eine oder mehrere Eigenschaften. Okay! Woher bezieht der Programmierer diese UUID? Jede UUID ist bereits durch das GATT (Generic Attribute Profile) definiert. Sie können deren Website besuchen und die für das Projekt erforderliche UUID auswählen. Ich weiß, dass es ein bisschen über unseren Kopf gesprungen ist; Versuchen wir es anhand eines Beispiels zu verstehen.
Nehmen wir das BLE-Gerät eines Audio-Players an. Wenn Sie es zunächst mit Ihrem Telefon koppeln, erkennt Ihr Telefon es zunächst als Audiogerät und zeigt auch den Akkuladestand in der Statusleiste an. Damit dies geschieht, muss der Audio-Player Ihrem Telefon irgendwie mitteilen, dass es bereit ist, den Akkuladestand und den Prozentsatz der im Akku enthaltenen Ladung zu teilen. Dies geschieht mithilfe der UUID. Es gibt eine bestimmte UUID, die angibt, dass die BLE-Würfel Details zum Batteriestand liefern. Diese UUID gibt an, dass die Art des Dienstes als Dienst-UUID bezeichnet wird. Auch hier können so viele Parameter erforderlich sein Um einen Dienst abzuschließen, wie der Wert der Batterie auf einem solchen Parameter liegt, hat jeder Parameter seine eigene UUID und diese werden als charakteristische UUID bezeichnet.Die gemeinsame Funktion eines Merkmals ist Lesen, Schreiben, Benachrichtigen und Anzeigen.
BLE-Deskriptor: Der Deskriptor ist ein optionales Attribut, das im Merkmal vorhanden ist. Ein Deskriptor gibt normalerweise an, wie auf ein Merkmal zugegriffen werden soll.
BLE-Beacon: Ein Bluetooth-Beacon ähnelt eher einem Näherungsschalter, der eine vordefinierte Aktion ausführt, wenn sich der Benutzer in Reichweite befindet (Nähe). Es wirbt ständig für seine Identität und ist daher immer bereit, sich zu paaren.
BLE2902: Ich bin immer noch skeptisch, aber Sie können sich das als eine Software auf der Clientseite vorstellen, die den Server anweist, die Benachrichtigung ein- oder auszuschalten. Dies hilft uns, Strom zu sparen
Ich hoffe, Sie haben eine ungefähre Vorstellung. Das Gute ist, dass wir nicht viel wissen müssen, da die gesamte Handarbeit bereits in den Bibliotheken für uns erledigt ist.
Hardware vorbereiten
Für das Projekt ist keine Hardware-Einrichtung erforderlich. Stellen Sie jedoch sicher, dass Sie Details zur ESP32-Karte in Ihrer Arduino IDE hinzugefügt und ein minimales Beispiel-Blinkprogramm ausprobiert haben, um zu überprüfen, ob alles wie erwartet funktioniert. Wenn Sie skeptisch sind, wie es geht, können Sie dem Tutorial Erste Schritte mit ESP32 mit Arduino folgen, um dasselbe zu tun.
Zum Testen der BLE-Dienste verwenden wir auch die nRF-Android-Anwendung auf unserem Handy, die direkt aus dem PlayStore heruntergeladen werden kann. Es ist auch im Itunes Store für Iphone-Benutzer verfügbar. Wenn Sie vorhaben, längere Zeit mit BLE zu arbeiten, ist diese Anwendung für Debugging-Zwecke sehr nützlich.
Programmierung von ESP32 für die Anzeige des Batteriestands mithilfe des GATT-Dienstes
Zu diesem Zeitpunkt gehe ich davon aus, dass Sie eine gute Vorstellung davon haben, welcher GATT-Service und wie er mithilfe von Service- und Merkmalsmodellen implementiert wird. Lassen Sie uns nun in das Programm eintauchen, um zu erfahren, wie es mit der Arduino IDE in ESP32 implementiert wird. Bevor wir fortfahren, möchte ich diesen Raum nutzen, um Andreas Spiess für sein Video BLE zu danken, das die Dinge auf meiner Seite sehr deutlich gemacht hat.
Wir beginnen das Programm mit dem Import der erforderlichen Bibliotheken in unsere Skizze. Es gibt eine Menge Dinge zu konfigurieren, um die BLE-Funktionalität des ESP32 zu nutzen, hoffentlich dank Neil Kolban, der bereits die harte Arbeit für uns geleistet und die Bibliotheken bereitgestellt hat. Wenn Sie die Funktionalität der Bibliotheken verstehen möchten, können Sie seine Dokumentation auf der Github-Seite lesen.
#einschließen
Als nächstes müssen wir die Server-Rückruffunktion für unser Bluetooth-Gerät definieren. Vorher lassen Sie uns verstehen, was Rückruffunktion in BLE ist.
Was ist die Rückruffunktion in BLE?
Wenn BLE als Server ausgeführt wird, ist es wichtig, eine Server-Rückruffunktion zu definieren. Mit BLE sind viele Arten von Rückrufen verbunden. Vereinfacht ausgedrückt betrachten Sie diese als Bestätigung, die ausgeführt wird, um sicherzustellen, dass die Aktion abgeschlossen wurde. Ein Server-Rückruf wird verwendet, um sicherzustellen, dass die Verbindung zwischen Client und Server erfolgreich hergestellt wurde.
Wir verwenden die folgenden Codezeilen, um einen Server-Rückruf durchzuführen.
bool _BLEClientConnected = false; Klasse MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Innerhalb der Void-Setup- Funktion initiieren wir bei 115200 die serielle Kommunikation zum Debuggen und initialisieren dann das Bluetooth-Gerät über die InitBLE- Funktion.
void setup () { Serial.begin (115200); Serial.println ("Batteriestandsanzeige - BLE"); InitBLE (); }}
Das InitBLE ist der Ort, an dem all die Magie geschieht. Wir müssen hier einen Bluetooth-Server erstellen und den Batteriestand-Dienst verwenden. Zuvor müssen wir jedoch die UUID für Service, Charakteristik und Deskriptor zum Ablesen des Batteriestands definieren. Die gesamte UUID kann von der Bluetooth GATT-Service-Website abgerufen werden. In unserem Fall versuchen wir, den Batteriedienst zu verwenden, und die UUID ist wie unten gezeigt als 0X180F definiert.
Als nächstes müssen wir die mit diesem Service verbundenen Merkmale kennen. Um dies zu wissen, klicken Sie einfach auf Batterieservice und Sie werden zur Seite Serviceeigenschaften weitergeleitet, auf der erwähnt wird, dass der Batteriestand der Name der Eigenschaften ist und den Wert von 0 bis 100 annimmt. Beachten Sie auch, dass wir nur zwei ausführen können Bei Aktionen mit dieser Eigenschaft ist eine zu lesen, was obligatorisch ist, und die andere ist Benachrichtigen, was optional ist. Wir müssen also den Batteriewert an den Client (Telefon) senden, der obligatorisch ist, und bei Bedarf können wir das Telefon darüber informieren, was optional ist.
Warten Sie, wir haben den UUID-Wert für den charakteristischen Batteriestand immer noch nicht gefunden. Gehen Sie dazu auf die Seite Batteriecharakteristik und suchen Sie nach dem Namen der Batteriestufe. Dort finden Sie die UUID 0X2A19. Der Schnappschuss derselben ist unten dargestellt.
Nachdem wir alle Werte haben, lassen Sie uns das Programm wie unten gezeigt einfügen. Die Namen BatterySerivce , BatteryLevelCharacteristic und BatteryLevelDescriptor sind benutzerdefinierte Variablen, die auf den Dienst, die Charakteristik und den Deskriptor verweisen, die wir im Programm verwenden. Der Wert für den Deskriptor 0X2901 wird verwendet, wenn der Wert 8 Bit beträgt. Weitere Informationen finden Sie auf der Seite Beschreibung des Deskriptors.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Zurück zur initBLE- Funktion. Wir müssen zuerst den BLE-Server starten und ihn mit einem Namen werben lassen. Die folgenden Zeilen werden verwendet, um die BLE als Server zu starten. Der Name, den ich meinem BLe-Server gegeben habe, lautet "BLE Battery", aber Sie können Ihren eigenen auswählen.
BLEDevice:: init ("BLE-Batterie"); // BLE Server erstellen BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (neue MyServerCallbacks ());
Als nächstes müssen wir den GATT-Dienst starten, da wir die UUID bereits definiert haben. Wir können den Dienst einfach über die folgende Zeile starten.
// BLE Service erstellen BLEService * pBattery = pServer-> createService (BatteryService);
Sobald der Dienst gestartet ist, können wir den Deskriptor mit Merkmalen verknüpfen und die Werte festlegen. Der BLE2902-Dienst wird auch hier hinzugefügt, wie unten gezeigt.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Prozentsatz 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (neues BLE2902 ());
Schließlich ist alles eingestellt. Jetzt müssen Sie nur noch den ESP32 bitten, Werbung zu schalten, damit andere Geräte wie unser Telefon ihn erkennen und eine Verbindung herstellen können. Wenn er mit einem Client verbunden ist, sollte er den Batteriedienst einleiten, der über das Internet ausgeführt werden kann folgenden Zeilen.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Werbung starten pServer-> getAdvertising () -> start ();
Das ist so weit so gut, der letzte Schritt ist, dem Deskriptor zu sagen, wie hoch der Wert der Batterie in Prozent ist, der an den Client (Telefon) gesendet werden soll. Dieser Wert kann zwischen 0 und 100 liegen, wie wir zuvor gelesen haben. Um die Dinge einfach zu halten, habe ich den Wert der Batterie einfach auf 57 fest codiert und ihn dann alle 5 Sekunden erhöht und bei 0 begonnen, sobald er 100 erreicht hat. Der zu erledigende Code das ist unten gezeigt. Beachten Sie, dass der gesendete Wert das Format unit8_t hat.
uint8_t level = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); Verzögerung (5000); Level ++; Serial.println (int (Ebene)); if (int (level) == 100) level = 0; }}
Testen Ihres GATT-Dienstes auf ESP32 BLE
Der oben erläuterte vollständige Code befindet sich am Ende der Seite. Laden Sie den Code auf Ihre ESP32-Karte hoch. Nach dem Hochladen sollte Ihr Telefon ein Bluetooth-Gerät namens "BLE Battery" Pair damit erkennen.
Installieren Sie dann die nRF-Android-Anwendung, öffnen Sie sie und stellen Sie eine Verbindung zum BLE-Batterie-BLE-Gerät her. Erweitern Sie den Abschnitt Batterieservice, und Sie sollten den folgenden Bildschirm finden.
Wie Sie sehen können, hat die Anwendung automatisch erkannt, dass die BLE einen Batterieservice bereitstellt und aufgrund der im Programm verwendeten UUID die Eigenschaften des Batteriestands aufweist. Sie können auch sehen, dass der aktuelle Batteriewert, der 67% beträgt, 5 Sekunden wartet, und Sie können auch feststellen, dass er erhöht wird.
Das Coole an der Verwendung von BLE ist, dass jetzt jede Anwendung, die mit BLE arbeitet, denkt, dass Ihr ESP32 ein BLE-Gerät ist, das den Batteriestand meldet. Zum Ausprobieren habe ich eine Anwendung namens BatON verwendet. Die Anwendung hat den ESP32 als batteriebetriebenes Bluetooth-Gerät identifiziert und die prozentuale Benachrichtigung auf meinem Telefon wie folgt ausgegeben
Cool!! Recht? Ich habe auch die komplette Arbeit im Video unten gezeigt. Nachdem Sie nun gelernt haben, wie man BLE-Batteriedienste mit ESP32 verwendet, können Sie auch andere GATT-Dienste ausprobieren, die sehr interessant sind, wie Pulsfrequenz, HID, Herzfrequenz usw. Viel Spaß…