Criamos o gateway entre Wi-Fi e LoRa para UDP

Eu tive um sonho de infância - dar a cada dispositivo doméstico “Wi-Fi” um ticket de rede, ou seja, um endereço IP e uma porta. Depois de algum tempo, percebi que não deveria adiar. Nós devemos pegar e fazer.
Termos de Referência
Torne-o um gateway M5Stack com o LoRa Module instalado (Figura 1). O gateway será conectado a uma rede Wi-Fi na qual obter um endereço IP local via DHCP. O gateway transmitirá seu nome no LoRa-éter com uma certa frequência (analógica do SSID para Wi-Fi) e o intervalo de portas aceitáveis, para que outros dispositivos saibam que existe uma rede à qual você pode se conectar e em qual intervalo você pode selecionar uma porta livre. Como esse será um protótipo, a autenticação não é desta vez. Os novos dispositivos clientes encontrarão uma rede LoRa disponível e transmitirão a porta selecionada para ela. Depois que o gateway recebe uma porta de um novo cliente, ele verifica se está livre; nesse caso, registra um novo cliente e começa a ouvir essa porta em seu próprio servidor UDP assíncrono. Após o registro, o cliente receberá consentimento ou recusa em usar a porta declarada. O procedimento operacional é mostrado na tabela 1.

Figura 1
Quadro 1
Diante de mim, na mesa, existem todos os tipos de módulos para o M5Stack e estão entediados. Vamos pegar LoR e divirta-se com ela . O próprio conceito de módulo é lindo! O que posso dizer? Mas, os módulos da minha primeira revisão, em que uma terrível antena embutida, foi feita em uma placa de circuito impresso flexível e colada na parede lateral do gabinete. Certa vez, realizei testes de campo desses módulos (você pode assisti-lo no canal em russo do YouTube):
Naturalmente, tive que remover esses rudimentos e soldar as antenas helicoidais padrão que acompanham o Ra-01. Após essa personalização, o alcance da comunicação melhorou visivelmente, mas um ponto lateral apareceu - a antena tem um diâmetro maior que a distância permitida entre os módulos. Eu tive que abandonar o módulo Final durante a duração do projeto.
Primeiras dificuldades de aperto sincrônico
Parece que leva a biblioteca WiFiUdp.h , onde tudo é para a existência confortável de um servidor UDP, não. A biblioteca foi projetada para elevar um servidor síncrono, que, infelizmente, não pode atender a várias conexões ao mesmo tempo. Essa biblioteca não é adequada para a tarefa atual. Eu tive que beber muitas xícaras de chá e procurar uma biblioteca que nos permitisse criar um servidor UDP assíncrono capaz de suportar muitas conexões ao mesmo tempo. Essa biblioteca foi encontrada - AsyncUDP.h . Qual é a diferença entre um servidor síncrono e um assíncrono? Vamos dar uma olhada em seis episódios na Figura 2, nos quais as opções de operação do soquete são exibidas trivialmente.

Figura 2
Estrelando:
Um homem no papel de um soquete ;
Pomba no papel de Composto ;
Pismo como dados .
Episódio A. Soquete síncrono sem tempo limite
Uma pessoa permanecerá até que a pomba lhe traga uma carta.
Episódio B. Soquete síncrono com tempo limite
Um homem espera pelo tempo acordado com a Pomba e, se ele não chegar a tempo, então o Homem irá embora.
Episódio C. Soquete Multithreading Síncrono
Um homem relaxa e observa enquanto os pombos entregam cartas por conta própria.
Episódio D. Soquete assíncrono (quando não há mais nada a receber)
Um homem faz suas coisas favoritas, mas não esquece os pombos.
Episódio E. Soquete assíncrono (quando houver algo a receber)
O homem distraiu-se brevemente dos negócios e recebeu uma carta do Dove.
Episódio F. Soquete Multithreading Assíncrono
Um homem cuida dos seus negócios e observa os pombos entregarem cartas por conta própria.
Se você tomou cuidado, provavelmente deve ter notado que os colares nos pombos de cada episódio têm uma determinada cor. E isso não é acidente. No episódio A e B, apenas um soquete funciona no servidor e é isso. O episódio C já tem duas tomadas. Os episódios D, E e F já têm três soquetes. "Por que existem dois, mas aqui estão três?" - você pergunta. Isso é condicionalmente 2 e 3; de fato, em vez de 2, pode ser 20 e, em vez de três 200. A tarefa é mostrar que os soquetes assíncronos não queimam ferro tanto quanto os síncronos.
Onde se encaixa?
Vamos olhar para a tabela 1, que mostra a estrutura do pacote UDP e pensar no que você pode fazer sobre isso.
Tabela 1. Estrutura de pacotes UDP
Adicione outro campo de sessão (1 byte) ao início desta tabela. Isso é suficiente para este projeto. Com base na sessão, o dispositivo saberá o que fazer com o pacote a seguir. Agora, criaremos códigos para as sessões e os escreveremos na tabela 2.
Tabela 2. Descrição da Sessão
Bom Agora vamos discutir a composição das sessões na tabela 3.
Tabela 3. Sessões
Escreveu dois clientes para o Arduino e para o M5Stack. Você pode ver como isso funciona no vídeo . Não há problemas no apartamento, ainda não fiz testes de campo.
O código fonte está disponível no GitHub em
Saiba mais sobre a unidade base M5Stack e compre aqui.
Você pode selecionar os módulos sem fio LoRa para a unidade base aqui
Ficarei feliz se este projeto for útil para você. Muito obrigado pelo seu tempo!
Referências e (ou) fontes: