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.
-
Clonar este repositório:
$ git clone https://github.com/daeynasvistas/LoRa-Mesh/
-
Utilizar VisualStudio Code (PlatformIO):
2.1. pode abrir pasta ESP32 e pasta Arduino em projectos separados.
- Todos os Nodes dispõem de um ID único (EEPROM)
- 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"};
- Cada Node envia em BroadCast a sua tabela de Vizinhos a cada 10 mensagens recebidas
if(msgCount>10)
{
message = sendTable();
sendMessage(message, 255);
- 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);
- É 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;
}
- É 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);
}
Para configurar deve alterar main.cpp e incluir sensores que predende utilizar. ESP32 inclui libraria para BME e Arduino para DHT11
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("");
}
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
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