我将对EasyMesh的现有实现进行一些修改,因为当前它似乎尚未实现节点角色。每个节点都相等,并且它们只能彼此建立连接。如我所见,无法将服务器添加到其路由表中,也无法标记与服务器具有连接性的表中的特定连接记录。
节点使用连接列表进行消息路由/转发。您需要的是一个具有服务器连接记录的节点,这就是根节点。
现在,当前,当节点通电时,它将扫描可用的AP(接入点),过滤掉不以网状前缀开头的AP,然后以最佳RSSI连接到AP。同样,每个节点都使用名称网格前缀 + 节点唯一的芯片ID创建自己的AP 。
如果没有其他节点可用,它将仅等待其他节点连接。这是应该应用更改的第一点。您可以对唯一的AP进行硬编码或以某种方式进行配置,使其名称类似于网状前缀 + “服务器”,如果没有其他EasyMesh AP可用,则该节点应连接到该AP并meshConnectionType
在其连接列表中存储一个预定义的对象。
该对象的espconn
字段将不会由服务器和节点之间的消息交换来确定,但可以是固定值(字段除外)。应该像在其他情况下一样获取该内容。在以下结构中,您仅需要第一个to成员变量。
struct meshConnectionType {
espconn *esp_conn;
uint32_t chipId = 0;
String subConnections;
timeSync time;
uint32_t lastRecieved = 0;
bool newConnection = true;
(...)
};
该chipId
会是网状网络中的服务器的地址。您应该选择一个不能为ESP8266芯片ID的值。
因此,基本上,您网络中第一个通电的节点将是“根”节点。如果其他节点希望将消息发送到服务器,则将基于间接连接(在代码中称为子连接)记录将消息发送到“根”节点。
然后,“根”节点将发现它与服务器(路由器/互联网)具有直接连接,并且作为对服务器的消息,它应以其他方式(而不是像网格一样)转发此消息。 。显然,这里需要其他信息,例如服务器的IP地址和使用的端口。默认情况下或通过某些配置方法,也应将它们存储在节点上(每个节点上)。
因此,最后,“根”节点将向服务器发送IP消息,这应该由您再次实现。
TL; DR; 结论:
- 应该有一个服务器AP,第一个节点(只有第一个要加电的节点)应该连接到它,这将是根节点。
- 服务器应具有
destId
在将消息发送到服务器时将在网状网络中使用的地址()。默认情况下,此信息应可用于所有节点。
- 根节点应该知道它“直接”连接到服务器/互联网。这可以通过将服务器的连接记录添加
destId
到根节点的连接列表中来实现。
- 知道它已连接到服务器的根节点可以通过Internet适当转发消息。
通过阅读EasyMesh的实现,这只是一个理论上的想法。我可能已经错过了一些重要的事实,这将使这一点难以实施或无法实施。同样,它可能不是解决问题的最有效方法。我不是网状网络专家。
在网络中拥有根节点会询问“如果根断开连接会发生什么?如何选择新的根?”。