Hacemos la puerta de enlace entre Wi-Fi y LoRa para UDP

Tuve un sueño infantil: dar a cada dispositivo doméstico "sin Wi-Fi" un ticket de red, es decir, una dirección IP y un puerto. Después de un tiempo, me di cuenta de que no debía posponerlo. Debemos tomar y hacer.
Términos de referencia
Conviértalo en una puerta de enlace M5Stack con el módulo LoRa instalado (Figura 1). La puerta de enlace se conectará a una red Wi-Fi para obtener una dirección IP local a través de DHCP. La puerta de enlace transmitirá su nombre en LoRa-ether con una cierta frecuencia (análogo de SSID para Wi-Fi) y el rango de puertos aceptables para que otros dispositivos sepan que existe una red a la que puede conectarse y en qué rango puede seleccionar un puerto libre. Dado que este será un prototipo, la autenticación no es esta vez. Los nuevos dispositivos cliente encontrarán una red LoRa disponible y le transmitirán el puerto seleccionado. Después de que la puerta de enlace ha recibido un puerto de un nuevo cliente, comprueba si está libre, si es así, registra un nuevo cliente y comienza a escuchar este puerto en su propio servidor UDP asíncrono. Después del registro, el cliente recibirá el consentimiento o la negativa a utilizar el puerto declarado. El procedimiento operativo se muestra en la tabla 1.

Figura 1
Tabla 1
Ante mí sobre la mesa hay todo tipo de Módulos para el M5Stack y están aburridos. Tomemos LoR y diviértete con ella . ¡El concepto del módulo en sí es hermoso! Que puedo decir Pero, los módulos de mi primera revisión, en los que una antena incorporada terrible, hecha en una placa de circuito impreso flexible y pegada a la pared lateral de la caja. Una vez realicé pruebas de campo de dichos módulos (puede verlo en el canal en ruso en YouTube):
Naturalmente, tuve que eliminar estos rudimentos y soldar las antenas helicoidales estándar que vienen con el Ra-01. Después de tal personalización, el rango de comunicación mejoró notablemente, pero apareció un punto lateral: la antena tiene un diámetro mayor que la distancia permitida entre los módulos. Tuve que abandonar el módulo Final durante la duración del proyecto.
Primeras dificultades de estanqueidad sincrónica
Parecería que tomar la biblioteca WiFiUdp.h , donde todo es para la cómoda existencia de un servidor UDP, no. La biblioteca está diseñada para levantar un servidor síncrono que, desafortunadamente, no puede servir múltiples conexiones al mismo tiempo. Dicha biblioteca no es adecuada para la tarea actual. Tuve que beber muchas tazas de té y buscar una biblioteca que nos permitiera crear un servidor UDP asincrónico capaz de soportar muchas conexiones al mismo tiempo. Se encontró una biblioteca de este tipo: AsyncUDP.h . ¿Cuál es la diferencia entre un servidor síncrono y uno asíncrono? Echemos un vistazo a seis episodios en la Figura 2, en los que las opciones de operación de socket se muestran trivialmente.

Figura 2
Protagonista:
Un hombre en el papel de un zócalo ;
Paloma en el papel de Compuesto ;
Pismo como datos .
Episodio A. Enchufe sincrónico sin tiempo de espera
Una persona se parará hasta que la paloma le traiga una carta.
Episodio B. Enchufe sincrónico con tiempo de espera
Un hombre espera el tiempo acordado con la Paloma, y si no llega a tiempo, el Hombre se irá.
Episodio C. Zócalo sincrónico de subprocesos múltiples
Un hombre descansa y observa mientras las palomas entregan cartas por su cuenta.
Episodio D. Zócalo asíncrono (cuando no hay nada más que recibir)
Un hombre hace sus cosas favoritas, pero no se olvida de las palomas.
Episodio E. Zócalo asíncrono (cuando hay algo que recibir)
El hombre se distrajo brevemente de sus asuntos para recibir una carta de la paloma.
Episodio F. Zócalo multiproceso asíncrono
Un hombre se ocupa de sus asuntos y observa a las palomas entregar cartas por su cuenta.
Si fue cuidadoso, probablemente debería haber notado que los collares de las palomas en cada episodio tienen un cierto color. Y esto no es accidental. En los episodios A y B, solo un socket funciona en el servidor y eso es todo. El episodio C ya tiene dos enchufes. Los episodios D, E y F ya tienen tres tomas. "¿Por qué hay dos, pero aquí hay tres?" - usted pregunta Esto es condicionalmente 2 y 3, de hecho, en lugar de 2 puede ser 20, y en lugar de tres 200. La tarea es mostrar que los enchufes asíncronos no queman tanto hierro como los síncronos.
¿Dónde encaja qué?
Veamos la tabla 1, que muestra la estructura del paquete UDP y pensemos qué puede hacer al respecto.
Tabla 1. Estructura de paquetes UDP
Agregue otro campo de Sesión (1 Byte) al comienzo de esta tabla. Esto es suficiente para este proyecto. Según la sesión, el dispositivo sabrá qué hacer con el paquete a continuación. Ahora encontraremos códigos para las sesiones y los escribiremos en la tabla 2.
Tabla 2. Descripción de la sesión
Bueno Ahora analicemos la composición de las sesiones en la tabla 3.
Tabla 3. Sesiones
Escribió dos clientes para Arduino y para M5Stack. Puedes ver cómo funciona en el video . No hay problemas dentro del apartamento, todavía no he hecho pruebas de campo.
El código fuente está disponible en GitHub en
Obtenga más información sobre la Unidad base M5Stack y compre aquí.
Puede seleccionar módulos inalámbricos LoRa para la Unidad base aquí
Me alegrará si este proyecto es útil para usted. Muchas gracias por tu tiempo!
Referencias y (o) fuentes: