Gateway para UDP entre Wi-Fi y LoRa

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


ladodirección y datosladola sesión
[cliente]<- señal de baliza -[puerta de enlace]0xA1
[cliente]- puerto seleccionado ->[puerta de enlace]0xB1
[cliente]<- consentimiento o rechazo -[puerta de enlace]0xA2
[cliente]- Paquete UPD ->[puerta de enlace]0xB2
[cliente]<- Paquete UPD -[puerta de enlace]0xA3
[red]<- Paquete UPD -[puerta de enlace]0xC1

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


Pedacitos0 - 1516 - 31
0-31Puerto de origenPuerto de destino
32-63Longitud del datagramaSuma de comprobación
64 -...Datos

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


CódigoTituloExplicación
0xA1FaroLa puerta de enlace transmite el nombre de la red LoRa y el rango de puertos permitidos con cierta frecuencia. Esto es necesario para que los nuevos clientes vean la red disponible y los clientes actuales, cuando no hay transmisiones, puedan determinar el nivel de señal.
0xB1SolicitudCuando el cliente encuentra la red, envía el puerto preferido.
0xA2Consentimiento o NegaciónSi el puerto solicitado por el cliente es gratuito, el servidor responde con el consentimiento y, de lo contrario, con un rechazo.
0xB2Enlace ascendenteCuando el cliente envía el paquete UDP a la puerta de enlace.
0xA3Enlace descendenteCuando la puerta de enlace envía el paquete UDP al cliente.
0xC1Enlace ascendente continuoCuando la puerta de enlace envía un paquete UDP a la red local.

Bueno Ahora analicemos la composición de las sesiones en la tabla 3.


Tabla 3. Sesiones


Nombre de sesiónComposición
FaroCódigo de sesión (1 Byte) + Nombre de red LoRa (4 Bytes) + Puerto de inicio (2 Bytes) + Puerto de finalización (2 Bytes)
SolicitudCódigo de transferencia (1 byte) + Nombre de red LoRa (4 Bytes) + Puerto preferido (2 Bytes)
Consentimiento o NegaciónCódigo de transmisión (1 Byte) + Nombre de red LoRa (4 Bytes) + Puerto preferido (2 Bytes) + Resultado (1 Byte)
Enlace ascendenteCódigo de transmisión (1 Byte) + Nombre de red LoRa (4 Bytes) + Dirección IP remota (4 Bytes) + Puerto remoto (2 Bytes) + Dirección IP local (4 Bytes) + Puerto local (2 Bytes) + Tamaño de datos (2 bytes) + datos
Enlace descendenteCódigo de transmisión (1 Byte) + Nombre de red LoRa (4 Bytes) + Dirección IP remota (4 Bytes) + Puerto remoto (2 Bytes) + Dirección IP local (4 Bytes) + Puerto local (2 Bytes) + Tamaño de datos (2 bytes) + datos
Enlace ascendente continuoDirección IP remota (4 bytes) + Puerto remoto (2 bytes) + Tamaño de datos (2 bytes) + Datos

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:


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


All Articles