Gateway para UDP entre Wi-Fi e LoRa

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


ladodireção e dadosladoa sessão
[cliente]<- sinal de farol -[gateway]0xA1
[cliente]- porta selecionada ->[gateway]0xB1
[cliente]<- consentimento ou rejeição -[gateway]0xA2
[cliente]- Pacote UPD ->[gateway]0xB2
[cliente]<- pacote UPD -[gateway]0xA3
[rede]<- pacote UPD -[gateway]0xC1

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


Bits0 - 1516 - 31
0-31Porta de origemPorta de destino
32-63Comprimento do datagramaSoma de verificação
64 -...Dados

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


CódigoTítuloExplicação
0xA1FarolO gateway transmite o nome da rede LoRa e o intervalo de portas permitidas com uma certa frequência. Isso é necessário para que os novos clientes vejam a rede disponível e os clientes atuais, quando não houver transmissão, possam determinar o nível do sinal.
0xB1AplicaçãoQuando o cliente encontra a rede, envia a porta preferida.
0xA2Consentimento ou NegaçãoSe a porta solicitada pelo cliente for gratuita, o servidor responderá com consentimento e, caso contrário, com uma recusa.
0xB2Link para cimaQuando o cliente envia o pacote UDP para o gateway.
0xA3Link para baixoQuando o gateway envia o pacote UDP para o cliente.
0xC1Up-Link continuadoQuando o gateway envia um pacote UDP para a rede local.

Bom Agora vamos discutir a composição das sessões na tabela 3.


Tabela 3. Sessões


Nome da sessãoComposição:
FarolCódigo da sessão (1 byte) + nome da rede LoRa (4 bytes) + porta inicial (2 bytes) + porta final (2 bytes)
AplicaçãoCódigo de Transferência (1 Byte) + Nome da Rede LoRa (4 Bytes) + Porta Preferida (2 Bytes)
Consentimento ou NegaçãoCódigo de transmissão (1 Byte) + nome da rede LoRa (4 Bytes) + Porta preferida (2 Bytes) + Resultado (1 Byte)
Link para cimaCódigo de transmissão (1 byte) + nome da rede LoRa (4 bytes) + endereço IP remoto (4 bytes) + porta remota (2 bytes) + endereço IP local (4 bytes) + porta local (2 bytes) + porta local (2 bytes) + tamanho dos dados (2 bytes) + dados
Link para baixoCódigo de transmissão (1 byte) + nome da rede LoRa (4 bytes) + endereço IP remoto (4 bytes) + porta remota (2 bytes) + endereço IP local (4 bytes) + porta local (2 bytes) + porta local (2 bytes) + tamanho dos dados (2 bytes) + dados
Up-Link continuadoEndereço IP remoto (4 bytes) + Porta remota (2 bytes) + Tamanho dos dados (2 bytes) + Dados

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:


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


All Articles