Retour au blog

Pour celles et ceux qui ne le sauraient pas, j’ai développé une application Android permettant de contrôler les lumières Philips Hue et Nanoleaf Aurora. Si tu possèdes un tel matériel à la maison, alors tu peux jeter un oeil au projet sur la page hueandme.ch.

Ce programme est développé en WinDev Mobile, et utilise pour certaines fonctions avancées un peu de code Java.

Désireux d’augmenter la compatibilité avec d’autre matériel, je me suis attaqué aux lumières connectées Ikea Trådfri. Le problème est que ces dernières n’utilisent pas le protocole JSON RESTful comme toutes les autres, mais un obscur concurrent appelé CoAP (Constrained Application Protocol), léger et rapide mais complètement bordélique à implémenter.

Léger parce que tout est encodé bit par bit, l’entête par exemple ne fait que quatre octets. Rapide car en plus d’être léger il utilise le protocole UDP. Et bordélique pour ces deux raisons.

Si tu as le courage (ou la folie) nécessaire tu peux aller lire la RFC 7252 via le site coap.technology.

Bref, aujourd’hui je vais donc te montrer comment utiliser le protocole CoAP depuis WinDev Mobile, après des heures d’arrachage de cheveux à comprendre comment faire. Si tu as un souci avec le sujet présenté ici alors pose ta question dans les commentaires de cet article, il est inutile d’aller te prendre un vent sur les forums d’aide de PC-Soft.

Introduction

Contrôler des périphériques CoAP nécessite d’abord de les découvrir sur le réseau, une opération longue que l’on effectue normalement qu’une seule fois. On mémorise ensuite les informations des périphériques trouvés (adresse IP, port, numéro de série) pour une utilisation ultérieure.

Une fois ces informations connues, on peut alors envoyer des requêtes CoAP, dans notre cas vers la passerelle Trådfri. En effet, ce tutoriel vise précisemment les lumières Ikea Trådfri, mais avec une adaptation il doit être possible de contrôler n’importe quel périphérique CoAP.

Prérequis

Pour la recherche des périphériques CoAP, les librairies natives Android suffisent pour balancer un broadcast auquel les appareils répondront.

En revanche pour envoyer des requêtes CoAP nous allons utiliser les librairies Californium, disponibles sur GitHub. Le projet est à la base une création de l’École polytechnique fédérale de Zurich, il est maintenant intégré à Eclipse.

github.com/eclipse/californium

De cette page tu vas sur « Maven Central » , afin de récupérer les librairies JAR prêtes à l’emploi. Nous aurons besoin des trois fichiers suivants:

californium-core-2.0.0-M4.jar
element-connector-2.0.0-M4.jar
scandium-2.0.0-M4.jar

Les deux premiers pour les requêtes CoAP, le dernier pour le chiffrement DTLS nécessaire afin d’accéder à la passerelle Trådfri, qui requiert ce niveau de sécurité. La dernière version à l’heure d’écriture de cet article est la 2.0.0-M4, mais prends-en une plus récente si tu lis cet article plus tard.

Le DTLS (Datagram Transport Layer Security) est basé sur le TLS, mais est utilisé avec les protocoles en mode datagramme, dans notre cas l’UDP. Les garanties de sécurité sont similaires.

Note au passage que l’application Ikea Trådfri officielle utilise ces librairies, ce n’est donc pas un bout de code sauvage trouvé au fin fond d’Internet.

Le problème est que la compilation d’un projet WinDev Mobile pour Android avec ces librairies telles quelles va planter Gradle, il va donc falloir ouvrir ces trois fichiers un par un avec un éditeur d’archives afin de corriger quelques informations conflictuelles, je te conseille pour ce faire l’outil 7-Zip.

Dans chacun des trois fichiers JAR, tu vas en effet devoir aller supprimer le répertoire « maven » (situé dans « META-INF » ), ainsi que tous les fichiers HTML à la racine. Je te laisse imaginer le temps que ça a pris pour trouver cette astuce.

Quand tu compiles ton projet WinDev pour Android, sur un des derniers onglets tu vas inclure ces trois fichiers JAR que tu viens de modifier.

L’ordre n’a pas d’importance.

Découverte de périphériques

La découverte de périphériques CoAP ne peut pas s’effectuer comme tout le monde avec un SSDP M-SEARCH, ce serait trop simple (enfin… on se comprend). Heureusement il existe une librairie native Android qui s’occupe de ça, en l’occurrence le « NsdManager » .

Le NsdManager peut être utilisé pour chercher à peu près n’importe quel type de périphérique, mais nous allons plus tard limiter la recherche aux périphériques CoAP.

Nous allons donc créer une méthode Java qui va aller chercher les périphériques sur le réseau, et envoyer les résultats à une méthode WinDev au fur et à mesure de l’avancement.

On note une boucle assez laide de quelques secondes à la fin, ceci afin de laisser le temps aux périphériques de répondre au broadcast, si tu as une meilleure idée je suis preneur.

La méthode WinDev appelée en callback filtre les numéros de séries qui commencent par « gw: » , signe qu’il s’agit d’une passerelle Trådfri (« gw » est l’abréviation de « gateway » ).

Une fois que tout ceci est en place, il suffit d’invoquer la méthode Java de recherche, en lui envoyant le filtre CoAP en paramètre.

La procédure WinDev « discoveryCallback » s’occupera de récolter les données des périphériques CoAP, à toi de les enregistrer quelque part.

Pour la suite, nous allons donc considérer que tu as en ta possession l’adresse IP et le port de la passerelle Trådfri. Par standard, les périphériques CoAP répondent sur le port 5683, ou 5684 dans le cas d’une connexion sécurisée avec DTLS, ce qui est le cas de la passerelle Trådfri.

Requêtes CoAP

Pour que les requêtes CoAP soient acceptées par la passerelle Trådfri, il faut connaitre la clé pré-partagée de sécurité, appelée « PSK » pour Pre-shared key. Cette clé est imprimée sous le boitier Trådfri et servira à chiffrer les données avec DTLS.

Le code QR situé au dos du boitier Trådfri contient le numéro de série, une virgule, puis cette clé de sécurité. Dans ton application tu peux donc proposer de scanner ce code QR avec « CBCapture » , et récupérer ensuite la clé après la virgule avec « ExtraitChaine » .

Les requêtes CoAP vont utiliser les librairies Californium, nous allons avec leur aide créer une méthode Java qui recevra quatre paramètres.

La clé de sécurité (PSK)
La méthode (une chaine qui vaut « GET » , « PUT » , « POST » ou « DELETE » )
Le chemin URI complet (avec le protocole « coap:// » , l’IP, le port, et le endpoint)
Un payload optionnel

Nous appellerons cette méthode « CoapRequest » .

La méthode JAVA renvoie une chaine contenant le code de réponse, les options, et le payload retourné. Ces trois valeurs sont séparées par des retours à la ligne, il suffit de les extraire avec « ExtraitChaine » , en spécifiant CRLF comme séparateur.

Avec Trådfri, le payload renvoyé est toujours en JSON, sauf pour une requête de découverte (DISCOVER). Tu peux donc le convertir en Variant avec la fonction « JSONVersVariant » puis l’attaquer comme un objet.

Voici quelques exemples d’appels depuis WinDev.

Tu constateras que le protocole CoAP utilise des codes illisibles définis par l’IPSO-Alliance (« 5850 » pour l’état, « 5851 » pour le tamisage), une recherche sur Google t’aidera à ce sujet.

Conclusion

Le choix du protocole CoAP est certes clairement plus rapide, mais il complique nettement la tâche aux développeurs par rapport à du HTTP dont les entêtes sont lisibles, car envoyés bruts par paquets d’octets explicites, et non par bits à décortiquer comme avec CoAP.

CoAP est utile pour les périphériques avec peu de ressources, mais je doute que ce soit le cas de la passerelle Trådfri. M’enfin bon.

Note que l’observation n’est pas prise en charge dans cet exemple, le « OBSERVE » permet d’indiquer à un périphérique CoAP qu’il doit envoyer périodiquement et de lui-même des informations au demandeur.

Dernier point, et pas des moindres, si tu utilises Californium alors ton projet devra afficher la licence Eclipse dans la page « à propos » , la licence est disponible au format HTML sur la page GitHub citée plus haut.

Tout ce que tu viens de lire a nécessité des dizaines d’heures de recherches avant de fonctionner, laisse donc un message si ça t’a aidé. Tout commentaire hors sujet (comme par exemple une critique du choix de l’outil de développement, au hasard) sera envoyé dans les limbes.


, , ,     lundi 10 juillet 2017

  3 commentaires

  1. Et pour iOS? 🙂
  2. C’est faisable, mais pour tout ce qui concerne Apple il me faut ton numéro de carte de crédit, le code, une copie de ton passeport, ton téléphone, et un échantillon de sang pour avoir ton ADN. 😛
  3. Ouf moi qui croyais qu’il fallait aussi ma généalogie jusqu’à Guillaume Tell 😀

  Tu peux même laisser ton avis

Prends juste note que tout commentaire désobligeant, illégal, publicitaire, agressif, mal écrit ou tout simplement ennuyeux sera cruellement supprimé sans préavis, sans explication et sans excuse par le dictateur autoproclamé actuellement au pouvoir.

  Sur le même thème