ESP8266 Mesh 网络根节点

物联网 ESP8266 网状网络
2021-05-31 00:26:42

我正在研究基于 ESP8266 的网状网络,使用Coopdis 的 EasyMesh示例代码似乎一切正常在他/她的示例中,3 个 ESP8266 注册到网格中并提供一个简单的 Web 界面。这对我来说也很完美。

但是,在我的解决方案中,我需要将这些节点之一连接到互联网,以便整个网格都可以访问它(或者至少可以访问网格)。EspressifESP8266 Mesh 用户指南文档(第 4 页)中也提到了这一点我还发现他们发布的一些其他文档都在谈论这个,因为这很正常,但没有任何我可以轻松理解的示例代码。

如何将网格配置为也连接到路由器。是像我在 Wi-Fi 路由器上使用的那样为网状网络使用相同的 SSID 和 Pass 密钥一样简单,还是我需要制作 Wi-Fi 网状网络的 Raspberry Pi 部分之类的东西,然后才能连接通过以太网连接到我的路由器?不过,我认为我所做的研究不应该要求后者。

为此,我需要 hello world 示例代码。我认为AT 命令不会帮助我。

2个回答

另一个简单网格的选择是使用 BlackEdder 的 painlessMesh 并在那里引入一个将数据传输到外部世界的桥梁。

在painlessMesh gitlab 中从网格连接到其他网络时存在一个问题,该问题解释了四种不同的解决方案。解决方案可能也适用于 easyMesh,因为问题最初是在那里提出的,但肯定是在 painlessMesh 中。

我查看了它们,最有效的解决方案需要两个额外的设备到网格来处理与外部网络的实际连接。

第一个将为您的项目引入第四个 esp8266。它将连接到 Internet 并通过串行连接与您的节点之一进行通信。

另一种方法是使用 Raspberry PI 设备收集数据并使用另一张 wifi 卡连接到其他网络。

其他两个不好,一个被作者劝阻,另一个是esp8266的复杂和限制,我不会尝试。

gitlab 中的整个指南

我会稍微修改一下 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 的实现得出的一个理论想法。我可能错过了一些重要的事实,这会使这很难或不可能实现。它也可能不是解决问题的最有效方法。我不是网状网络专家。

在网络中有一个根节点会问“如果根断开连接会发生什么?如何选择新的根?”。