我会稍微修改一下 EasyMesh 的现有实现,因为目前它似乎没有实现节点角色。每个节点都是平等的,它们只能相互建立连接。正如我所见,无法将服务器添加到他们的路由表中,也无法在与服务器连接的表中标记特定的连接记录。
节点使用连接列表进行消息路由/转发。您需要的是一个具有服务器连接记录的节点,这就是根节点。
现在,当前当节点通电时,它将扫描可用的 AP(接入点),过滤掉那些不以网状前缀开头的 AP,然后连接到具有最佳 RSSI 的 AP。此外,每个节点都使用名称网格前缀+节点唯一芯片 ID创建自己的 AP 。
如果没有其他节点可用,它将简单地等待其他节点连接。这是应该应用更改的第一点。您可以硬编码或以某种方式配置一个唯一的 AP,其名称类似于网状前缀+ “服务器”,如果没有其他 EasyMesh AP 可用,则节点应连接到该 AP 并应meshConnectionType
在其连接列表中存储一个预定义的对象。
该对象的espconn
字段不会由服务器和节点之间的消息交换决定,但可以是固定值,字段除外。应该像在其他情况下一样获得那个。在以下结构中,您只需要第一个成员变量。
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; 博士; 结论:
- 应该有一个服务器 AP 并且第一个节点(只有第一个上电的节点)应该连接到它,这将是根节点。
- 服务器应该有一个地址 (
destId
),当向服务器发送消息时,该地址将在网状网络中使用。默认情况下,此信息应可供所有节点使用。
- 根节点应该知道它“直接”连接到服务器/互联网。这可以通过将与服务器的连接记录添加
destId
到根节点的连接列表来实现。
- 知道它连接到服务器的根节点可以通过 Internet 适当地转发消息。
这只是我通过阅读 EasyMesh 的实现得出的一个理论想法。我可能错过了一些重要的事实,这会使这很难或不可能实现。它也可能不是解决问题的最有效方法。我不是网状网络专家。
在网络中有一个根节点会问“如果根断开连接会发生什么?如何选择新的根?”。