Por Fernando Koyanagi 1
Intenção dessa aula 1. Mudança de frequência 2. Demonstrar um programa que modifica a frequência 3. Protocolo LoRaWan 4. Rádio Lora 5. Criptografia LoRaWan
Objetivo Nosso objetivo será criar um projeto no qual teremos dois ESP32 Lora se comunicando, e a cada vez que pressionarmos um botão que estará ligado ao EMISSOR, ele mudará a freqüência de comunicação, avisando através do pacote ao RECEPTOR para também mudar a freqüência mantendo assim a comunicação entre eles. //array de frequências válidas que utilizaremos para trocar long frequencia[6] = {915000000, 915125000, 868000000, 868125000, 433000000, 433125000; 3
LoRa - LoRaWAN - e as Frequências
Quando eu uso ESP32 Lora? media access control (MAC)
Criptografia LoRaWan LoRaWAN conhece três chaves de segurança distintas de 128 bits. A chave da aplicação AppKey só é conhecida pelo dispositivo e pelo aplicativo. Quando um dispositivo se une à rede (isto é chamado de associação ou ativação), uma chave de sessão de aplicativo AppSKey e uma chave de sessão de rede NwkSKey são geradas. O NwkSKey é compartilhado com a rede, enquanto o AppSKey é mantido em privado. Estas chaves de sessão serão usadas durante a duração da sessão. A figura ao lado mostra como essas chaves são usadas. O AppSKey é usado para criptografia de ponta a ponta da carga útil do quadro. O algoritmo usado para isso é AES-128, semelhante ao algoritmo usado no padrão 802.15.4. O NwkSKey conhecido é conhecido pela rede e pelo dispositivo e é usado para validar a integridade de cada mensagem pelo seu Código de integridade da mensagem (MIC). Este MIC é semelhante a uma soma de verificação, exceto que impede a adulteração intencional de uma mensagem. Para isso, o LoRaWAN usa AES-CMAC. https://www.thethingsnetwork.org/wiki/lorawan/home#lorawan_frequency-bands_china-779-787-mhz-and-470-510-mhz
LoRa - LoRaWAN - e as Frequências Site: www.teleco.com.br Frequências: Estados Unidos : 902-928 mhz Austrália : 915-928 mhz China : 779-787 e 470-510 mhz Europa : 863-870 e 433 mhz Brasil : 902-928 mhz No Brasil, a administração de frequências está sob a responsabilidade da Anatel. Para o caso brasileiro, a Anatel regulamentou a banda de 900 MHz para operação GSM conforme o esquema acima: Brasil USA 902 mhz 907,5 mhz 915 mhz 5,5 mhz 40 canais 7,5 mhz 13 mhz 64 canais 928 mhz Valido para a data de 15/02/2018 mas pode sofrer alteração conforme resolução da Anatel A ultima foi Resolução nº 680, de 27 de junho de 2017
Quando eu uso ESP32 Lora? 1) Precisa de velocidade tempo de resposta 2) Não quer pagar mensalidade ou tráfego 3) Não existe cobertura pública de gateways 4) Aplicação específica ex: Controle remoto 5) Sensores exóticos incompatíveis com hardware padrão Devem existir muitos mais motivos que apenas não me lembro agora.
Em www.fernandok.com Download dos arquivos PDF e.ino
Lora Esp32 Oled 10
Montagem 11
Bibliotecas Adicione a seguinte biblioteca Adafruit SSD1306. Basta acessar Sketch >> Incluir Bibliotecas >> Gerenciar Bibliotecas...
Programas Pacote : Sender Receiver byte 0: índice de frequência byte 1: # delimitador byte 2: unsigned int byte 3: unsigned int Criaremos 2 programas, um para o ESP32 Lora que trabalhará como EMISSOR e outro programa para o ESP32 Lora que trabalhará como RECEPTOR. //array de frequências válidas que utilizaremos para trocar long frequencia[6] = {915000000, 915125000, 868000000, 868125000, 433000000, 433125000; 13
Programa EMISSOR O programa EMISSOR ficará configurado para iniciar na freqüência 915Mhz e ficar enviando pacotes. A cada vez que o botão ligado a ele for pressionado, a freqüência mudará e um comando será enviado para o RECEPTOR mudar também. 14
Programa EMISSOR Sender #include <SPI.h> #include <LoRa.h> #include <Wire.h> #include "SSD1306.h //pino Botão #define PIN_BTN 23 //pino LED #define PIN_LED 22 // Pin definetion of WIFI LoRa 32 // HelTec AutoMation 2017 support@heltec.cn #define SCK 5 // GPIO5 -- SX127x's SCK #define MISO 19 // GPIO19 -- SX127x's MISO #define MOSI 27 // GPIO27 -- SX127x's MOSI #define SS 18 // GPIO18 -- SX127x's CS #define RST 14 // GPIO14 -- SX127x's RESET #define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request) #define PABOOST true //array de frequencias válidas que utilizaremos para trocar long frequencia[6] = {915000000, 915125000, 868000000, 868125000, 433000000, 433125000; //controla o indice da frequencia atual no array int indice = 0; unsigned int counter = 0; //um contador que servirá como dado para envio //armazenam estado do botão int estadobtn, ultimoestadobtn; SSD1306 display(0x3c, 4, 15); 15
Setup LoRa.begin(frequencia[indice],PABOOST) void setup() { pinmode(16,output); pinmode(2,output); // display OLED do Lora // Led interno do ESP32 Serial.begin(115200); pinmode(pin_btn, INPUT); pinmode(pin_led, OUTPUT); digitalwrite(16, LOW); // set GPIO16 low to reset OLED delay(50); digitalwrite(16, HIGH); // while OLED is running, must set GPIO16 in high display.init(); display.flipscreenvertically(); display.setfont(arialmt_plain_10); delay(1500); display.clear(); SPI.begin(SCK,MISO,MOSI,SS); LoRa.setPins(SS,RST,DI00); if (!LoRa.begin(frequencia[indice],PABOOST)) { display.drawstring(0, 0, "Starting LoRa failed!"); display.display(); while (1); LoRa.enableCrc(); // Por default é desativado display.drawstring(0, 0, "LoRa Initial success!"); display.display(); delay(1000); //define estado do botao como desligado estadobtn = ultimoestadobtn = LOW; digitalwrite(pin_led, LOW); 16
Loop void loop() { //recupera o estado do botao estadobtn = digitalread(pin_btn); //verifica se o estado do botão mudou e se mudou para LIGADO if( (estadobtn!= ultimoestadobtn) && (estadobtn == HIGH) ) { //liga o LED indicador de mudança de frequencia digitalwrite(pin_led, HIGH); //verificação para não estourar o indice do array if( (indice+1) > 5){ indice = 0; else { indice++; enviarpacote(); atualizardisplay(); mudarfrequencia(); // avisa que mudou frequência //caso nao tenha apertado o botão, ou seja, seu estado é DESLIGADO, então a frequencia permanece a mesma else { enviarpacote(); atualizardisplay(); //contador que é enviado (DADO) counter++; //copia o estado atual do botão na variável de verificação da mudança de estado ultimoestadobtn = estadobtn; //acende LED interno para indicar que enviou o pacote e da um delay digitalwrite(2, HIGH); delay(700); digitalwrite(2, LOW); delay(500); 17
mudarfrequencia e enviarpacote //muda a frequencia do Lora, a nova frequencia será de acordo com a variável "INDICE" //que pegará no array a nova frequencia void mudarfrequencia(){ if (!LoRa.begin(frequencia[indice],PABOOST)) { display.drawstring(0, 0, "Starting LoRa failed!"); display.display(); while (1); LoRa.enableCrc(); digitalwrite(pin_led, LOW); //desliga o LED indicador da mudança de frequência //envia o pacote na rede Lora void enviarpacote() { // envia um pacote LoRa.beginPacket(); LoRa.print(indice); //indice do array que contem as frequencias LoRa.print("#"); //delimitador LoRa.print(counter); //dado LoRa.endPacket(); 18
atualizardisplay //atualiza as informações no display void atualizardisplay() { display.clear(); display.settextalignment(text_align_left); display.setfont(arialmt_plain_10); display.drawstring(0, 0, "Enviando Pacote: "); display.drawstring(90, 0, String(counter)); display.drawstring(0, 20, String(frequencia[indice])); display.drawstring(90, 20, "I: "+String(indice)); display.display(); 19
Programa RECEPTOR O programa RECEPTOR ficará configurado para iniciar na freqüência 915Mhz e a cada pacote recebido, verificará se o comando para mudança de freqüência está presente para se reconfigurar. 20
#include <SPI.h> #include <LoRa.h> #include <Wire.h> #include "SSD1306.h Programa RECEPTOR // Pin definetion of WIFI LoRa 32 // HelTec AutoMation 2017 support@heltec.cn #define SCK 5 // GPIO5 -- SX127x's SCK #define MISO 19 // GPIO19 -- SX127x's MISO #define MOSI 27 // GPIO27 -- SX127x's MOSI #define SS 18 // GPIO18 -- SX127x's CS #define RST 14 // GPIO14 -- SX127x's RESET #define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request) #define PABOOST true //array de frequencias válidas que utilizaremos para trocar long frequencia[6] = {915000000, 915125000, 868000000, 868125000, 433000000, 433125000; //controla o indice da frequencia atual no array int indice = 0; SSD1306 display(0x3c, 4, 15); String rssi = "RSSI --"; String packsize = "--"; String packet ; 21
Setup void setup() { pinmode(16,output); pinmode(2,output); digitalwrite(16, LOW); // set GPIO16 low to reset OLED delay(50); digitalwrite(16, HIGH); // while OLED is running, must set GPIO16 in high display.init(); display.flipscreenvertically(); display.setfont(arialmt_plain_10); delay(1500); display.clear(); SPI.begin(SCK,MISO,MOSI,SS); LoRa.setPins(SS,RST,DI00); if (!LoRa.begin(frequencia[indice],PABOOST)) { display.drawstring(0, 0, "Starting LoRa failed!"); display.display(); while (1); LoRa.enableCrc(); display.drawstring(0, 0, "LoRa Initial success!"); display.drawstring(0, 10, "Wait for incomm data..."); display.display(); delay(1000); LoRa.receive(); 22
Loop e parserpacket void loop() { int packetsize = LoRa.parsePacket(); //imprime na tela a frequencia atual que está configurada display.drawstring(0,45,"freq: "+String(frequencia[indice])); display.display(); if (packetsize) { parserpacket(packetsize); //faz o parser do pacote recebido para tratar os dados void parserpacket(int packetsize) { packet =""; packsize = String(packetSize,DEC); // transforma em decimal for (int i = 0; i < packetsize; i++) { packet += (char) LoRa.read(); // lê byte a byte rssi = "RSSI " + String(LoRa.packetRssi(), DEC) ; // Valor em dbm verificafrequencia(); loradata(); 23
verificarfrequencia e loradata //verifica se no pacote recebido tem um comando para trocar de frequencia void verificafrequencia(){ //o primeiro byte do pacote tem o indice da frequencia que o emissor está usando, // colocamos esse valor em CMD para fazeras verificações String cmd = String(packet.charAt(0)); //se o indice recebido é diferente do atual, então trocamos a frequencia if(cmd.toint()!= indice) { if (!LoRa.begin(frequencia[cmd.toInt()],PABOOST)) { display.drawstring(0, 0, "Starting LoRa failed!"); display.display(); while (1); indice = cmd.toint(); LoRa.enableCrc(); //coloca os dados recebidos no display void loradata(){ display.clear(); display.settextalignment(text_align_left); display.setfont(arialmt_plain_10); display.drawstring(0, 15, "Received "+ packsize + " bytes"); display.drawstringmaxwidth(0, 26, 128, packet); display.drawstring(0, 0, rssi); display.display(); 24
Em www.fernandok.com Seu e-mail 25