IoT DevKit - 7. Introdução ao LoRaWAN
Introdução
O LoRaWAN é um dos protocolos de comunicação sem fio possíveis com o IoT DevKit. Além disso, ele está se popularizando cada vez mais e se mostrando uma grande ferramenta para projetos que exigem um longo alcance. Mas afinal, o que é LoRaWAN?
Neste tutorial iremos te introduzir ao protocolo LoRaWAN, com seus conceitos básicos, métodos de conexão e de operação. Além disso, iremos aprender como nos comunicar com o módulo LoRaWAN Bee usando o IoT DevKit.
Lista de Materiais
Lista completa de produtos
comprarIoT DevKit - LoRaWAN
O Que é LoRaWAN?
LoRaWAN é um protocolo de comunicação baseado no protocolo de radiofrequência LoRa da Semtech, e foi desenvolvido para alcançar as camadas mais altas de uma aplicação, chegando até o usuário final, como na imagem abaixo. Entretanto, dispositivos LoRaWAN não são apenas módulos de radiofrequência, eles também são compostos de microcontroladores dedicados, que são responsáveis por conectar o dispositivo à rede e garantir a segurança da comunicação.
Estrutura do Protocolo
Os dispositivos LoRaWAN não se conectam e enviam mensagens diretamente para a internet, eles utilizam uma rede de componentes para chegar à plataforma final, como na imagem a seguir.
Os "End Nodes", ou "End Devices", representam os dispositivos LoRaWAN remotos, como o LoRaWAN Bee. Estes dispositivos enviam e recebem informações dos "Gateways", ou "Concentrators" como também são conhecidos, que representam basicamente as antenas de conexão, como as da ATC ("American Tower Corporation"), por exemplo. Da antena de conexão, as informações trocadas com os dispositivos são enviadas pela internet para o "Network Server", que é responsável por encaminhar corretamente as mensagens de um certo dispositivo para sua respectiva aplicação final, ou no sentido inverso. Por fim, as informações chegam ao "Application Server", que representa a plataforma onde são finalmente exibidas, ou de onde partem, as informações da comunicação, como a PROIoT, por exemplo.
Classes do Protocolo
Como é possível observar na primeira imagem da seção anterior , este protocolo é subdividido em três classes de dispositivo: a classe "A", a classe "B" e a classe "C". Cada uma destas classes representa um funcionamento distinto do dispositivo.
A classe "A" representa uma sigla de "All" (Todos/Tudo), pois todas as outras classes deste protocolo ("B" e "C") são capazes de se comportar como esta classe. Os dispositivos de classe "A" apresentam o menor consumo de energia, pois embora eles possam enviar dados a qualquer momento, eles só aguardam por uma resposta do servidor durante um breve período determinado. Nesta classe, o dispositivo cria duas janelas de recepção de resposta do servidor após o envio da mensagem, e ele pode receber esta resposta na primeira janela (Rx1), na segunda janela (Rx2), ou não receber resposta em nenhuma delas, como nas imagens a seguir. No entanto, o dispositivo nunca receberá a mesma resposta nas duas janelas.
Já a classe "B" representa a sigla de "Beacon" (Farol/Sinaleiro), pois os envios são "guiados". Nesta classe, o dispositivo recebe sinais ("beacon") de tempos em tempos para sincronizar o seu relógio interno com o do "gateway". Depois desta sincronização, o dispositivo abre janelas de recepção de mensagens do servidor com uma frequência predefinida, como na imagem abaixo.
A classe "C", por sua vez, representa a sigla de "Continuous" (Contínuo), que, como o próprio nome já diz, mantém o dispositivo ouvindo continuamente por uma resposta do servidor, como na próxima imagem. Entretanto, devido ao seu método de funcionamento, este tipo de dispositivo é o que consome mais energia entre todas as classes.
Métodos de Conexão
As três classes de dispositivos acima podem utilizar dois métodos distintos de comunicação, o "OTAA" ("Over The Air Activation") e o "ABP" ("Activation By Personalization"). Estes dois métodos exigem diferentes informações para conectar o dispositivo à rede.
O método "OTAA" utiliza apenas três dados do dispositivo para conectá-lo à rede, sendo eles a "Application EUI", sua respectiva "Application Key" e a "Device EUI". Com essas informações, o dispositivo envia uma requisição de conexão ao servidor juntamente com um "Device Nonce" (um contador para garantir que não ocorram conexões duplicadas), e, caso os dados estejam corretos e válidos, o servidor retorna a requisição com a confirmação e com alguns dados sobre a rede, que são salvos no dispositivo, como na imagem a seguir.
A grande vantagem deste tipo de conexão é que as chaves de sessão ("Network Session Key" e "Application Session Key") são geradas somente quando requisitadas, o que aumenta a segurança da conectividade. Entretanto, como o "Device EUI" deve ser único na rede, é necessário configurar cada dispositivo com uma identificação única no mundo. Outro ponto negativo é que o dispositivo deve ser capaz de gerar as chaves de segurança dinamicamente.
O método "ABP", por sua vez, requer apenas que sua sessão seja configurada, através de um "Device Address", uma "Application Session Key" e uma "Network Session Key", que são configurados diretamente no dispositivo. Estes mesmos dados devem ser configurados no servidor, como na próxima imagem.
Nesta configuração, os dispositivos não precisam da autorização prévia da rede, logo não dependem da capacidade de gerar as chaves de segurança dinamicamente. Entretanto, este método acaba sendo menos seguro que o "OTAA", já que as chaves de segurança estão armazenados no dispositivo. Outro ponto importante é que, caso o dispositivo precise mudar de rede, tanto ele quanto a rede devem ser reconfigurados com novos parâmetros de conexão.
Primeira Comunicação com o Módulo
Biblioteca
Para que possamos nos comunicar pela primeira vez com o módulo LoRaWAN Bee, temos que instalar a biblioteca "RoboCore_SMW_SX1276M0", que pode ser encontrada no "Gerenciador de Bibliotecas" da IDE, ou instalada manualmente, baixando o arquivo compactado através do botão abaixo. Caso não saiba como instalar bibliotecas na Arduino IDE, siga os passos deste tutorial.
Download da Biblioteca "RoboCore_SMW_SX1276M0"Código
Com a biblioteca instalada, copie e cole o código a seguir na Arduino IDE, e então carregue-o para a placa. Vale lembrar que é necessário selecionar corretamente o modelo da placa e a sua respectiva porta serial.
Após carregar o código para a placa, abra o monitor serial e configure-o para as opções "Ambos NL & RC" e taxa de transmissão de 115200 bps.
Comandos "AT"
Agora podemos enviar a nossa primeira mensagem para o módulo, e para isso vamos usar o seu set de comandos AT. O primeiro e mais importante que vamos usar neste tutorial é o AT+DEVEUI
("DEVEUI" é uma abreviação para "Device EUI"), que deve retornar o "Device EUI" do módulo, um código de 16 dígitos hexadecimais (8 bytes), como na imagem abaixo.
O "Device EUI" representa o endereço do dispositivo para a rede, basicamente como o "MAC Address" da conexão Wi-Fi do ESP32, portanto ele é extremamente importante e único para cada módulo. Anote-o e guarde-o com muito cuidado, pois se perdê-lo, não será possível recuperá-lo.
Em seguida, envie o comando AT+NJM
("NJM" é uma sigla de "Network Join Mode"), para saber para qual método de conexão o seu módulo está configurado. Este comando deve retornar uma resposta como a da próxima imagem.
Por padrão os módulos LoRaWAN Bee são configurados como "OTAA" ("1"), mas se o seu módulo retornar "0" ("ABP") ou "2" ("P2P" - "Point to Point"), não se preocupe, pois é possível voltá-lo ao método de fábrica através do comando AT+NJM 1
.
Por fim, vamos verificar os canais de conexão do módulo através do comando AT+CH
("CH" é uma abreviatura para "Channel"), e você deve receber uma resposta como a demarcada a seguir.
AT+CH
0 freq 915200000 drrange 0 to 5 status 1
1 freq 915400000 drrange 0 to 5 status 1
2 freq 915600000 drrange 0 to 5 status 1
3 freq 915800000 drrange 0 to 5 status 1
4 freq 916000000 drrange 0 to 5 status 1
5 freq 916200000 drrange 0 to 5 status 1
6 freq 916400000 drrange 0 to 5 status 1
7 freq 916600000 drrange 0 to 5 status 1
8 freq 916800000 drrange 0 to 5 status 0
9 freq 917000000 drrange 0 to 5 status 0
10 freq 917200000 drrange 0 to 5 status 0
11 freq 917400000 drrange 0 to 5 status 0
12 freq 917600000 drrange 0 to 5 status 0
13 freq 917800000 drrange 0 to 5 status 0
14 freq 918000000 drrange 0 to 5 status 0
15 freq 918200000 drrange 0 to 5 status 0
16 freq 918400000 drrange 0 to 5 status 0
17 freq 918600000 drrange 0 to 5 status 0
18 freq 918800000 drrange 0 to 5 status 0
19 freq 919000000 drrange 0 to 5 status 0
20 freq 919200000 drrange 0 to 5 status 0
21 freq 919400000 drrange 0 to 5 status 0
22 freq 919600000 drrange 0 to 5 status 0
23 freq 919800000 drrange 0 to 5 status 0
24 freq 920000000 drrange 0 to 5 status 0
25 freq 920200000 drrange 0 to 5 status 0
26 freq 920400000 drrange 0 to 5 status 0
27 freq 920600000 drrange 0 to 5 status 0
28 freq 920800000 drrange 0 to 5 status 0
29 freq 921000000 drrange 0 to 5 status 0
30 freq 921200000 drrange 0 to 5 status 0
31 freq 921400000 drrange 0 to 5 status 0
32 freq 921600000 drrange 0 to 5 status 0
33 freq 921800000 drrange 0 to 5 status 0
34 freq 922000000 drrange 0 to 5 status 0
35 freq 922200000 drrange 0 to 5 status 0
36 freq 922400000 drrange 0 to 5 status 0
37 freq 922600000 drrange 0 to 5 status 0
38 freq 922800000 drrange 0 to 5 status 0
39 freq 923000000 drrange 0 to 5 status 0
40 freq 923200000 drrange 0 to 5 status 0
41 freq 923400000 drrange 0 to 5 status 0
42 freq 923600000 drrange 0 to 5 status 0
43 freq 923800000 drrange 0 to 5 status 0
44 freq 924000000 drrange 0 to 5 status 0
45 freq 924200000 drrange 0 to 5 status 0
46 freq 924400000 drrange 0 to 5 status 0
47 freq 924600000 drrange 0 to 5 status 0
48 freq 924800000 drrange 0 to 5 status 0
49 freq 925000000 drrange 0 to 5 status 0
50 freq 925200000 drrange 0 to 5 status 0
51 freq 925400000 drrange 0 to 5 status 0
52 freq 925600000 drrange 0 to 5 status 0
53 freq 925800000 drrange 0 to 5 status 0
54 freq 926000000 drrange 0 to 5 status 0
55 freq 926200000 drrange 0 to 5 status 0
56 freq 926400000 drrange 0 to 5 status 0
57 freq 926600000 drrange 0 to 5 status 0
58 freq 926800000 drrange 0 to 5 status 0
59 freq 927000000 drrange 0 to 5 status 0
60 freq 927200000 drrange 0 to 5 status 0
61 freq 927400000 drrange 0 to 5 status 0
62 freq 927600000 drrange 0 to 5 status 0
63 freq 927800000 drrange 0 to 5 status 0
64 freq 915900000 drrange 6 to 6 status 0
65 freq 917500000 drrange 6 to 6 status 0
66 freq 919100000 drrange 6 to 6 status 0
67 freq 920700000 drrange 6 to 6 status 0
68 freq 922300000 drrange 6 to 6 status 0
69 freq 923900000 drrange 6 to 6 status 0
70 freq 925500000 drrange 6 to 6 status 0
71 freq 927100000 drrange 6 to 6 status 0
<OK>
Note na resposta acima que o módulo possui 71 canais, porém apenas os 8 canais iniciais (de 0 a 7) estão habilitados ("status 1"). Para a conexão com a rede ATC precisamos apenas que estes canais estejam habilitados, portanto, se algum outro canal de seu módulo estiver habilitado, será necessário desabilitá-lo através do comando AT+CH NÚMERO_CANAL status=0
. O mesmo vale caso você tenha algum dos 8 canais iniciais desabilitados, porém, para habilitá-lo, utilize o comando AT+CH NÚMERO_CANAL status=1
.
Conclusão
Ainda são necessárias diversas configurações do módulo para que possamos nos conectar e enviar a primeira mensagem para a internet usando o IoT DevKit, porém com estas configurações iniciais já podemos avançar com os tutoriais. Posteriormente iremos usar as funções da biblioteca para facilitar a nossa comunicação com o módulo, sem precisar enviar os comandos "AT" manualmente.
Solução de Problenas
Arduino IDE Retornou a Mensagem "#error Use this example with the ESP32"
Esta mensagem é retornada quando o modelo de placa selecionado não está correto, portanto certifique-se que a seleção está para o modelo "ESP32 Dev Module".