Cómo mezclar BLE, NodeJS y MQTT para obtener Internet de las cosas

Vivimos en el mundo de los dispositivos conectados. Nunca ha sido más fácil desarrollar el suyo e implementar las funciones que realmente desea, en lugar de vivir con el mínimo común denominador que el fabricante ha elegido.

En un artículo anterior, caminé con un pequeño script de Python para hablar con la luz BLE y lo usé para circular a través de algunos colores. Ahora quiero profundizar en el mundo de los dispositivos BLE conectados y cómo configurar un Internet de las cosas simple. Con este ejemplo en la mano, el cielo limita lo que puede construir y lo que podrá hacer.

Únase a mí después del descanso mientras demuestro cómo usar NodeJS para unir el mundo digital con el mundo físico.

Soporte Bluetooth en idiomas

NodeJS se diferencia mucho de los lenguajes tradicionales en la forma en que un nodo se considera asincrónico en su ejecución. NodeJS usa Event Loop y las cosas suceden como resultado de eventos como acciones del usuario, así como mensajes de otros programas e hilos. Un programa o script tradicional es una secuencia de acciones que se realizarán una tras otra hasta que se completen todas las acciones. Si una acción en particular está bloqueada, como esperar un clic en un botón o un mensaje de un dispositivo, el programa tendrá que esperar hasta que finalice el proceso.

Fuente de imagen: @BusyRich

No soy un experto en NodeJS, pero es necesario comprender los conceptos básicos para poder escribir nuestra aplicación. Los detalles sobre Async.js y el bucle de eventos pasan por este artículo y comenzaremos con una aplicación básica y agregaremos la función necesaria.

La compatibilidad con BLE en NodeJS está habilitada con el paquete 'NobleJS' de Sandeep Mistry. Puede aprender mucho estudiando otros programas que ya usan el paquete. Hablé con Alex Albino sobre su experiencia con BLE y NodeJS. Alex Albino es el mismo responsable de IMUDuino que mencioné anteriormente y el programa de su sitio web está escrito en NodeJS. Tiene varios otros programas de ejemplo en GitHub que creó con la ayuda de Kas Perch y Russell Hay. Me inspiré en su trabajo y creé una pequeña aplicación puente que se describe aquí. Utiliza NobleJS, que se ejecuta tanto en MacOS como en Linux. El soporte para Windows 10 está disponible, pero no me aventuré en esa dirección.

Comencemos con una aplicación básica para comprender mejor cómo funcionan las cosas.

Aplicación sencilla de BLE Scanner

La página del paquete de NobleJS tiene todos los documentos necesarios para comenzar. La configuración básica es simple e incluye las herramientas que instalamos en la edición anterior. Para comenzar un nuevo proyecto, simplemente cree una nueva carpeta y ejecute el comando:

npm init blescanner

NPM le hará algunas preguntas y solo debe presionar hacia atrás para lo que no desea completar. Solo tenga en cuenta el punto de entrada que es default.js por defecto. Aquí está el archivo donde irá todo el código.

Luego instale el paquete noble:

sudo npm install noble --save

Edite index.js en su editor favorito. Ya estoy probando el código para empezar. Si sigue, copie este Github Gist y péguelo en su archivo index.js.

El código tiene tres partes. El primero es crear paquetes y crear variables. El segundo es agregar revocaciones a funciones como la de noble. En eventos. El tercero es un pequeño ciclo de intervalo que permite a nuestro programa habilitar y deshabilitar el escaneo de BLE. Después de ejecutar el script, debería escupir los nombres de las señales BLE y los dispositivos laterales a su alrededor. Dejé algunos otros datos que no se muestran para que experimentes.

Hablando con las luces BLE

El escáner tiene la capacidad de imprimir los identificadores de todos los periféricos cercanos. Cambié el nombre de mi escáner index.js a scanner.js y lo ejecuté para escanear dispositivos BLE cercanos. Después de que el escáner enumera las luces BLE, creamos una lista de UUID con una simple copia y pegado, que se puede modificar más adelante.

Creé un nuevo index.js donde trato de conectarme a cada BLE Light y luego escribir un valor conocido para la característica relevante. A diferencia del artículo anterior, donde escribimos un valor RGBW de 4 bytes, en este ejercicio, las características individuales se utilizan como prueba de concepto. El código se puede descargar desde mi repositorio de Github.

En mi experimento, utilicé los valores 00 para cada luz, ya que las luces BLE parpadean con brillo completo de forma predeterminada cuando se encienden por primera vez y, por lo tanto, una carcasa conectada correctamente apagaría la luz.

Conectividad - MQTT

Hay algunas formas de vincular nuestra aplicación a Internet para calificarla como un programa de IoT; sin embargo, usaremos el protocolo MQTT. MQTT es el mismo protocolo utilizado por Facebook Messenger para su conectividad, y es uno de los favoritos aquí para la automatización del hogar.

MQTT trabaja a través de una oficina de correos central llamada MQTT Broker y este corredor permite que los clientes se conecten a ella. Una vez que un cliente se registra con el corredor, se suscribe a un tema en particular que es equivalente a una publicación. Una vez que se publica un mensaje en el tema, se distribuye a los clientes registrados.

Hay una serie de decisiones, como la autenticación y el aseguramiento de la entrega, pero lo importante es que cada cliente se conecta externamente al bróker. Esto significa que no hay problemas con las direcciones IP y la configuración del firewall (a menos que su red esté bloqueando todos los puertos). El protocolo subyacente es TCP / IP y es altamente personalizable, lo que dejo como ejercicio para el lector.

Para este ejercicio, usaremos el corredor MQTT gratuito en iot.eclipse.org, que se puede usar sin registrarse en Eclipse, lo cual es bastante impresionante. Cualquiera puede utilizarlo en cualquier idioma e incluso con hardware dedicado. He utilizado el servicio para conectar CC3200 a Internet en el pasado (discutiré brevemente el proyecto al final de este artículo).

Hay un programa de muestra disponible y le pido encarecidamente que lo pruebe antes de continuar. Simplemente reemplace la cadena de enlace en mqtt: //iot.eclipse.org y será bienvenido. En este punto, tiene dos piezas del rompecabezas, probadas y listas para funcionar. Luego armamos un humpty-dumpty.

Creando un puente

Lo último que debe hacer aquí es crear el puente real. Así es como debería funcionar.

Una vez ejecutado el programa NodeJS, debería intentar conectarse al MQTT Broker. Si esto falla, obtenemos un error, sin embargo, si todo funciona como se esperaba, el programa debe suscribirse a un asunto y esperar un evento de mensaje. Además, debe verificar si el dispositivo BLE en la máquina está habilitado y, de ser así, debe buscar dispositivos BLE a intervalos regulares. Las variables locales se utilizarán para almacenar los valores R, G, B y W que se transmitirán al dispositivo BLE. Si esta aplicación se ampliara, se podrían utilizar más variables para almacenar los datos intercambiados entre BLE y nuestra aplicación cliente.

Después de recibir un mensaje sobre el asunto MQTT, el valor se escribe en la variable local lista para ser transmitida a los dispositivos BLE. Una vez que se encuentra un dispositivo BLE, el programa debe conectarse a él y escribir en la función adecuada.

Hay algunas opciones de proyectos que se deben tomar aquí. Primero, elegí actualizar los datos locales en los dispositivos BLE incluso si ya se habían escrito en una transacción anterior. Esto es superfluo y es posible que pueda ahorrar energía agregando un cheque aquí. En segundo lugar, tengo cuatro temas diferentes para R, G, B y W, lo que significa cuatro relaciones diferentes. Una mejor manera sería utilizar un JSON o un método personalizado para empaquetar datos para consolidar los datos en un solo flujo.

Entonces, ¿cómo enviamos los comandos? Una aplicación similar con solo la parte MQTT del código funcionaría y también incluyo el código fuente para eso. Eche un vistazo a mi código y, por favor, examínelo y elimínelo. Me encantaría ver qué construyes con él.

Una breve nota sobre finales anteriores.

Una herramienta de línea de comandos no es la mejor manera de presentar su idea y, dado que estamos usando NodeJS, pensé que solo tocaría el tema de los finales anteriores. Los programas tradicionales deben estar escritos en Visual Basic o Java (¿AWT o Swing?). Sin embargo, las páginas web y las tecnologías relacionadas pueden ser una solución portátil. En lugar de ser implementable, una página web podría codificarse para mostrar los botones necesarios y tener funciones javascript para enviar los datos necesarios a algo como un servidor MQTT. Recuerde, NodeJS es un javascript para el backend y el mismo código (ish) se puede ejecutar en el navegador moderno.

¿Necesitas más inspiración? Eche un vistazo a three.js y MeteorJS y se encontrará con la capacidad de tener aplicaciones GUI fáciles (ish) con muy pocas líneas de código que puede llevar a una Raspberry Pi similar.

Proyecto similar

Antes de cerrar, quería agregar una demostración en video de un pequeño proyecto que hice hace unos años usando la plataforma CC3200 de Texas Instruments. En lugar de una computadora portátil que ejecutaba el código MQTT, tenía la conexión CC3200 con el corredor y esperaba los pedidos. Benjamin Cabe fue la inspiración detrás del trabajo, donde se utilizó como base toda la biblioteca Eclipse de la OPS. Para el final anterior, utilicé la biblioteca JS de la OPS para enviar comandos a través de MQTT y recibir mensajes de estado y mostrarlos en tiempo real.

(Enlace externo a la versión en vivo)

Eso es todo lo que tengo ahora y si te gusta lo que has visto, cuéntanoslo. Nos encantaría que sus proyectos fueran posibles gracias a tecnologías similares y si tiene algo que le parezca increíble, envíenos un enlace a través de la línea de asesoramiento.

  • hackadave dice:

    Un par de comentarios. Esta es una muy buena introducción al uso de BLE con NodeJS y MQTT, pero la arquitectura es muy insegura. Primero, los dispositivos deben conectarse entre sí a través de una LAN segura con una entrada entre eso e Internet. En segundo lugar, TLS debe usarse con MQTT a través de Internet, idealmente con certificados de clientes. Node Red también es una buena forma de unir sistemas de IoT. Admite la codificación JavaScript cuando es necesario y permite ensamblar sistemas complejos muy rápidamente. MQTT es una excelente manera de interconectar sistemas de IoT, pero debido a que usa TCP, que está conectado, no funciona bien para dispositivos con poca energía. CoAP sobre UDP es una buena opción para este tipo de dispositivos. El uso de una computadora portátil como interfaz para BLE es un poco excesivo, pero decente para la creación de prototipos. BLE no es muy seguro, pero es bueno para usar en la periferia. Espero que estos comentarios le resulten útiles.

  • Jan Ciger (@ janoc200) dice:

    Es una gran tragedia cuando cada tutorial de IoT se centra en cosas como MQTT y trabajar con varios corredores externos, pero ni siquiera una idea de seguridad básica, cómo reforzar la configuración para no convertirse en un zombi de botnet, cómo asegurarse de que solo estén autorizados los dispositivos / usuarios autenticados pueden conectarse a él, etc.

    No es de extrañar que IoT sea un desastre tan inocente y casi una blasfemia en algunos círculos de TI / información.

    • Subaudible dice:

      [oldjoke]La S en IoT significa seguridad.[/oldjoke]

      • jwcrawley dice:

        ¿Quiere una red IoT segura? Para eso estoy corriendo.

        https://la-tecnologia.io/project/12985-multisite-homeofficehackerspace-automation

        1. No confíe en los puntos finales comprados habitualmente. Le gritan a una nave base. Construye tu propio.
        2. Asegúrese de que los puntos finales de la estación base sean seguros (resistencia repetida, cifrado)
        3. Datos enviados / recibidos a puntos finales SSL (HTTPS, SSL)
        4. Los enlaces a los centros de datos en los sitios web superan a Tor.

        Garantizamos: autenticación, identificación, autorización. Logramos esto con Tor, nombre de usuario / contraseña y controles de acceso. El firmware tiene la menor capacidad, por lo que no es posible reprogramarlos inmediatamente.

  • Ostraco dice:

    “Vivimos en el mundo de dispositivos conectados. Nunca ha sido más fácil desarrollar el suyo e implementar las funciones que realmente desea, en lugar de vivir con el mínimo común denominador que el fabricante ha elegido. "

    * Separa el dispositivo costoso * 😉

    • Clovis Fritzen dice:

      Esto es tan cierto. Nada en la actualidad es bastante utilizable y pirateable si es barato. Las "masas" en "tecnología para las masas" que la gente anuncia hoy están perdidas.

  • Subaudible dice:

    Sí, BLE es terriblemente inseguro, pero generalmente está bien para la mayoría de los casos de uso, siempre que el escenario de conexión / conexión ocurra en un entorno controlado.

    He estado trabajando en la implementación de un BLE que permite que una solución basada en TLS / PKI proporcione este "enlace" sin requerir un intercambio de información tan vulnerable. Desafortunadamente, debido a cómo funciona BLE, si un atacante puede oler todo el paso de emparejamiento y enlace, es el propietario del enlace completo. Esto ayuda a mitigarlo, aunque agrega una gran demanda de infraestructura PKI total.

    Intercambios.

    • Daniel dice:

      > Sí, BLE es terriblemente inseguro, pero generalmente está bien para la mayoría de los casos de uso siempre que el escenario de conexión / conexión ocurra en un entorno controlado.

      ¿A quién le importa la posible explotación local cuando el resto del sistema es aún más abierto * y * accesible desde Internet?

  • Shmuelzon dice:

    Probablemente esté sesgado porque soy el autor de los siguientes proyectos, pero ¿podría ofrecer un puente BLE-a-MQTT para linux + Bluez: https://github.com/shmuelzon/ble2mqtt.
    También tengo uno para el ESP32: https://github.com/shmuelzon/esp32-ble2mqtt

  • Blanco Curt dice:

    ¿Por qué no Bluetooth? Si JavaScript es su veneno, ¿por qué no al menos hacer algo que solo JavaScript puede hacer?

Alejandro Vargas
Alejandro Vargas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.