Вы находитесь на странице: 1из 25

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:

902 mHz 907,5 mHz 915 mHz 928 mHz


Brasil 5,5 mHz 40 canais 7,5 mHz 13 mHz

USA 64 canais

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); // display OLED do Lora
pinMode(2,OUTPUT); // 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
void loop() {

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(); // avisa que mudou frequência
atualizarDisplay();
mudarFrequencia();
}
//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
Programa RECEPTOR
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include "SSD1306.h“

// 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
Seu e-mail
Em www.fernandok.com

25