Protocolo MQTT y proyecto de cliente abierto MQTT en Delphi
El protocolo MQTT se usa para mensajes en Internet de las cosas. En primer lugar, es interesante porque es compatible con los mayores proveedores de servicios en la nube, como IBM, Microsoft, Amazon.Puede obtener una cuenta en estos servicios de forma gratuita, configurar un servicio para recibir mensajes MQTT allí y ver la vida de sus dispositivos a través de estos servicios, por ejemplo, en un hogar inteligente. Además, a través de estos servicios, los dispositivos pueden comunicarse entre sí.Se incluye una demostración de la conexión del cliente al servicio MQTT de la nube IBM Bluemix.Breve descripción
MQTT es extremadamente primitivo: con un encabezado corto, sin control de integridad, no impone ninguna restricción en la estructura, codificación o esquema de datos. El único requisito de datos en cada paquete es que deben ir acompañados de un identificador para el canal de información. Este identificador en la especificación se llama Nombre del tema o un tema más simple. Los datos se transmiten a los paquetes a través de TCP. La cantidad de datos en un paquete puede ser de un byte a 268,435,455 bytes. Muy flexible! Aunque los servicios de nube pública imponen restricciones más estrictas, hasta varios kilobytes.El protocolo MQTT requiere un intermediario de datos. Esta es la idea central de la tecnología. Todos los dispositivos envían datos solo al agente y también reciben datos de él. Un corredor es un programa que actúa como un servidor TCP con una base de datos dinámica.La base de datos del agente en particular contiene una tabla con todos los paquetes recibidos con indexación por temas de estos paquetes. Al recibir el paquete, el agente lo envía a todos los dispositivos en la red de acuerdo con su suscripción. Para que el dispositivo reciba algo del intermediario, debe suscribirse al tema. Los temas surgen dinámicamente con la suscripción o con la llegada de un paquete con este tema. También puede darse de baja del tema. Por lo tanto, los temas son un mecanismo conveniente para organizar relaciones de diferentes tipos: uno a muchos, muchos a uno y muchos a muchos. Si el paquete no tiene un suscriptor, se descarta. Si el suscriptor no está conectado, el paquete se elimina inmediatamente en la base de datos del intermediario o espera a que el suscriptor se conecte durante un tiempo especificado en la configuración. El comportamiento está determinado por el atributo QoS del paquete.¿Qué más es importante aquí?
• Los dispositivos son los primeros en establecer contacto con un corredor. Es decir los dispositivos pueden estar ubicados detrás de traductores de direcciones de red (NAT) y pueden no tener direcciones IP estáticas y esto no interferirá con la comunicación.• SSL se puede usar para cifrar el tráfico. Pero puede trabajar sin SSL incluso con los servicios de IBM, lo que facilita la depuración.• En casos extremadamente difíciles, los corredores MQTT le permiten conectarse a ellos a través del protocolo WebSocket en el puerto 80.• El puerto del protocolo MQTT estándar también se puede cambiar arbitrariamente.• Tanto el cliente / clientes con una interfaz gráfica de usuario como el agente pueden ubicarse en la misma computadora. Es decir La solución puede ser absolutamente local y escalarse a global con un solo clic.• Los diferentes corredores pueden conectarse entre sí suscribiéndose a mensajes entre ellos.• El concepto de temas encaja bien con la tecnología de base de datos NoSQL. Con el mismo propósito, los servicios en la nube alientan a los usuarios a usar la codificación de datos JSON.Proyectos abiertos
La elección de los corredores MQTT es bastante grande. Pero, curiosamente, prácticamente no hay clientes convenientes con una interfaz de usuario de Windows en Windows. Y tal cliente para dominar el protocolo MQTT es simplemente necesario porque hay muchos matices prácticos del trabajo de los corredores más allá del alcance de las especificaciones, y todos ellos deben estudiarse y probarse de alguna manera.Se decidió implementar el cliente MQTT en Delphi.Google for Delphi solo puede ofrecer el componente TMQTTClient. Pero este es un componente antiguo y que no funciona. La mayoría de los otros clientes escritos en Java, Erlang, Haskell, Javscript en Delphi son muy difíciles de integrar.Encontramos el único proyecto adecuado - MosquittoEscrito en puro C-i. Se compila para diferentes sistemas operativos. Tiene scripts de generación de proyectos para Visual Studio. A la salida de Windows obtenemos archivos dll con la implementación de la funcionalidad de cliente y agente. El uso de C es alentador en términos de velocidad. Y las bibliotecas dinámicas escritas en C se conectan fácilmente a los programas de Delphi.Delphi, representado por Embarcadero RAD Studio XE8, es una herramienta muy poderosa para crear interfaces de usuario flexibles y convenientes para Windows, especialmente si está equipado con DevExpress, TeeChart, RxLib, FireDAC, etc.Herramientas necesarias
Necesitaremos el entorno de desarrollo MS Visual Studio 2015 . Compilará el proyecto Mosquitto y todos los proyectos de apoyo de los que depende Mosquitto . Alternativamente, Mosquitto para Windows se puede compilar usando el paquete Cygwin , pero Visual Studio parecía más conveniente.Para generar archivos de proyecto de Visual Studio, debe descargar e instalar la utilidad Cmake . Fuente cmake.orgY, por supuesto, necesita RAD Studio XE8 . Además, en RAD Studio, se debe instalar la versión del paquete de componentes DevExpress VCL no inferior a 14.2.2. Aunque esto no es de importancia fundamental, el diseño de la interfaz de usuario se puede rehacer fácilmente para los componentes estándar de RAD Studio.Procedimiento de instalación de software
Mosquitto depende de varios proyectos de terceros, estos son:• OpenSSL v 1.0.2e . Fuente: http://slproweb.com/download/Win32OpenSSL-1_0_2e.exe• Pthreads v 2.9.1 . Fuente: ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip• Libwebsockets v 1.4 . Fuente: https://github.com/warmcat/libwebsocketsDescargue estos proyectos.No compilamos OpenSSL , pero tomamos inmediatamente los dos archivos necesarios desde allí: libeay32.dll y ssleay32.dll del directorio bin . A menudo sucede que ya están instalados en la computadora desde otros proyectos. Esto debe ser verificado.Pthreadstampoco compilamos , pero tomamos el archivo pthreadVC2.dll ya compilado del directorio dll \ x86 .Libwebsockets viene sin archivos precompilados y sin un proyecto para Visual Studio, pero tiene un archivo de configuración CMakeLists.txt . En este caso, utilizando la utilidad Cmake , generamos el archivo de proyecto de Visual Studio en un directorio separado (directorio libwebsockets_VS_proj). Y luego abriendo el archivo de proyecto generado en Visual Studio compilamos. Obtenemos el archivo websockets.dll que necesitamos .Después de todos los pasos anteriores, puede compilar el proyecto Mosquitto. Aquí, primero debe generar el archivo de proyecto de Visual Studio (directorio Mosquitto_VS_proj) desde el archivo de configuración CMakeLists.txt adjunto . El proyecto generado no funciona del todo, tendrá que cambiar las rutas a algunos archivos de encabezado y bibliotecas externas, incluir algunas macros en el proyecto y modificar ligeramente los textos fuente. Como resultado, obtenemos el archivo mosquitto.dll .Para simplificar, todos los archivos y la estructura de directorios con los proyectos mencionados están contenidos en el archivo adjunto al artículo.Junto con la biblioteca del cliente, la compilación del proyecto Mosquitto nos proporciona el archivo ejecutable del agente MQTT: mosquitto.exe .Por lo tanto, obtenemos de inmediato tanto el cliente como el agente MQTT, es decir, casi todo lo que necesita para organizar un Internet efectivo de las cosas.Crear un proyecto de cliente MQTT en Delphi
Para integrar la biblioteca mosquitto.dll en Delphi, debe crear un módulo de declaraciones de funciones de biblioteca en Object Pascal . Para ello, la conversión de archivos se ha realizado mosquitto.h archivo MOSQUITTO.PAS .El proyecto del cliente es muy simple, consta de solo 4 archivos de origen. El cliente demuestra la conexión y desconexión, formando un testamento ( Will ), enviando datos con el paquete PUBLISH al intermediario, recibiendo datos con el paquete PUBLISH del intermediario, suscribiéndose y cancelando la suscripción.El programa guarda todos los atributos de conexión, referidos por el término perfil en la tabla de perfil almacenada en el disco. Los registros de los paquetes PUBLISH recibidos y enviados también se guardan en el disco por separado .Método de uso del cliente
Ejecute el archivo TMQTTC.exe .Con el fin de tener a alguien para comunicar el equipo corredor de prueba de funcionamiento Run_mosquitto.cmd en el directorio Mosquitto_1_4_5_bin . Por conveniencia, el corredor está configurado para conectarse sin SSL y verificación de contraseña.Complete los campos como en la captura de pantalla.
La contraseña y el nombre de usuario son opcionales. En el navegador, haga clic en el botón de confirmación para guardar los datos en la tabla. Luego haga clic en el botón Conectar .Después de la conexión, los comandos de publicación y suscripción estarán disponibles. Los comandos PING cliente mosquitto genera de forma automática.Para que el cliente obtenga algo, debe volver a ejecutar el programa TMQTTC.exe con un identificador de cliente diferente y suscribir un cliente para recibir datos de otro.Conéctese a IBM Bluemix
Lo primero que debe hacer es obtener una cuenta en BluemixDespués de recibir una cuenta, vamos a nuestro panel de control en Bluemix . Aquí debe cambiar inmediatamente a la región sur de los EE . UU . Para hacer esto, haga clic en el icono de la cuenta en la esquina superior derecha y cambie el valor en el campo Región . Hay tres regiones en total, pero US South le brinda la oportunidad de experimentar la mayoría de los servicios. Luego, crea el espacio . La pantalla debería verse como un disparo de abajo. Aquí, se crean la organización INDEMSYS y Space INDEMSYS SPACE .
Ahora haga clic en CATÁLOGO en el menú superior. Bajamos al fondo y elegimosFundación Internet de las Cosas .
No cambiamos los campos propuestos de forma predeterminada y hacemos clic en Crear
Internet of Things Foundation ; este es un servicio que incluye el agente MQTT y la interfaz de usuario.Después de crear en la ventana que aparece, haga clic en el botón Lanzar panel de control .
Este es un panel de control de IoT. Ahora necesitamos crear dispositivos. Haz clic en Agregar dispositivo . En los cuadros de diálogo que aparecen, cree un tipo de dispositivo ( Crear tipo de dispositivo ). Déle el nombre Tipo1, no complete los campos restantes por simplicidad. Haga clic en Siguiente -> Siguiente -> Crear -> Siguiente. Dé el nombre al dispositivo Dispositivo1. Siguiente Siguiente -> Siguiente -> Siguiente -> Agregar. Como resultado, obtenemos la siguiente ventana:
Eso es todo, aquí tenemos todos los detalles para conectar nuestro primer dispositivo al agente MQTT Bluemix .Probaremos si nuestro cliente puede conectarse a él. Ingrese los detalles en la ventana del cliente.
Como puede ver, el cliente se conectó con éxito a Bluemix . Aquí debe prestar atención al nombre del host. Comienza con la identificación de la organización obtenida al crear la Internet of Things Foundation . El campo ID de usuario también es compuesto y está codificado como: d : < ID de organización >: < Tipo de dispositivo >: < ID de dispositivo >. El campo Nombre de usuario contiene una cadena fijause-token-auth .Los temas de mensaje para el agente de Bluemix , a diferencia del agente de Mosquitto, no pueden contener datos arbitrarios. Están codificados de acuerdo con ciertas reglas. Estas reglas deben estudiarse en la documentación de la Internet of Things Foundation . La captura de pantalla muestra uno de los posibles temas válidos.Repositorio del proyecto: https://github.com/Indemsys/Delphi_MQTT_mosquittoSource: https://habr.com/ru/post/es388231/
All Articles