Skip to content

Mestrado Computação Móvel 2018/19: Implementação de uma rede MESH LoRa para a recolha de diversos sensores em múltiplos Nodes sem acesso à internet; na Disciplina de Redes de sensores IPG MCM 2019

Notifications You must be signed in to change notification settings

daeynasvistas/LoRa-Mesh

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 

Repository files navigation

IPG MCM 2018/19

LoRa-Mesh

Uma rede mesh é essencialmente caracterizada por uma tipologia em que todos os nós da infraestrutura de rede comunicam diretamente entre eles, de forma dinâmica, sem ter em conta qualquer hierarquicamente. Assim, os nós cooperam uns com os outros, de forma a rotear os dados de forma eficiente. Essa falta de dependência entre nós permite que cada um participe na transmissão e receção de informação entre eles. As redes em mesh, podem-se organizar de forma dinâmica, através da capacidade que possuem em se autoconfiguração, permitindo a distribuição dinâmica de fluxos de informação, principalmente em situações de falhas num desses nós.

66425186_342349106659933_6656448965128486912_n

Como instalar

  1. Clonar este repositório: $ git clone https://github.com/daeynasvistas/LoRa-Mesh/

  2. Utilizar VisualStudio Code (PlatformIO):

    2.1. pode abrir pasta ESP32 e pasta Arduino em projectos separados.

Como funciona

  1. Todos os Nodes dispõem de um ID único (EEPROM)
  2. Ao iniciar, é verificado se o Node é SINk (dispõe de acesso à Internet) ou não
// Este node e servidor
// 0 = Servidor internet
// 1 = Vizinho de servidor internet
// 2 = Vizinho com um Vizinho de um servidor internet 
byte isServer = getIsServer();
String nodeFunction[4] = {"SINK","ESTRADA","CAMINHO","SOLTEIRO"};
  1. Cada Node envia em BroadCast a sua tabela de Vizinhos a cada 10 mensagens recebidas
     if(msgCount>10)
    {
      message = sendTable();
      sendMessage(message, 255);
  1. Ao receber a Tabela é verificado se na mesma existe algum SINK (identificado no broadcast Como ID=0)
     if(msgCount>10)
    {
      message = sendTable();
      sendMessage(message, 255);
  1. É guardada a Tabela de SINK's conhecidas em cada node e conhecida por cada vizinho
String nodeFunction[4] = {"SINK","ESTRADA","CAMINHO","SOLTEIRO"};
  // Posicionamento dos servidores na mesh
   switch (incomingMsgHand) {
   case 0:
       // statements
        if(!arrayIncludeElement(myServers,sender,maxTableArrayServers)){
           Serial.println("Encontrei um SINK! "+sender);
           arrayAddElement(myServers,sender,maxTableArrayServers);
           display.drawString(0, 32, "NOVO: " + String(sender)); 
        }
      destination = sender;
      break;
   case 1:
       // statements
        if(!arrayIncludeElement(myNeighbours,sender,maxTableArrayVizinhos)){
           Serial.println("Encontrei AUTOESTRADA para SINK! "+sender);
           arrayAddElement(myNeighbours,sender,maxTableArrayVizinhos);
           display.drawString(0, 32, "NOVO: " + String(sender)); 
        }
        if(isServer!=0){
          destination = sender;
        }
       break;
   case 2:
       // statements
       Serial.println("Encontrei CAMINHO para SINK!");
       break;       
   default:
       // statements
       break;
   } 
  1. É sempre enviado um JSON com valores dos sensores recolhidos para o vizinho mais perto de um SINK
        }else{
           // enviar para mais próximo do SINK
           destination = myNeighbours[0];
           sendMessage(message, destination);
        }

Configuração

Para configurar deve alterar main.cpp e incluir sensores que predende utilizar. ESP32 inclui libraria para BME e Arduino para DHT11

método makeDate()

O projeto utiliza a libraria #include <ArduinoJson.h> para construir o JSON que é enviado em cada Node, incluia ou altere os que pretender.

void makeData(){
// add some values
array.add(MAC); //<- Lora MAC
array.add(1556969160); //<-- Timestamp
array.add(bme.readTemperature());
array.add(bme.readHumidity());
array.add(bme.readPressure() / 100.0F);
array.add(0);
array.add(0);
array.add(0);
array.add(0);
array.add(0);
array.add(0);

 // serialize the array and send the result to Serial
// serialize the array and send the result to Serial
 serializeJson(doc, Values);
 serializeJson(doc, Serial);
 Serial.println("");
}

valor máximo de Nodes e Sink

32 como máximo na tabela de vizinhos .. ou simplesmente alterar parra array dinámico

byte const maxTableArrayVizinhos = 32; // quantidade de vizinhos pode ser aumentada conform memoria dispo
byte myNeighbours[maxTableArrayVizinhos] = {}; // address of vizinhos directos

byte const maxTableArrayServers = 4; // quantidade de servidores ao qual tenho acesso pode ser aumentada
byte myServers[maxTableArrayServers]     = {}; // address dos servidores que encontrei

Resultado

Este é o resultado com Serial.Print no Node SINK, onde todos os valores dos sensores de todos os Nodes chegam. O node Sink é responsável por enviar o JSON... por Lora (gateway), por MQTT ou pelo método que preferir

Descoberta de um node (187)

777777

Descoberta de um node (170)

8888

Recolha dos valores de todos os Nodes

99999

SINK a recolher valores dos Vizinhos

21121212 50

Resultado ESP32

11111 44444 222222 55555

Desenvolvimento

32131231 43423423 42434

About

Mestrado Computação Móvel 2018/19: Implementação de uma rede MESH LoRa para a recolha de diversos sensores em múltiplos Nodes sem acesso à internet; na Disciplina de Redes de sensores IPG MCM 2019

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages