ESP8266的网状网络(Mesh Network)

原文链接:https://yq.aliyun.com/articles/634515

网状网络(Mesh Network)是一种在网络节点间透过动态路由的方式来进行资料与控制指令的传送。这种网络可以保持每个节点间的连线完整,当网络拓扑中有某节点失效或无法服务时,这种架构允许使用“跳跃”的方式形成新的路由后将讯息送达传输目的地。

在网状网络中,所有节点都可与拓扑中所有节点进行连线而形成一个“局域网络”。网状网络与一般网络架构的差异处在于,所有节点可以透过多次跳跃进行数据通信,但它们通常不是移动式装置。网状网络可以视为是一种点对点的架构。移动式点对点网络与网状网络在架构上是非常相似的,只是移动式点对点网络还必须随时更新组态以因应各节点移动的情形。

网状网络自我调校机制:即使在拓扑中有节点无法服务或过于忙碌,网络还是可以正常运作。因而形成一个高度可信赖的网络架构。这种架构适用于无线网络、有线网络甚至是软件架构。

当一个节点启动时(绿色LED灯亮),所有节点会定时收集广播讯息来决定拓扑的形成。另外,当一个节点失效时,原本透过此节点进行通信的路径会重新找一条替代路径,因此网络可以保持连接性不被中断。无线网络是网状网络最典型的应用,无线网状网络无线最初是军事用途,但在近十年来已历经重大的改进。

无线网状网络至今已历经三代的进化,每次反复的演进都提供了更好的可靠度以及多样的功能。随着无线电的成本快速下降,单一频段的无线网状网络节点产品逐步发展成可支援多频段,利用额外的无线电波提供额外的功能-例如:客户端存取、后置网络(最后一哩)或在行动应用中扫描信道以提供快速的信号切换。网状网络节点的设计也逐渐模组化-一个可以支援多张复合频段网卡的盒子-每张网卡可以在不同的频率下运作。因此,第三代的网状网络技术赋予了一套全新的应用。包括了即时的影像监控、边界安全或语音通信。

网状网络拓扑结构

实例

网状网络有可能由固定或是移动装置所构成,所以实际的解决方案也会因为通信环境所改变。VoIP是网状网络的应用之一,借由相关QoS机制可以让语音分组尽速在网状网络中传递。 某些近期的应用如下:

  1. 美军已经使用无线网状网络去连接在战场上的军用电脑,这可以让军队知道每一个军人的位置,这样就可以加强军队协同行动的能力。
  2. 某些城市已经在安装电子水表或是电表,这些水表或电表可以一个接着一个传送他们的读数直到水电公司,如此就不需要额外抄表人员或是另外安装电缆线传送数据。
  3. 学生可以持有具有网状网络路由器功能的笔记型电脑,这样学生间不仅可以交换档案,也可以透过其他具有网络连线能力的人连上互联网。
  4. 由66颗卫星组成的[铱卫星]系统本身就是一个网状网络系统,相邻的铱卫星会互相连接成网状拓普。一通电话会经由铱卫星网状网络路由通往目的端,完全不需要地面通信站的协助,这样减少了传输距离也减少了通信延迟。
esp8266-station

Mesh网络的优势

与传统的WLAN相比,无线Mesh网络具有几个无可比拟的优势:

1.快速部署和易于安装。 安装Mesh节点非常简单,将设备从包装盒里取出来, 接上电源就行了。由于极大地简化了安装,用户可以很容易增加新的节点来扩大无线网络的覆盖范围和网络容量。在无线Mesh网络中,不是每个Mesh节点都 需要有线电缆连接,这是它与有线AP最大的不同。 Mesh的设计目标就是将有线设备和有线AP的数量降至最低,因此大大降低了总拥有成本和安装时间,仅这一点带来的成本节省就是非常可观的。无线Mesh 网络的配置和其他网管功能与传统的WLAN相同,用户使用WLAN的经验可以很容易应用到Mesh网络上。
2.非视距传输(NLOS)。利用无线Mesh技术可以很容易实现NLOS配 置,因此在室外和公共场所有着广泛的应用前景。与发射台有直接视距的用户先接收无线信号,然后再将接收到的信号转发给非直接视距的用户。按照这种方式,信 号能够自动选择最佳路径不断从一个用户跳转到另一个用户,并最终到达无直接视距的目标用户。这样,具有直接视距的用户实际上为没有直接视距的邻近用户提供 了无线宽带访问功能。无线Mesh网络能够非视距传输的特性大大扩展了无线宽带的应用领域和覆盖范围。
3.健壮性。实现网络健壮性通常的方法是使用多路由器来传输数据。如果某个路由 器发生故障,信息由其他路由器通过备用路径传送。E-mail就是这样一个例子,邮件信息被分成若干数据包,然后经多个路由器通过Internet发送, 最后再组装成到达用户收件箱里的信息。Mesh网络比单跳网络更加健壮,因为它不依赖于某一个单一节点的性能。在单跳网络中,如果某一个节点出现故障,整 个网络也就随之瘫痪。而在Mesh网络结构中,由于每个节点都有一条或几条传送数据的路径。如果最近的节点出现故障或者受到干扰,数据包将自动路由到备用 路径继续进行传输,整个网络的运行不会受到影响。
4.结构灵活。在单跳网络中,设备必须共享AP。如果几个设备要同时访问网络,就可能产生通信拥塞并导致系统的运行速度降低。而在多跳网络中,设备可以通过不同的节点同时连接到网络,因此不会导致系统性能的降低。Mesh网络还提供了更大的冗余机制和通信负载平衡功能。在无线Mesh网络中,每个设备都有多个传输路径可用,网络可以根据每个节点的通信负载情况动态地分配通信路由,从而有效地避免了节点的通信拥塞。而目前单跳网络并不能动态地处理通信干扰和接入点的超载问题。
5.高带宽。无线通信的物理特性决定了通信传输的距离越短就越容易获得高带宽,因为随着无线传输距离的增加,各种干扰和其他导致数据丢失的因素随之增加。因此选择经多个短跳来传输数据将是获得更高网络带宽的一种有效方法,而这正是Mesh网络的优势所在。

在Mesh网络中,一个节点不仅能传送和接收信息,还能充当路由器对其附近节点转发信息,随着更多节点的相互连接和可能的路径数量的增加,总的带宽也大大增加。

此外,因为每个短跳的传输距离短,传输数据所需要的功率也较小。既然多跳网络通常使用较低功率 将数据传输到邻近的节点,节点之间的无线信号干扰也较小,网络的信道质量和信道利用效率大大提高,因而能够实现更高的网络容量。比如在高密度的城市网络环 境中,Mesh网络能够减少使用无线网络的相邻用户的相互干扰,大大提高信道的利用效率。

Mesh网络在IoT领域的意义

在前面说了一大堆的理论,那Mesh网络到底对于IoT的应用有何意义呢?

首先,我们现在普遍的WIFI都是有距离限制的,这个距离是由连接节点与路由器之间的距离所决定的。现在延长这种传输距离的办法主要有两种:

  1. 用大功率的能穿墙的路由器(形成星型网)
  2. 在主路由器与节点之间的有效距离内增加中继器(AP) (形成树型网)

但这些做法都要求接入到网络的设备必须先连接到路由器或者中继器中。换一个说法,如果用ESP8266来举例的话就是说你的ESP8266必须先执行以下的代码:

void setup() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

只有WIFI连接上获取了IP地址后我们才能通过TCP/IP的方式与其它的节点进行通信。

思考:如果我们的环境内没有路由器呢?两个ESP8266之间能愉快地通信吗?

答案是:能!

ESP8266 实现的Mesh Node

将以下的程序分别写入两个不同的ESP8266,然后在两台机器上通过串口分别连接ESP8266并打开串口监视器。

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMesh.h>

unsigned int request_i = 0;
unsigned int response_i = 0;

String manageRequest(String request);

/* Create the mesh node object */
ESP8266WiFiMesh mesh_node = ESP8266WiFiMesh(ESP.getChipId(), manageRequest);

/**
 * Callback for when other nodes send you data
 *
 * @request The string received from another node in the mesh
 * @returns The string to send back to the other node
 */
String manageRequest(String request)
{
    /* Print out received message */
    Serial.print("received: ");
    Serial.println(request);

    /* return a string to send back */
    char response[60];
    sprintf(response, "Hello world response #%d from Mesh_Node%d.", response_i++, ESP.getChipId());
    return response;
}

void setup()
{
    Serial.begin(115200);
    delay(10);

    Serial.println();
    Serial.println();
    Serial.println("Setting up mesh node...");

    /* Initialise the mesh node */
    mesh_node.begin();
}

void loop()
{
    /* Accept any incoming connections */
    mesh_node.acceptRequest();

    /* Scan for other nodes and send them a message */
    char request[60];
    sprintf(request, "Hello world request #%d from Mesh_Node%d.", request_i++, ESP.getChipId());
    mesh_node.attemptScan(request);
    delay(1000);
}

请注意,我以上的代码是没有进行任何的WIFI连接的!接下来打开串口监视器查看运行效果:

展开阅读全文

没有更多推荐了,返回首页