TP BLE

publicité
TP Bluetooth LE Objets Communicants Dino Lopez [email protected] Ce TP a pour but de vous faire comprendre l’architecture des services Bluetooth Low Energy par la pratique. Nous allons donc dans un premier temps explorer les services offerts par un capteur de rythme cardiaque utilisant BLE, et ensuite, selon le temps disponible, automatiser la manipulation et lecteur du capteur par le biais d’un programme écrit en Python. 1. Manipulation par la CLI Les dispositifs BLEs ayant une architecture plus simple que les dispositifs Bluetooth Classique, leur manipulation est encore plus simple. Exercice 1. Premièrement, connectez votre BLE au port USB de votre machine, et soyez sûr qu’il a été bien reconnu par le système grâce à la commande « hcitool dev ». Si le dispositif BLE est bien reconnu, passez à l’étape suivante. Exercice 2. Activez votre capteur de rythme cardiaque. Pour cela, vous devez attacher le capteur à sa ceinture et humidifier légèrement les capteurs de la ceinture (partie plastique). Pour éviter que le capteur s’éteigne, il faut malheureusement donner une utilisation classique au capteur (i.e. mesurez votre rythme cardiaque). Exercice 3. Le paramètre « lescan » de hcitool permet de retrouver des dispositifs BLE à proximité. Utilisez-­‐le pur détecter la présence de votre capteur de rythme cardiaque. Notez bien que l’adresse indiquez dans votre capteur correspond à celui que vous retrouvez dans le terminal. Si vous détectez correctement le capteur, passez à l’étape suivante. Exercice 4. Connectez votre interface BLE au capteur et créez une session interactive avec : « gatttool -­‐i hci0 -­‐b <addr_capteur> -­‐I ». Si gatttool s’exécute correctement (vous avez la CLI sur votre terminal), exécutez la commande « connect ». Exercice 5. Listez avec « primary » les services offerts par le capteur. Vous obtiendrez quelques lignes ressemblant à « attr handle: 0x0001, end grp handle: 0x000a uuid: XXXXXXXX-­‐YYYY-­‐YYYY-­‐YYYY-­‐YYYYYYYYYYYY ». Ceci indiquerait que le service avec UUID possède plusieurs caractéristiques (ou attributs), la première caractéristique est stockée dans le handle 0x0001, et la dernière, dans le handle 0x000a. Pour rappelle, tandis que les services standards sont décrit par des UUID à 16 bits (ce qui donnerait une UUID de type 0000XXXX dans le premier groupe de chiffres), les services non standardisés sont décrits par des UUID à 128 bits. Le service heart rate monitor est un service standardisé. Grâce à la page web https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx?_ga=1.26855
481.582165808.1450632533 retrouvez l’UUID des services offerts par votre capteur et dites quels handlers décrivent/gèrent ce service. Exercice 6. Listez avec char-­‐desc (plus d’information sur les commandes dans les slides de la partie BLE du cours) les handlers du service heart rate. Vous obtiendrez des lignes avec un format « handle: 0x0001, uuid: XXXXXXXX-­‐YYYY-­‐YYYY-­‐YYYY-­‐YYYYYYYYYYYY » (pour rappelle, l’UUID peut être décrit sur 16 bits ou 128 bits). Faites click sur le lien heart rate et dans la section « Services Characteristics », et trouvez quel handle fournit le service de notification du rythme cardiaque mesuré (trouver l’ID en suivant le lien de la colonne « Overview ») et quel handler fournit le service de configuration de la notification (trouver l’ID en suivant le lien de la colonne « Descriptors »). Exercice 7. Avec char-­‐read-­‐hnd, trouvez la configuration actuelle du capteur. Exercice 8. Avec char-­‐write-­‐req activez la notification des mesures du rythme cardiaque. Pour rappelle, les octets à écrire doivent être écrit en ordre little endian, et en format hexadécimal, mais sans le « 0x ». Exemple : 0A00 pour écrire le numéro hexadécimal 000A. Exercice 9. Avec char-­‐write-­‐req désactivez la notification des mesures du rythme cardiaque. 2. Manipulation avec PyGattlib PyGattlib est un wrapper autour de gatttool, qui vous permet d’automatiser ce que vous avez fait par la CLI, précédemment, dans un programme Python. PyGattlib est très simple d’utilisation car il permet de s’abstraire du management de ressources par DBus. Vous avez sur la page principale de PyGattlib (https://bitbucket.org/OscarAcena/pygattlib/overview) des snippets pour exécuter les tâches principales : lire des handlers, écrire sur les handlers et recevoir les notifications. De plus, si vous explorez le code source, dans le dossier « examples », vous trouverez des programmes Python qui vous permettront de tester très vite PyGattlib. Exercice 10. Dans cet exercice, vous compléterez le programme my_hr_c.py afin qu’il envoie une requête vers le capteur Heart Rate. Votre script recevra donc 2 arguments. Le premier argument sera l’adresse Bluetooth du capteur, et le 2ème argument, le type de requête en envoyer. Les types de requête à prévoir sont « getconf », « notify » et « disnot » pour obtenir la configuration du capteur (i.e. notification activée ou pas), pour activer et recevoir les notifications et, pour désactiver les notifications respectivement. Voici un exemple d’utilisation de votre programme « $ python my_hr_c.py 01:02:03:04:05:06 getconf ». Lorsque vous activez (et que vous lisez donc) les notifications, votre script python doit uniquement montrer sur écran le rythme cardiaque mesuré, en décimale. Pour cela, notez bien que les données reçus par le client suit le format suivant : 1octet indiquant le code de l’opération (opcode = 1B pour une notification d’une mesure effectué) + 2 octets, indiquant le numéro d’attribut sur lequel la notification est effectué (écrit en format little endian) + les octets relatifs à la mesure. Afin de compléter « facilement » le script my_hr_c.py, lisez et comprenez bien les scripts read_async.py, write.py et receive_notification.py, disponibles dans le code source de PyGattlib. 3. Manipulation du client avec les interfaces DBus Pour une implémentation propre d’un client BLE, vous devez cependant utiliser les interfaces DBus. Si par exemple, vous souhaitez implémenter un client Heart Rate, vous pouvez vous inspirer des scripts test-­‐discovery, test-­‐device et test-­‐heartrate, disponibles dans /usr/share/doc/bluez-­‐tests/examples. Exercice 11. Cet exercice est plus simple que le précédent, car vous devez uniquement montrer le bon fonctionnement des scripts test-­‐discovery, test-­‐device et test-­‐heartrate. La seule complexité de cet exercice consiste donc à lire les scripts et les comprendre, afin de pouvoir les utiliser. Notez cependant que ces scripts doivent être exécutés dans l’ordre donné ci-­‐dessus. 4. Votre BLE en « Peripheral mode » Jusqu’à présent, vous avez utilisez votre interface BLE en mode client, pour retrouver des information sur un serveur (ici, le capteur de rythme cardiaque). Cependant, si vous souhaitez créer un serveur (mode peripheral ou advertiser) grâce à votre dispositif BLE, vous pouvez le faire en utilisant les modules expérimental Bluez. Exercice 12. Pour cela, lancez le daemon bluetoothd avec l’option « -­‐E », en utilisez la même procédure que vous avez utilisez pour activer le mode « compatibilité » pour lancer vos scripts Python du TP Bluetooth Classique. Une fois cela fait, activez les interfaces BLE avec la commande hciconfig. De plus, puisque par défaut la phase « Advertisement » n’est pas activé pour les interfaces BLE, activez-­‐le (ou désactivez-­‐le selon le besoin) avec la commande « hciconfig hciX leadv 0 » (hciconfig hciX noleadv). Ensuite, lancez le program example-­‐gatt-­‐server. Utilisez gatttool ou un autre client GATT pour explorer les services émulés par le script example-­‐gatt-­‐server. Si vous avez un smartphone Android avec une interface BLE, vous pouvez installer l’application BLE Scanner (disponible dans la Play Store) pour vous connecter à votre serveur BLE sur Linux. Activez la notification du capteur de rythme cardiaque émulé. Exercice 13. Expliquez brièvement ce que vous devez modifier/ajouter dans le script example-­‐gatt-­‐server pour ajouter un service quelconque (e.g. le service capteur de température). 
Téléchargement