Protocole MQTT et projet client ouvert MQTT sur Delphi


Le protocole MQTT est utilisé pour la messagerie sur Internet des objets. Tout d'abord, il est intéressant car il est pris en charge par les plus grands fournisseurs de services cloud, tels qu'IBM, Microsoft, Amazon.
Vous pouvez obtenir gratuitement un compte dans ces services, y configurer un service pour recevoir des messages MQTT et surveiller la vie de vos appareils via ces services, par exemple, dans une maison intelligente. De plus, grâce à ces services, les appareils peuvent communiquer entre eux.

Une démonstration de la connexion client au service MQTT du cloud IBM Bluemix est incluse.



Brève description.


MQTT est extrêmement primitif: avec un en-tête court, sans contrôle d'intégrité, il n'impose aucune restriction sur la structure, le codage ou le schéma de données. La seule exigence de données dans chaque paquet est qu'elles doivent être accompagnées d'un identifiant pour le canal d'information. Cet identificateur dans la spécification est appelé nom de rubrique ou une rubrique plus simple. Les données sont transmises aux paquets via TCP. La quantité de données dans un paquet peut aller d'un octet à 268 435 455 octets. Très flexible! Bien que les services de cloud public imposent des restrictions plus strictes, jusqu'à plusieurs kilo-octets.
Le protocole MQTT nécessite un courtier de données. Telle est l'idée centrale de la technologie. Tous les appareils envoient des données uniquement au courtier et ne reçoivent également des données que de lui. Un courtier est un programme qui agit comme un serveur TCP avec une base de données dynamique.

La base de données du courtier contient en particulier une table avec tous les packages reçus avec une indexation par thèmes de ces packages. Dès réception du package, le courtier l'envoie à tous les appareils du réseau en fonction de leur abonnement. Pour que l'appareil reçoive quelque chose du courtier, il doit s'abonner au sujet. Les sujets surgissent dynamiquement lors de l'abonnement ou à l'arrivée d'un package avec ce sujet. Vous pouvez également vous désinscrire du sujet. Ainsi, les sujets sont un mécanisme pratique pour organiser des relations de différents types: un à plusieurs, plusieurs à un et plusieurs à plusieurs. Si le package n'a pas d'abonné, il est supprimé. Si l'abonné n'est pas connecté, le package est soit immédiatement supprimé dans la base de données du courtier, soit il attend que l'abonné se connecte pendant un certain temps spécifié dans la configuration. Le comportement est déterminé par l'attribut QoS du paquet.

Quoi d'autre est important ici.


• Les appareils sont les premiers à établir un contact avec un courtier. C'est-à-dire les périphériques peuvent être situés derrière les traducteurs d'adresses réseau (NAT) et peuvent ne pas avoir d'adresses IP statiques, ce qui n'interfère pas avec la communication.
• SSL peut être utilisé pour crypter le trafic. Mais vous pouvez travailler sans SSL même avec les services IBM, ce qui facilite le débogage.
• Dans les cas extrêmement difficiles, les courtiers MQTT vous permettent de vous y connecter via le protocole WebSocket sur le port 80.
• Le port du protocole MQTT standard peut également être modifié arbitrairement.
• Le client / les clients avec une interface utilisateur graphique et le courtier peuvent être situés sur le même ordinateur. C'est-à-dire la solution peut être absolument locale et évoluer à l'échelle mondiale en un seul clic.
• Différents courtiers peuvent se connecter les uns aux autres en s'abonnant aux messages les uns des autres.
• Le concept de sujets correspond bien à la technologie de base de données NoSQL. Dans le même but, les services cloud encouragent les utilisateurs à utiliser le codage de données JSON.

Projets ouverts


Le choix des courtiers MQTT est assez large. Mais curieusement, il n'y a pratiquement pas de clients pratiques avec une interface utilisateur Windows sous Windows. Et un tel client pour maîtriser le protocole MQTT est tout simplement nécessaire car il existe de nombreuses nuances pratiques du travail des courtiers au-delà des spécifications et toutes doivent être étudiées et testées d'une manière ou d'une autre.
Il a été décidé d'implémenter le client MQTT sur Delphi.
Google pour Delphi ne peut proposer que le composant TMQTTClient. Mais c'est un composant ancien et qui ne fonctionne pas. La plupart des autres clients écrits en Java, Erlang, Haskell, Javscript en Delphi sont très difficiles à intégrer.
Trouvé le seul projet approprié - Mosquitto
Écrit en pur C-i. Il compile pour différents systèmes d'exploitation. Il a des scripts de génération de projet pour Visual Studio. À la sortie sous Windows, nous obtenons des fichiers dll avec l'implémentation des fonctionnalités client et courtier. L'utilisation de C est encourageante en termes de vitesse. Et les bibliothèques dynamiques écrites en C se connectent facilement aux programmes Delphi.
Delphi lui-même, représenté par Embarcadero RAD Studio XE8, est un outil très puissant pour créer des interfaces utilisateur flexibles et pratiques pour Windows, surtout s'il est équipé de DevExpress, TeeChart, RxLib, FireDAC, etc.

Outils nécessaires


Nous aurons besoin de l'environnement de développement MS Visual Studio 2015 . Il compilera le projet Mosquitto et tous les projets d'appui dont Mosquitto dépend . Sinon, Mosquitto pour Windows peut être compilé à l'aide du package Cygwin , mais Visual Studio semblait plus pratique.
Pour générer des fichiers de projet Visual Studio, vous devez télécharger et installer l'utilitaire Cmake . Source cmake.org
Et bien sûr, vous avez besoin de RAD Studio XE8 . De plus, dans RAD Studio, la version du package de composants DevExpress VCL non inférieure à 14.2.2 doit être installée. Bien que cela ne soit pas d'une importance fondamentale, la conception de l'interface utilisateur peut être facilement refaite pour les composants RAD Studio standard.

Procédure d'installation du logiciel


Mosquitto dépend de plusieurs projets tiers, à savoir:
OpenSSL v 1.0.2e . Source - http://slproweb.com/download/Win32OpenSSL-1_0_2e.exe
Pthreads v 2.9.1 . Source - ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip
Libwebsockets v 1.4 . Source - https://github.com/warmcat/libwebsockets

Téléchargez ces projets.
Nous ne compilons pas OpenSSL , mais prenons immédiatement les deux fichiers nécessaires à partir de là: libeay32.dll et ssleay32.dll du répertoire bin . Il arrive souvent qu'ils soient déjà installés sur l'ordinateur à partir d'autres projets. Cela doit être vérifié.
Pthreadspas non plus compiler et prendre le fichier déjà compilé pthreadVC2.dll à partir du répertoire dll \ x86 .
Libwebsockets est livré sans fichiers précompilés et sans projet pour Visual Studio, mais il a un fichier de configuration CMakeLists.txt . Dans ce cas, à l'aide de l'utilitaire Cmake , nous générons le fichier de projet Visual Studio dans un répertoire séparé (répertoire libwebsockets_VS_proj). Et puis en ouvrant le fichier de projet généré dans Visual Studio, nous compilons. Nous obtenons le fichier websockets.dll dont nous avons besoin .
Après toutes les étapes précédentes, vous pouvez compiler le projet Mosquitto. Ici, vous devez également d'abord générer le fichier de projet Visual Studio (répertoire Mosquitto_VS_proj) à partir du fichier de configuration CMakeLists.txt attaché . Le projet généré ne fonctionne pas tout à fait, vous devrez modifier les chemins d'accès à certains fichiers d'en-tête et bibliothèques externes, inclure des macros dans le projet et modifier légèrement les textes source. Par conséquent, nous obtenons le fichier mosquitto.dll .
Par souci de simplicité, tous les fichiers et la structure de répertoires avec les projets mentionnés sont contenus dans le fichier archive joint à l'article.
Avec la bibliothèque cliente, la compilation du projet Mosquitto nous donne le fichier exécutable du courtier MQTT - mosquitto.exe .
Ainsi, nous obtenons immédiatement à la fois le client et le courtier MQTT, c'est-à-dire presque tout ce dont vous avez besoin pour organiser un Internet des objets efficace.

Création d'un projet client MQTT dans Delphi



Pour intégrer la bibliothèque mosquitto.dll dans Delphi, vous devez créer un module de déclarations de fonctions de bibliothèque sur Object Pascal . Pour ce faire, la conversion du fichier a été effectué mosquitto.h fichier MOSQUITTO.PAS .
Le projet client est très simple, ne comprend que 4 fichiers sources. Le client démontre la connexion et la déconnexion, la formation d'un testament ( testament ), l'envoi de données avec le package PUBLISH au courtier, la réception de données avec le package PUBLISH du courtier, l'inscription et la désinscription.
Le programme enregistre tous les attributs de connexion, désignés par le terme profil dans la table des profils stockée sur le disque. Les journaux des paquets PUBLISH reçus et envoyés sont également enregistrés sur le disque séparément .

Méthode d'utilisation par le client



Exécutez le fichier TMQTTC.exe .
Afin d'avoir quelqu'un pour communiquer l'équipe de courtier en essai Run_mosquitto.cmd dans le répertoire Mosquitto_1_4_5_bin . Pour plus de commodité, le courtier est configuré pour se connecter sans SSL ni vérification de mot de passe.
Remplissez les champs comme dans la capture d'écran.



Le mot de passe et le nom d'utilisateur sont facultatifs. Dans le navigateur, cliquez sur le bouton de validation pour enregistrer les données dans le tableau. Cliquez ensuite sur le bouton Connecter .
Après la connexion, les commandes de publication et d'abonnement deviennent disponibles. Les commandes PING client mosquitto génère automatiquement.
Pour que le client obtienne quelque chose, vous devez à nouveau exécuter le programme TMQTTC.exe avec un identifiant client différent et abonner un client pour recevoir des données d'un autre.

Connectez-vous à IBM Bluemix



La première chose à faire est d'obtenir un compte dans Bluemix
Après avoir reçu un compte, nous allons sur notre panneau de contrôle sur Bluemix . Ici, vous devez immédiatement passer à la région sud des États-Unis . Pour ce faire, cliquez sur l'icône de compte dans le coin supérieur droit et modifiez la valeur dans le champ Région . Il y a trois régions au total, mais le sud des États-Unis vous donne la possibilité de découvrir la plupart des services. Ensuite, créez de l' espace . L'écran devrait ressembler à un crinshot ci-dessous. Ici, l'organisation INDEMSYS et Space INDEMSYS SPACE sont créées .


Maintenant, cliquez sur CATALOGUE dans le menu supérieur. Nous descendons vers le bas et choisissonsFondation Internet des objets .


Nous ne modifions pas les champs proposés par défaut et cliquons sur Créer la


Fondation Internet des Objets - il s'agit d'un service qui inclut le courtier MQTT et l'interface utilisateur.
Après avoir créé dans la fenêtre qui apparaît, cliquez sur le bouton intitulé Lancer le tableau de bord .



Il s'agit d'un panneau de contrôle IoT. Maintenant, nous devons créer des appareils. Cliquez sur Ajouter un appareil . Dans les boîtes de dialogue qui s'affichent, créez un type d'appareil ( Créer un type d'appareil ). Donnez-lui le nom Type1, ne remplissez pas les champs restants pour plus de simplicité. Cliquez sur Suivant -> Suivant -> Créer -> Suivant. Donnez le nom au périphérique Device1. Suivant Suivant -> Suivant -> Suivant -> Ajouter. En conséquence, nous obtenons la fenêtre suivante:


Voilà, nous avons ici tous les détails pour connecter notre premier appareil au courtier MQTT Bluemix .
Nous testerons si notre client peut s'y connecter. Entrez les détails dans la fenêtre client.


Comme vous pouvez le voir, le client s'est connecté avec succès à Bluemix . Ici, vous devez faire attention au nom d'hôte. Cela commence par l' ID d'organisation obtenu lors de la création de la Fondation Internet des objets . Le champ ID utilisateur est également composite et est codé comme suit: d : < ID organisation >: < Type de périphérique >: < ID périphérique >. Le champ Nom d'utilisateur contient une chaîne fixeuse-token-auth .
Les sujets de message pour le courtier Bluemix , contrairement au courtier Mosquitto, ne peuvent pas contenir de données arbitraires. Ils sont codés selon certaines règles. Ces règles doivent être étudiées dans la documentation de la Fondation Internet des Objets . La capture d'écran montre l'un des sujets valides possibles.

Référentiel de projets: https://github.com/Indemsys/Delphi_MQTT_mosquitto

Source: https://habr.com/ru/post/fr388231/


All Articles