Escrito por: Pedro Bertoleti

Com a Internet das Coisas, inúmeras possibilidades de monitoramento, controle e melhoria de processos surgiram. Os segmentos de mercado que irão sofrer influência disso são os mais variados possíveis, exercendo especial influência em mercados com forte grau de emprego de tecnologia, como setor agropecuário e produção industrial, por exemplo. Porém, com a crescente necessidade de que cada vez mais equipamentos se comuniquem entre si e que tenham interação com a Internet (Internet das Coisas), uma demanda surgiu: melhorar a comunicação entre os equipamentos e destes com centrais/gateways, de modo que se tenha mais alcance, melhor imunidade às interferências e, por último mas não menos importante, se gaste menos energia para comunicação.

 

A tecnologia LoRa veio para suprir esta demanda, sendo hoje um dos grandes expoentes de comunicação de grande alcance e baixo consumo do mercado e grande aliado da Internet das Coisas. Este artigo tem por objetivo ensinar a você como fazer uma comunicação ponto-a-ponto entre dois módulos WiFi LoRa 32(V2) (veja nosso artigo sobre ele clicando aqui), onde há um emissor e um receptor, usando rádio LoRa, expandindo assim as possibilidades de projetos que envolvam comunicação entre módulos.

 

Material necessário

Para fazer a comunicação ponto-a-ponto entre dois módulos WiFi LoRa 32(V2), tudo o que você precisará são:

Dois módulos WiFi LoRa 32(V2)

Uma fonte micro-USB de 5V/2A

Um cabo micro-USB (para programação de ambos os módulos e para alimentação de um deles no computador)

 

Atenção!

Você leitor provavelmente já deve ter ouvido falar de LoRa antes, assim como já deve ter visto o nome LoRaWAN em sites de tecnologia, seminários, webinars e entre conversas com colegas de profissão. Sendo assim, aproveito este tópico para dizer que LoRa e LoRaWAN são coisas bem diferentes.

LoRa é uma tecnologia de comunicação para longas distâncias com baixo consumo de energia. Este nome refere-se ao rádio LoRa, que traz todos os benefícios ligados a alcance, imunidade a interferências e baixo consumo da tecnologia.

Já LoRaWAN trata-se de um protocolo que roda em cima do LoRa / rádio LoRa. O LoRaWAN permite se fazer uma rede propriamente dita, com endereçamento de dispositivos, gateway, mecanismos anti-colisão de pacotes, etc. Ou seja, LoRaWAN é protocolo de rede que roda em cima do rádio / camada física LoRa, fazendo com que uma estruturação de rede se estabeleça baseada na tecnologia LoRa.

Por conta da complexidade da comunicação exigida no projeto deste artigo (comunicação ponto-a-ponto) e custo associado da rede LoRaWAN (com gateway e serviços de aplicação para IoT, por exemplo), este projeto será feito com base no LoRa apenas (utilização dos rádios LoRa na camada física).

 

Porque usar LoRa?

LoRa apresenta grandes vantagens na comunicação entre dispositivos finais e entre dispositivos finais e central/gateway, sendo estas vantagens focadas em alcance, baixo consumo e imunidade a interferências. Observe:

 Alcance e consumo de energia: redes LoRa possuem um alcance muito grande e baixo consumo de energia se comparado a outros rádios do mercado de mesma ordem de grandeza de alcance. Utilizando antenas e corretamente dimensionadas é possível estabelecer comunicação entre dois nós com distâncias da ordem de grandeza de dezenas de quilômetros.

Por limitações de potência e antena, os módulos utilizados neste artigo apresentam alcance máximo de 3 km (em área aberta).

Imunidade à interferência: o rádio LoRa possui grande imunidade às interferências, algo muito bom em se tratando de ambientes urbanos. Além disso, o rádio LoRa trabalha em frequências abaixo de 1GHz (na faixa ISM), operando assim em uma banda diferente da grande maioria dos dispositivos eletrônicos (em sua maioria, 2.4GHz e 5GHz), diminuindo assim ainda mais as chances de interferências.

No caso do Brasil, segundo as normas relativas à telecomunicação, é permitido que um rádio LoRa trabalhe na frequência de 915MHz. É de fundamental importância obedecer esta norma, uma vez que desobediência deste quesito, além de prejudicar equipamentos operantes em outros espectros de frequência, pode gerar grandes multas e consequências legais por parte da ANATEL.

 

Dadas as vantagens acima, o rádio LoRa é considerado uma ótima escolha para projetos tanto em ambiente rural quanto urbano.

Um ponto de atenção quanto ao uso da tecnologia LoRa é que esta não se aplica a aplicações que exigem alto fluxo de dados, como streaming de imagens e áudio, por exemplo. O rádio LoRa possui data rate baixo (para o chip SX1276 operando a 915MHz, por exemplo, o data rate máximo é de 37.5 kbps). Em suma, LoRa se adequa muito bem em casos onde não se precisa de um data rate grande e que se deseja grande alcance, baixo consumo e grande imunidade à interferência.

 

Topologia de redes aceitas pelo LoRa

Em termos de topologia de rede, o uso de LoRa possui dois cenários distintos.

Na figura 1, podemos ver a comunicação entre módulos ponto-a-ponto. Aqui, há dois módulos “conversando” via rádio LoRa, trocando informações seja de forma síncrona, duplex ou full-duplex.

  

Figura 1 - comunicação ponto-a-ponto entre dois módulos WiFi LoRa 32(V2)
Figura 1 - comunicação ponto-a-ponto entre dois módulos WiFi LoRa 32(V2)

 

 Já na figura 2, é possível vermos vários módulos se comunicando a uma central / concentrador / gateway, caracterizando assim a topologia em estrela. Nesta topologia, cada dispositivo se comunica de forma síncrona, duplex ou full-duplex com o gateway e, este por sua vez, tem acesso à Internet, possibilitando que informações sejam enviadas e recebidas da Internet pelos módulos. Nesta topologia, um gateway de uma rede LoRa se comporta de forma similar a um roteador de rede comum / residencial, com o diferencial que já possui, praticamente de forma nativa, integração com plataformas e serviços Cloud / IoT. Esta arquitetura é empregada em redes LoRaWAN convencionais.

 

Figura 2 - topologia em estrela, comunicando dispositivos finais com gateway/concentrador e destes com a nuvem
Figura 2 - topologia em estrela, comunicando dispositivos finais com gateway/concentrador e destes com a nuvem

 

 

Cuidados ao fazer uma comunicação LoRa ponto-a-ponto

Assim como no caso de qualquer comunicação digital que possa envolver dados sensíveis de um determinado projeto, devemos tomar alguns cuidados na comunicação LoRa (seja ponto-a-ponto ou em estrela), de modo a garantir a segurança da comunicação. Os cuidados referidos começam em garantir que somente os dois dispositivos envolvidos sejam capazes de enviar, receber e interpretar mensagens recebidas, o que é conseguido elaborando um protocolo de comunicação. Este protocolo deve atender, especialmente, os seguintes requisitos:

 

1. Endereçamento: ambos os dispositivos envolvidos na comunicação devem possuir um endereço único enviado junto com a parte de interesse (payload) da mensagem e, no momento da recepção da mensagem, a primeira coisa a ser feita é verificar se esta é destinada para o módulo que a recebeu.

2. Verificação de integridade: o protocolo de comunicação envolvido deve conter um campo com um checksum (a escolha do tipo de checksum varia com as necessidades do projeto), para permitir a verificação da integridade por quem receber a mensagem. Isso garante que a mensagem recebida só será interpretada se o checksum calculado foi igual ao recebido, garantindo assim que os dados enviados não foram corrompidos na transmissão.

 

Além disso, uma ótima prática é sempre protegermos tudo que for enviado e recebido com criptografia, ou seja, todas as informações trafegadas são protegidas pelo emissor e desembaralhadas pelo receptor, que “sabe” como destravar esta proteção e recuperar a informação original. Para isso, são recomendados um dos dois tipos de criptografia abaixo:

 

1. Criptografia simétrica: neste tipo de criptografia, a chave para desproteger a informação (recuperar a informação original no receptor) é conhecida tanto no emissor (que a usou para proteger a informação) quanto no receptor (que usará a mesma chave para desproteger a informação e recuperar seu conteúdo original). Desta forma, embora mais simples que a criptografia assimétrica, possui uma desvantagem considerável: se alguém conhecer tal chave de criptografia/descriptografia consegue recuperar todas e quaisquer informações de sua comunicação, expondo-a assim a ataques, tentativas de engenharia reversa e roubo de informações.

2. Criptografia assimétrica: aqui, ao invés de uma chave única de criptografia, há um par de chaves denominado chave pública e chave privada. Para se fazer uma analogia, é como se a “caixa” que protegesse a informação (mensagem criptografada) possuísse um cadeado que abre com duas chaves distintas (chave pública e chave privada).

O emissor utiliza uma chave de acesso restrito (chave privada) para proteger a informação. O receptor, por sua vez, para conseguir trabalhar com a mensagem criptografada, utiliza uma chave pública e desconhece a chave privada. Esta chave pública possui duas finalidades: desproteger a informação (e recuperar seu conteúdo original) e verificar se a mensagem veio de um emissor que utilizou a chave privada correta. Dessa forma, se algum atacante/cracker conseguir descobrir a chave pública e provocou o envio de uma mensagem-falsa criptografada com uma chave privada diferente daquela esperada (para fins de fraude, por exemplo), o receptor, utilizando a chave pública, é capaz de detectar tal comportamento e não utilizar a informação ou, ainda, entrar em algum estado de alerta / emergência, dependendo da criticidade da informação envolvida. Além disso, a chave pública pode conter uma parte fixa e outra variável (em função da hora ou data, por exemplo), deixando ainda mais difícil que algum atacante/cracker intercepte uma mensagem criptografada, descubra a lógica de formação da chave pública, decifre / desproteja a mensagem e recupere seu conteúdo original.

A criptografia assimétrica oferece muito mais segurança que a simétrica, porém possui complexidade muito mais elevada, exigindo portanto mais processamento tanto do emissor quanto do receptor. Logo, se uma das partes da comunicação possuir restrições a altas taxas de processamento, talvez o uso de criptografia assimétrica seja proibitivo.

 

Por razões didáticas e de aprendizagem, o projeto desta postagem vai ater-se apenas a comunicação ponto-a-ponto em si, não fazendo uso de um protocolo de comunicação tampouco utilizar criptografia. A partir do momento que você se sentir confortável com a comunicação ponto-a-ponto e seus conceitos, pode (e deve) explorar os cuidados e pontos relevantes acima quanto a protocolo de comunicação e segurança.

 

 

Código-fonte: emissor

O código-fonte do emissor da comunicação ponto-a-ponto está abaixo. Preste bastante atenção nos comentários para maior entendimento do programa.

Você perceberá que é enviado de segundo em segundo uma informação numérica incremental (a cada envio possui um valor superior/diferente), de forma que no receptor será possível verificar se todas informações estão sendo recebidas ao longo do tempo. Além disso, perceberá que o emissor não utilizará o display OLED.

 

#include <LoRa.h>
#include <SPI.h>
#include <Wire.h>


{ bool status_init = false; Serial.println("[LoRa Sender] Tentando iniciar comunicacao com o radio LoRa..."); SPI.begin(SCK_LORA, MISO_LORA, MOSI_LORA, SS_PIN_LORA); LoRa.setPins(SS_PIN_LORA, RESET_PIN_LORA, LORA_DEFAULT_DIO0_PIN); if (!LoRa.begin(BAND)) { Serial.println("[LoRa Sender] Comunicacao com o radio LoRa falhou. Nova tentativa em 1 segundo..."); delay(1000); status_init = false; } else { /* Configura o ganho do receptor LoRa para 20dBm, o maior ganho possível (visando maior alcance possível) */ LoRa.setTxPower(HIGH_GAIN_LORA); Serial.println("[LoRa Sender] Comunicacao com o radio LoRa ok"); status_init = true; } return status_init; } /* Funcao de setup */void setup() { Serial.begin(DEBUG_SERIAL_BAUDRATE); while (!Serial); /* Tenta, até obter sucesso, comunicacao com o chip LoRa */ while(init_comunicacao_lora() == false); } /* Programa principal */void loop() { /* Envia a informação */ LoRa.beginPacket(); LoRa.write((unsigned char *)&informacao_a_ser_enviada, sizeof(informacao_a_ser_enviada)); LoRa.endPacket(); /* Incrementa a informação para o próximo envio e aguarda 1 segundo até enviar a próxima informação */ informacao_a_ser_enviada++; delay(1000); }

 

 

Código-fonte: receptor

O código-fonte do receptor está abaixo. Preste bastante atenção nos comentários para maior entendimento do programa. Você notará que, além da informação enviada (um valor incremental ao longo do tempo), será exibido no display OLED o RSSI de cada recepção. O RSSI, grosso modo, determina a qualidade de recepção do sinal LoRa, algo muito importante para testar e verificar na prática qual o melhor lugar físico para se colocar um emissor e/ou receptor num dado projeto, de modo a se ter a melhor qualidade de sinal possível.

 

#include <LoRa.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
/* Definicoes para comunicação com radio LoRa */
#define SCK_LORA 5
#define MISO_LORA 19
#define MOSI_LORA 27
#define RESET_PIN_LORA 14
#define SS_PIN_LORA 18
#define HIGH_GAIN_LORA 20 /* dBm */
#define BAND 915E6 /* 915MHz de frequencia */
/* Definicoes do OLED */
#define OLED_SDA_PIN 4
#define OLED_SCL_PIN 15
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
#define OLED_RESET 16
/* Offset de linhas no display OLED */
#define OLED_LINE1 0
#define OLED_LINE2 10
#define OLED_LINE3 20
#define OLED_LINE4 30
#define OLED_LINE5 40
#define OLED_LINE6 50
 
/* Definicoes gerais */
#define DEBUG_SERIAL_BAUDRATE 115200
/* Variaveis e objetos globais */
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 
/* Local prototypes */
void display_init(void);
bool init_comunicacao_lora(void);
 
/* Funcao: inicializa comunicacao com o display OLED
* Parametros: nenhnum
* Retorno: nenhnum
*/
void display_init(void)
{
    if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR))
    {
        Serial.println("[LoRa Receiver] Falha ao inicializar comunicacao com OLED");
    }
    else
    {
         Serial.println("[LoRa Receiver] Comunicacao com OLED inicializada com sucesso");
       /* Limpa display e configura tamanho de fonte */
       display.clearDisplay();
       display.setTextSize(1);
       display.setTextColor(WHITE);
     }
}
 
/* Funcao: inicia comunicação com chip LoRa
* Parametros: nenhum
* Retorno: true: comunicacao ok
* false: falha na comunicacao
*/
bool init_comunicacao_lora(void)
   {
       bool status_init = false;
      Serial.println("[LoRa Receiver] Tentando iniciar comunicacao com o radio LoRa...");
      SPI.begin(SCK_LORA, MISO_LORA, MOSI_LORA, SS_PIN_LORA);
      LoRa.setPins(SS_PIN_LORA, RESET_PIN_LORA, LORA_DEFAULT_DIO0_PIN);

if (!LoRa.begin(BAND)) { Serial.println("[LoRa Receiver] Comunicacao com o radio LoRa falhou. Nova tentativa em 1 segundo..."); delay(1000); status_init = false; } else { /* Configura o ganho do receptor LoRa para 20dBm, o maior ganho possível (visando maior alcance possível) */ LoRa.setTxPower(HIGH_GAIN_LORA); Serial.println("[LoRa Receiver] Comunicacao com o radio LoRa ok"); status_init = true; } return status_init; } /* Funcao de setup */ void setup() { /* Configuracao da I²C para o display OLED */ Wire.begin(OLED_SDA_PIN, OLED_SCL_PIN); /* Display init */ display_init(); /* Print message telling to wait */ display.clearDisplay(); display.setCursor(0, OLED_LINE1); display.print("Aguarde..."); display.display(); Serial.begin(DEBUG_SERIAL_BAUDRATE); while (!Serial); /* Tenta, até obter sucesso, comunicacao com o chip LoRa */ while(init_comunicacao_lora() == false); } /* Programa principal */ void loop() { char byte_recebido; int packet_size = 0; int lora_rssi = 0; long informacao_recebida = 0; char * ptInformaraoRecebida = NULL; /* Verifica se chegou alguma informação do tamanho esperado */ packet_size = LoRa.parsePacket(); if (packet_size == sizeof(informacao_recebida)) { Serial.print("[LoRa Receiver] Há dados a serem lidos"); /* Recebe os dados conforme protocolo */ ptInformaraoRecebida = (char *)&informacao_recebida;
while (LoRa.available()) { byte_recebido = (char)LoRa.read(); *ptInformaraoRecebida = byte_recebido; ptInformaraoRecebida++; } /* Escreve RSSI de recepção e informação recebida */ lora_rssi = LoRa.packetRssi(); display.clearDisplay(); display.setCursor(0, OLED_LINE1); display.print("RSSI: "); display.println(lora_rssi); display.setCursor(0, OLED_LINE2); display.print("Informacao: "); display.setCursor(0, OLED_LINE3); display.println(informacao_recebida); display.display(); } }

 

 

Projeto em ação!

Veja abaixo um vídeo curto do projeto em ação.

Link do vídeo: https://www.youtube.com/watch?v=kCbMh31HgqA&feature=youtu.be 

 

 

Conclusão

Neste artigo, você aprendeu mais sobre o LoRa, suas vantagens e pontos de atenção e, além disso, quais as topologias de rede suportadas e a como fazer uma comunicação ponto-a-ponto utilizando dois módulos WiFi LoRa 32(V2). Ainda, aprendeu mais sobre como melhorar e proteger uma comunicação, do ponto de vista de protocolos de comunicação e criptografia.

Com o conteúdo aqui apresentado, você será capaz de acrescentar comunicação LoRa aos seus projetos e a protegê-la de partes maliciosas, algo vital em qualquer sistema IoT.