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 meshConnectionType
objeto 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 espconn
campo. 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 chipId
será 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?".