Nó raiz da rede de malha ESP8266

11

Estou trabalhando em uma rede de malha baseada no ESP8266 e tudo parece estar funcionando bem usando o código de exemplo do EasyMesh da Coopdis . No seu exemplo, 3 ESP8266 se registram na malha e servem uma interface web simples. Isso está funcionando perfeitamente para mim também.

Na minha solução, no entanto, preciso que um desses nós esteja conectado à Internet para que todo o Mesh possa acessá-lo (ou pelo menos a malha possa ser acessada). Isso também é mencionado na documentação do ESP8266 Mesh User Guid (página 4) da Espressif . Eu também encontrei alguns outros documentos que eles publicam, todos falando sobre isso, pois é normal, mas sem nenhum código de exemplo que eu pudesse entender facilmente.

Como faço para configurar a malha para também conectar-se a um roteador. É tão simples quanto usar a mesma chave SSID e Pass para a rede de malha que estou usando no meu roteador Wi-Fi ou preciso fazer algo como uma parte do Raspberry Pi da malha de Wi-Fi que pode ser conectada ao meu roteador através da conexão Ethernet? Eu não acho que o último deva ser exigido da pesquisa que eu fiz.

Eu preciso do código de exemplo Olá mundo para isso. Os comandos AT não vão me ajudar, eu acho.

Gineer
fonte
11
Em relação ao exemplo dos 3 nós, você também tem uma interface da Web em execução, como a do telefone neste vídeo ?
Bence Kaulics
11
@BenceKaulics Não testei especificamente desde que fiz isso antes e isso não é um problema para mim. Por que você pergunta? Eu estava pensando que essa poderia ser uma opção de fallback, onde um "Servidor" poderia simplesmente acessar a rede Mesh através de chamadas REST hospedadas na malha, mas estou intrigado com a opção ROOT NODE, que soa como a arquitetura correta (IMHO).
Gineer
11
Eu vejo. Eu estava pensando o mesmo que pode ser uma opção alternativa para acessar sua rede. Não sugerindo como solução, porém, apenas um comentário sobre o que era. Eu não sabia que você já pensou nisso. ;)
Bence Kaulics

Respostas:

6

Outra opção para a malha fácil é usar o painlessMesh da BlackEdder e introduzir uma ponte para os dados para o mundo exterior.

Há um problema na conexão com outra rede a partir de uma malha no indolorMesh gitlab que explica quatro soluções diferentes. As soluções talvez funcionem também no easyMesh, porque o problema foi levantado inicialmente lá, mas com certeza no painlessMesh.

Eu olhei para eles e as soluções mais funcionais precisavam de dois dispositivos extras na malha para lidar com a conexão real com a rede externa.

O primeiro apresentaria o quarto esp8266 para o seu projeto. Ele seria conectado à Internet e se comunicaria com um de nossos nós via conexão serial.

Outro seria usar um dispositivo Raspberry PI para coletar os dados e conectar-se a outro cartão wifi em outra rede.

Os outros dois não eram bons, um foi desencorajado pelo autor e outro tão complicado e limitado pelo esp8266 que eu não tentaria.

O guia inteiro no gitlab .

mico
fonte
5

Eu modificaria um pouco a implementação existente do EasyMesh, pois atualmente ele não parece implementar funções de nó. Cada nó é igual e eles podem construir conexões apenas entre si. Pelo que vejo, não há como adicionar um servidor às suas tabelas de roteamento nem marcar um registro de conexão específico nas tabelas que possuem conectividade com um servidor.

Os nós usam uma lista de conexões para encaminhamento / encaminhamento de mensagens. O que você precisa é de um nó que tenha um registro de conexão para o servidor, é isso que é o nó raiz.

Agora, atualmente, quando um nó é ligado, ele verifica os pontos de acesso disponíveis (pontos de acesso), filtra aqueles que não começam com o prefixo de malha e, em seguida, se conecta ao ponto de acesso com o melhor RSSI. Além disso, cada nó cria seu próprio AP com um prefixo de malha de nome + ID de chip exclusivo do nó .

Se nenhum outro nó estiver disponível, ele simplesmente aguardará a conexão de outras pessoas. E este é o primeiro ponto em que as mudanças devem ser aplicadas. Você pode codificar ou tornar de alguma forma configurável um AP exclusivo com um nome como prefixo de malha + "Servidor" e, se nenhum outro EasyMesh AP estiver disponível, o nó deve se conectar a esse AP e armazenar um meshConnectionTypeobjeto predefinido em sua lista de conexões.

O objeto arquivado não será determinado pela troca de mensagens entre o servidor e o nó, mas poderá ter valores fixos, exceto o espconncampo. Esse deve ser adquirido como nos outros casos. Na estrutura a seguir, você precisará apenas da primeira variável de membro.

struct meshConnectionType {
    espconn             *esp_conn;
    uint32_t            chipId = 0;
    String              subConnections;
    timeSync            time;
    uint32_t            lastRecieved = 0;
    bool                newConnection = true;

    (...)
};

O chipIdserá o endereço do servidor na rede mesh. Você deve escolher um valor que não possa ser um ID de chip ESP8266.

Então, basicamente, o primeiro nó a ligar na sua rede será o nó "raiz". Se outros nós quiserem enviar mensagens para o servidor, a mensagem será enviada para o nó "raiz" com base nos registros de conexão direta (denominada sub-conexão no código).

O nó "raiz" descobrirá que possui conexão direta com o servidor (para o roteador / internet) e como é uma mensagem para o servidor que deve encaminhar essa mensagem de outra maneira (não como uma malha) . Obviamente, são necessárias informações adicionais aqui, como o endereço IP do servidor e a porta usada, por exemplo. Eles também devem ser armazenados no nó (em todos os nós) por padrão ou por algum método de configuração.

Por fim, o nó "raiz" envia uma mensagem IP para o servidor, que deve ser implementada por você novamente.


TL; DR; Conclusão:

  • Deve haver um servidor AP e o primeiro nó (apenas o primeiro nó a ser ligado) deve conectar-se a ele; este será o nó raiz.
  • O servidor deve ter um endereço ( destId) que será usado na rede mesh ao enviar mensagens para o servidor. Esta informação deve estar disponível para todos os nós por padrão.
  • O nó raiz deve saber que está conectado "diretamente" ao servidor / internet. Isso pode ser conseguido adicionando um registro de conexão com o servidor destIdà lista de conexões do nó raiz.
  • O nó raiz, sabendo que está conectado ao servidor, pode encaminhar as mensagens adequadamente pela Internet.

Essa é apenas uma idéia teórica que eu lembro através da implementação do EasyMesh. Posso ter perdido algum fato importante que tornaria isso difícil ou impossível de implementar. Também pode não ser a maneira mais eficiente de resolver o problema. Eu não sou um especialista em redes de malha.

Ter um nó raiz na rede pergunta "O que acontecerá se a raiz for desconectada? Como uma nova raiz será escolhida?".

Bence Kaulics
fonte