ESP8266 Mesh网络根节点


11

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

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

如何配置网状网络以也连接到路由器。它像在Wi-Fi路由器上使用相同的SSID和Pass密钥一样简单吗?还是需要将Wi-Fi网格的Raspberry Pi做成一部分,然后再进行连接通过以太网连接到我的路由器?我认为我完成的研究不应该要求使用后者。

我需要这个世界的示例代码。我认为,AT命令不会帮助我。


1
关于3个节点的示例,您是否也已建立并运行Web界面,就像本视频中的电话界面一样?
Bence Kaulics '17

1
@BenceKaulics我之前没有做过专门的测试,这对我来说不是问题。你为什么要问?我当时以为这可能是一个后备选项,其中“服务器”可以仅通过承载在网格上的REST调用简单地访问Mesh网络,但是我对ROOT NODE选项很感兴趣,这听起来像是正确的体系结构(IMHO)。
Gineer '17

1
我知道了。我一直在想,它可以作为访问网络的另一种选择。但是,没有建议作为解决方案,因此仅是注释。我不知道您已经考虑过了。;)
Bence Kaulics

Answers:


6

轻松网格的另一种选择是使用BlackEdder的painlessMesh,并在那里引入将数据交换到外部世界的桥梁。

从lesslessMesh gitlab中的网格连接到其他网络存在一个问题,解释了四种不同的解决方案。解决方案也许也可以在easyMesh中使用,因为最初是在该问题上提出的,但是可以肯定的是,它可以在painlessMesh中进行。

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

第一个为您的项目介绍第四个esp8266。它会连接到Internet并通过串行连接与您的一个节点通信。

另一个可能是使用Raspberry PI设备来收集数据并与另一个wifi卡连接到其他网络。

其他两个都不是很好,一个被作者劝阻,另一个则由于esp8266太复杂和有限而无法尝试。

整个指南在gitlab中


5

我将对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的实现,这只是一个理论上的想法。我可能已经错过了一些重要的事实,这将使这一点难以实施或无法实施。同样,它可能不是解决问题的最有效方法。我不是网状网络专家。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.