- Terminologies liées à BLE (Bluetooth Low Energy)
- Préparation du matériel
- Programmation de l'ESP32 pour l'indication du niveau de batterie à l'aide du service GATT
- Tester votre service GATT sur ESP32 BLE
Écouteurs sans fil, bandes de fitness, haut-parleurs Bluetooth, écouteurs intra-auriculaires, téléphones portables, ordinateurs portables… il y a tellement d'appareils Bluetooth autour de nous et la plupart de ces appareils fonctionnent sur batterie. Vous êtes-vous déjà demandé que, lorsque vous connectez un appareil Bluetooth à votre téléphone mobile, comment il comprend automatiquement que l'appareil connecté est un ordinateur ou un appareil audio ou un téléphone mobile? Pour certains appareils, notre téléphone peut même afficher automatiquement le pourcentage de batterie de l'appareil connecté dans la barre de notification. Comment tout cela se fait-il d'eux-mêmes? Il devrait y avoir un protocole commun partagé entre le téléphone et le périphérique Bluetooth!
Restez curieux, vous obtiendrez des réponses à ces questions pendant que nous essayons de comprendre Bluetooth Low Energy (BLE pour faire court), avec le module ESP32 populaire. Contrairement au Bluetooth classique dans ESP32, le BLE ne fonctionne que lorsqu'une communication est activée et reste en mode veille sinon, cela en fait le bon choix pour les applications alimentées par batterie. BLE peut également former des réseaux maillés et agir comme des balises. Normalement, un module BLE fonctionne soit en tant que serveur soit en tant que client, ici nous utiliserons ESP32 BLE comme serveur.
Ici, nous avons divisé l' ESP32 Bluetooth complet en trois segments pour une meilleure compréhension.
1. Bluetooth série sur le voyant de basculement ESP32 à partir du téléphone portable
2 . Serveur BLE pour envoyer les données de niveau de batterie au téléphone portable à l'aide du service GATT
3. Le client BLE recherche les périphériques BLE et joue le rôle de balise.
Nous avons déjà couvert le premier article; dans cet article, nous allons apprendre comment faire fonctionner l'ESP32 BLE en tant que serveur et utiliser le service GATT pour envoyer des informations sur le niveau de la batterie. À des fins de test, nous enverrons des valeurs codées en dur depuis ESP32 sous forme de pourcentage de batterie à notre téléphone mobile via le service BLE GATT, de cette façon, notre mobile supposera que l'ESP32 est un appareil Bluetooth fonctionnant sur batterie qui tente d'envoyer son pourcentage de batterie. Avant d'entrer dans les détails, nous allons comprendre quelques terminologies liées à Bluetooth Low Energy.
Terminologies liées à BLE (Bluetooth Low Energy)
Serveur BLE: Comme indiqué précédemment, le BLE peut être programmé pour fonctionner en tant que serveur ou en tant que client. Lorsqu'il travaille en tant que serveur, le BLE ne peut fournir que des données, il ne peut pas établir de connexion. Un exemple serait un groupe de fitness. Un serveur ne peut envoyer des informations que si le client en fait la demande.
Le plus souvent, le BLE de l'ESP32 est utilisé comme serveur. Chaque serveur aura un ou plusieurs services en son sein et de même chaque service aura une ou plusieurs caractéristiques qui lui sont associées. Une caractéristique peut contenir zéro, un ou plusieurs descripteurs. Chaque service, caractéristique ou descripteur aura son propre identifiant unique prédéfini appelé UUID.
Client BLE: le client peut scanner la connexion et écouter d'autres appareils Bluetooth. Un exemple serait votre téléphone mobile. Notez que la plupart des périphériques matériels BLE peuvent fonctionner en tant que serveur et en tant que client, c'est le logiciel qui décide du rôle du périphérique.
Périphérique / Périphérique central: Dans un réseau BLE, il ne peut y avoir qu'un seul périphérique central, mais peut avoir autant de périphériques que nécessaire. Le périphérique central peut se connecter à tous les périphériques en même temps, mais le périphérique ne peut se connecter qu'au périphérique central, de cette façon, aucun périphérique ne peut partager des données entre eux. Un meilleur exemple pour l'appareil Central sera nos téléphones intelligents et pour l'appareil périphérique seront nos écouteurs Bluetooth ou nos bandes de fitness.
Publicité BLE: Une publicité BLE est le terme geek pour demander au périphérique Bluetooth d'être visible par tous afin qu'il puisse se coupler et établir une connexion. Cela peut être considéré comme une communication à sens unique. Ici, le serveur continue d'annoncer des données en attendant qu'un serveur les reçoive. BLE Beacon est un type de BLE.
UUID (Universal Unique Identifier): Chaque appareil Bluetooth BLE reçoit un numéro d'identification unique universel lorsqu'il est programmé par le programmeur. Vous pouvez considérer cet identifiant comme une séquence de nombres qui représente la fonctionnalité / le rôle du périphérique BLE. Là encore, il existe deux types d'UUID. L'un est l' UUID de service et l'autre est l' UUID caractéristique.
Service GATT: GATT signifie Generic Attribute Profile; cela définit quelques moyens standard par lesquels deux périphériques BLE doivent toujours communiquer. Ce protocole d'attribut (ATT) est prédéfini et est commun à tous les périphériques BLE, de sorte que deux périphériques BLE peuvent s'identifier l'un l'autre. Le GATT était donc la réponse à notre question précédente.
La technique à l'aide de laquelle deux appareils BLE doivent envoyer des données vers et depuis est définie par le concept appelé services et caractéristiques.
Service BLE / caractéristique BLE: L'UUID de service nous indique le type de service que le dispositif BLE va effectuer et l'UUID caractéristique indique quels sont les paramètres ou fonctions qui seront exécutés par ce service. Ainsi, chaque service aura une ou plusieurs caractéristiques sous eux. D'accord! D'où le programmeur obtient-il cet UUID? Chaque UUID est déjà défini par le GATT (Generic Attribute Profile), vous pouvez visiter leur site Web et sélectionner l'UUID comme requis pour le projet. Je sais que cela a rebondi un peu au-dessus de notre tête; essayons de le comprendre avec un exemple.
Supposons le périphérique BLE d'un lecteur audio. Au départ, lorsque vous le jumelez avec votre téléphone, votre téléphone l'identifie comme un périphérique audio et affiche également le niveau de la batterie dans la barre d'état. Donc, pour que cela se produise, le lecteur audio doit en quelque sorte dire à votre téléphone qu'il est prêt à partager le niveau de la batterie et le pourcentage de charge qu'il contient. Cela se fait en utilisant l'UUID, il y a un UUID spécifique qui indique que les dés BLE vont fournir des détails sur le niveau de la batterie cet UUID qui indique que le type de service est appelé Service UUID, encore une fois il pourrait y avoir tellement de paramètres qui doivent être échangé pour compléter un service comme la valeur de la batterie est sur un tel paramètre, chaque paramètre aura son propre UUID et ceux-ci sont appelés l' UUID caractéristique.La fonction commune exécutée par une caractéristique est Lire, Ecrire, Notifier et Indiquer.
Descripteur BLE: Le Descripteur est un attribut facultatif présent à l'intérieur de la Caractéristique. Un descripteur spécifie normalement comment accéder à une caractéristique.
Balise BLE: Une balise Bluetooth ressemble plus à un commutateur de proximité qui effectue une action prédéfinie lorsque l'utilisateur entre dans une plage (proximité). Il annonce son identité tout le temps et est donc toujours prêt à s'associer.
BLE2902: Je suis toujours sceptique à propos de cette chose, mais vous pouvez le considérer comme un logiciel côté client qui informe le serveur d'activer ou de désactiver la notification, cela nous aidera à économiser de l'énergie
J'espère que vous avez une idée approximative, le point positif est que nous n'avons pas besoin d'en savoir beaucoup puisque tout le travail manuel est déjà fait pour nous via les bibliothèques.
Préparation du matériel
Le projet ne nécessite aucune configuration matérielle, mais assurez-vous d'avoir ajouté les détails de la carte ESP32 sur votre Arduino IDE et d'avoir essayé un exemple de programme de clignotement minimum pour vérifier si tout fonctionne comme prévu. Vous êtes sceptique sur la façon de le faire, vous pouvez suivre le tutoriel Premiers pas avec ESP32 avec Arduino pour faire de même.
Aussi pour tester les services BLE, nous utiliserons l'application android nRF sur notre mobile qui peut être directement téléchargée depuis le PlayStore. Il est également disponible dans Itunes Store pour les utilisateurs d'iPhone. Si vous prévoyez de travailler avec BLE pendant une longue période, cette application sera vraiment utile à des fins de débogage.
Programmation de l'ESP32 pour l'indication du niveau de batterie à l'aide du service GATT
À ce stade, je suppose que vous avez une idée juste du service du GATT et de la manière dont il est mis en œuvre en utilisant des modèles de service et caractéristiques. Maintenant, plongons dans le programme pour savoir comment il est implémenté dans ESP32 à l'aide de l'IDE Arduino. Avant de continuer, j'aimerais utiliser cet espace pour remercier Andreas Spiess pour sa vidéo BLE qui a rendu les choses très claires de mon côté.
Nous commençons le programme en important les bibliothèques requises dans notre croquis. Il y a beaucoup de choses à configurer pour utiliser la fonctionnalité BLE de l'ESP32, espérons-le, cependant, grâce à Neil Kolban qui a déjà fait le dur travail pour nous et a fourni les bibliothèques. Si vous voulez comprendre les fonctionnalités des bibliothèques, vous pouvez vous référer à sa documentation sur la page github.
#comprendre
Ensuite, nous devons définir la fonction de rappel du serveur pour notre appareil Bluetooth. Avant cela, comprenons ce qu'est la fonction de rappel dans BLE.
Qu'est-ce que la fonction de rappel dans BLE?
Lorsque BLE fonctionne en tant que serveur, il est important de définir une fonction de rappel du serveur. Il existe de nombreux types de rappels associés à BLE, mais pour faire simple, vous les considérez comme un accusé de réception effectué pour vous assurer que l'action a été effectuée. Un rappel de serveur est utilisé pour garantir que la connexion entre le client et le serveur est établie avec succès.
Nous utilisons les lignes de code suivantes pour effectuer un rappel de serveur.
booléen _BLEClientConnected = false; class MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
À l'intérieur de la fonction de configuration d' annulation, nous initions une communication série à 115200 pour le débogage, puis nous initialisons le périphérique Bluetooth via la fonction InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Indicateur de niveau de batterie - BLE"); InitBLE (); }
L' initBLE est le lieu où toute la magie opère . Nous devons créer un serveur Bluetooth et utiliser le service de niveau de batterie ici. Mais avant cela, nous devons définir l'UUID pour le service, la caractéristique et le descripteur pour lire le niveau de batterie. Tous les UUID peuvent être obtenus sur le site Web du service Bluetooth GATT. Dans notre cas, nous essayons d'utiliser le service Batterie et l'UUID car il est défini comme 0X180F comme indiqué ci-dessous.
Ensuite, nous devons connaître la caractéristique associée à ce service. Pour le savoir, cliquez simplement sur Battery Service et vous serez redirigé vers la page Caractéristiques du service, où il est mentionné que le niveau de batterie est le nom des caractéristiques et il prend la valeur de 0 à 100. Notez également que nous ne pouvons effectuer que deux actions avec cette caractéristique, l'une est de lire ce qui est obligatoire à faire et l'autre est de notifier qui est facultatif. Nous devons donc envoyer la valeur de la batterie au client (téléphone), ce qui est obligatoire et si nécessaire, nous pouvons informer le téléphone de ce qui est facultatif.
Mais attendez, nous n'avons toujours pas trouvé la valeur UUID pour le niveau de batterie caractéristique. Pour ce faire, accédez à la page Caractéristiques de la batterie et recherchez le nom du niveau de batterie, vous trouverez son UUID sous la forme 0X2A19, un instantané de celui-ci est illustré ci-dessous.
Maintenant que nous avons toutes les valeurs, mettons le programme comme indiqué ci-dessous. Le nom BatterySerivce , BatteryLevelCharacteristic et BatteryLevelDescriptor sont des variables définies par l'utilisateur pour faire référence au service, à la caractéristique et au descripteur que nous utilisons dans le programme. La valeur du descripteur 0X2901 est utilisée lorsque la taille de la valeur est de 8 bits, plus d'informations peuvent être trouvées sur la page Description du descripteur.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Revenir à la fonction initBLE . Nous devons d'abord démarrer le serveur BLE et le faire annoncer avec un nom. Les lignes suivantes sont utilisées pour démarrer le BLE en tant que serveur. Le nom que j'ai donné à mon serveur BLe est «BLE Battery», mais vous pouvez choisir le vôtre.
BLEDevice:: init ("Batterie BLE"); // Créer le serveur BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (nouveau MyServerCallbacks ());
Ensuite, nous devons démarrer le service GATT puisque nous avons déjà défini l'UUID, nous pouvons simplement démarrer le service en utilisant la ligne ci-dessous.
// Créer le service BLE BLEService * pBattery = pServer-> createService (BatteryService);
Une fois le service démarré, nous pouvons lier le descripteur aux caractéristiques et définir les valeurs. Le service BLE2902 est également ajouté ici, comme indiqué ci-dessous.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Pourcentage 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (nouveau BLE2902 ());
Enfin, tout est réglé, il ne reste plus qu'à demander à l'ESP32 de faire de la publicité afin que d'autres appareils comme notre téléphone puissent le découvrir et s'y connecter, et lorsqu'il est connecté à un client, il doit lancer le service de batterie qui peut être fait via le lignes suivantes.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Lancer la publicité pServer-> getAdvertising () -> start ();
Voilà pour l'instant tout va bien, la dernière étape consiste à indiquer au descripteur quelle est la valeur de la batterie en pourcentage qui doit être envoyée au client (téléphone). Cette valeur peut être comprise entre 0 et 100 comme nous l'avons lu précédemment, pour simplifier les choses, j'ai simplement codé en dur la valeur de la batterie à 57, puis l'incrémente toutes les 5 secondes et commence à 0 une fois qu'elle atteint 100. Le code à faire qui est montré ci-dessous. Notez que la valeur envoyée est au format unit8_t.
niveau uint8_t = 57; boucle void () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); retard (5000); level ++; Serial.println (int (niveau)); if (int (niveau) == 100) niveau = 0; }
Tester votre service GATT sur ESP32 BLE
Le code complet expliqué ci-dessus est donné en fin de page. Téléchargez le code sur votre carte ESP32. Une fois téléchargé, votre téléphone devrait découvrir un appareil Bluetooth appelé «batterie BLE».
Ensuite, installez l'application Android nRF, ouvrez-la et connectez-vous à l'appareil BLE Battery BLE. Développez la section Battery Service et vous devriez trouver l'écran suivant.
Comme vous pouvez le voir, l'application a automatiquement identifié que le BLE fournit un service de batterie et a les caractéristiques de niveau de batterie en raison de l'UUID que nous avons utilisé dans le programme. Vous pouvez également voir que la valeur actuelle de la batterie, qui est de 67%, attend 5 secondes et vous pouvez également la remarquer qu'elle augmente.
La chose intéressante à propos de l'utilisation de BLE est que désormais, toute application qui fonctionne avec BLE pensera que votre ESP32 est un appareil BLE qui notifie le niveau de la batterie. Pour l'essayer, j'ai utilisé une application appelée BatON et l'application a identifié l'ESP32 comme un appareil Bluetooth alimenté par batterie et a donné la notification de pourcentage sur mon téléphone comme ceci
Cool!! Droite? J'ai également montré le fonctionnement complet dans la vidéo ci-dessous. Maintenant que vous avez appris à utiliser les services BLE Battery avec ESP32, vous pouvez également essayer d'autres services GATT qui sont très intéressants comme la fréquence du pouls, le HID, la fréquence cardiaque etc. Amusez-vous bien….