Lors du dernier volet de cette série explorant l’Internet des Objets, j’avais réussi à commander une lampe via un smartphone. Il m’avait pour cela fallu écrire une petite appli Android envoyant par TCP/IP les commandes à un client MQTT installé sur un PC de mon réseau domestique. Ce PC relayait ensuite les messages TCP/IP à un autre PC sur lequel était installé le même client MQTT. Au port COM de ce second PC était bien sûr connecté le montage électronique à commander (cf. épisode 6).
 
L’usage d’un PC relais ne rendait pas mon système de commande aussi « mobile » que je l’aurais souhaité. Pour se passer du PC relais, les messages MQTT doivent être transmis directement du smartphone à l’organe de commande (cf. illustration), autrement dit il nous faut utiliser un client MQTT pour Android. La page du projet Paho évoqué dans l’épisode 4 offre deux implantations de MQTT pour Android. La première fournit les fonctions de base MQTT. La seconde, appelée Android Service, traite en tâche de fond l’envoi et la réception de messages MQTT pour le compte d’une application dont l’activité (Activity) est en pause. Le paquet Java contient un exemple d’application.
 
Les développeurs du projet Paho ont hélas utilisé Eclipse (avec le SDK Android) pour écrire la bibliothèque Android et l’application d’exemple, alors qu’Eclipse a été délaissé par Google au profit de son environnement de développement Android Studio. Cela aurait été sans conséquence si la structure du répertoire dans lequel sont stockés les fichiers d’un projet Android était restée identique entre Eclipse et Android Studio, mais ce n’est pas le cas.
 
Je sais ce que vous allez me dire : qu’Android Studio possède une fonction d’importation pour les projets et bibliothèques Android écrits sous Eclipse. J’y ai pensé, mais l’importation a piteusement échoué ; je n’ai obtenu que des messages d’erreur assez énigmatiques, apparemment dus à l’impossibilité pour Android Studio de trouver les dossiers et fichiers au bon endroit.
 
J’ai laissé tomber Android Service et me suis tourné vers la bibliothèque Java offrant les fonctions de base MQTT. J’ai suivi les indications de la page correspondante du site Paho et créé une application Android appelant cette interface, mais là encore j’ai essuyé une bordée de messages d’erreur, cette fois-ci en raison de fichiers de journalisation introuvables. Finalement, en ajoutant des caractères de commentaire au Logger dans tous les fichiers de la bibliothèque, je suis parvenu à faire fonctionner un petit client MQTT qui envoie des messages. Entre-temps, je suis tombé sur une page expliquant comment utiliser l’interface Android Service avec l’environnement Android Studio, mais je n’ai encore pas trouvé le temps de tester tout ça.
 
J’ai repris pour mon client MQTT Android le gabarit (layout) créé pour l’appli utilisée lors du dernier volet, mais on peut maintenant sélectionner un Topic à la place de l’adresse IP. J’ai en outre utilisé les mêmes noms de variables que ceux utilisés pour l’implantation PC. Voici le code qui est appelé lorsqu’on tape sur le bouton Publish du téléphone :

String Topic = "/ElektorMyJourneyIoT/" + txtTopicPublish.getText() + "/test";
String strTextPublish = txtPublish.getText().toString();
int qos             = 2;
String broker       = "tcp://test.mosquitto.org:1883";

MqttClient mqttclient = new MqttClient(broker, clientId, null);

MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);

mqttclient.connect(connOpts);

MqttMessage message = new MqttMessage(strTextPublish.getBytes());
message.setQos(qos);
mqttclient.publish(Topic, message);

mqttclient.disconnect();


Grâce à la bibliothèque Paho, il suffit de quelques lignes pour transmettre les messages MQTT. Vous pouvez télécharger le code complet ci-dessous. L’archive contient également le client MQTT à installer sur le PC chargé de relayer les messages au dispositif électronique à commander.
 
Finalement, avec la séquence d’instructions que vous connaissez déjà, R 0 1 + [PUBLISH] R 0 1 – [PUBLISH], j’ai pu commander la lampe de mon bureau.
 
Dans les prochains épisodes, je vous montrerai comment optimiser cette « télécommande », ce qu’il en est de la communication dans l’autre sens, et je testerai également quelques solutions commerciales.