WaveMesh 2.0无线移动自组网协议栈为了满足不同的应用需要,同时减小协议栈的体积,进一步降低软硬件成本,因此设计了不同的协议版本,称之为 WaveMesh 协议族。
除了上述的模块固件版本之外,WaveMesh 还会为某些行业定制功能更全面的协议固件版本,这些版本不在此文档赘述,请参见别的文档。
为了方便对不同版本协议进行选择,WaveMesh 无线移动自组网协议栈不同版本之间功能对比如下表所示(数据部分仅对 2K RAM MCU 有效):

对于部分采用 ASR6505 的模块,其路由表项增加至 2048 项,最大报文长度增加至 248 字节。
为了满足各种低功耗的应用场景,WaveMesh 协议栈提供了多种休眠策略:异步休眠、同步休眠、自主休眠、混合休眠、被动休眠和强制休眠。本节简单说明各种休眠的工作方式,方便对不同协议版本进行选择。
异步休眠模式下节点会在网络空闲后自动按照设定进入“休眠-监听-休眠-监听…”的循环过程,协议栈在休眠时间片结束时会打开射频监听网络中的无线信号,进入监听时间片。如果在监听时间片之内识别出特定的无线唤醒信号则会结束监听过程进入正常工作模式;否则会在监听时间片结束时进入下一个休眠的时间片。休眠时间片和监听时间片的长度可以根据实际需要设定。异步休眠待机过程的电流消耗典型示意图如下所示:

💡说明:
- 所有节点和网关都可以进行异步休眠;
- 无论是否使能休眠,全网所有节点均需要设置相同的异步休眠时间片参数;
- 异步休眠节点之间通信,需要在交换正式数据之前进行无线唤醒;
- 异步休眠待机后节点不需要发送任何报文,全网保持静默;
- 异步休眠节点和非休眠节点可以进行数据通信,但需要非休眠节点设置相同的异步休眠参数以便能够唤醒异步休眠节点;
- 异步休眠节点在被串口的数据报文唤醒后会立即结束休眠时间片进行突发数据传输;
- 监听时间片的长度和无线的速率相关,无线速率越大监听时间片越短,反之越长;
- 异步休眠数据传输功耗优先级大于可靠性,单次全网数据集抄不保证 100%可靠性;
对于异步休眠节点的无线唤醒通常采用前导的方式,然而这种唤醒方要求报文的前导长度大于休眠时间片的长度才能基本保证能够唤醒休眠节点。前导唤醒方式的报文耗时很长,被误唤醒的概率很大,在唤醒时基本上没办法进行碰撞避免,没办法区分单播和多播,更没有办法进行休眠网络的集抄。因此 WaveMesh 协议并没有采用简单的前导唤醒方式。
由于 WaveMesh 协议的握手报文非常短并且加上优异的碰撞避免算法,上一代 WaveMesh 协议直接采用握手报文的方式进行唤醒,达到非常理想的唤醒效果。握手报文唤醒不需要报文持续整个休眠时间片,基本没有被误唤醒的可能,可以进行碰撞算法并且容易区分广播报文和单播报文,可以在唤醒过程中交换路由和广播信息,并且达到极高的唤醒成功率。但是握手报文唤醒方式在网络规模比较大的网络会因为持续的数据报文会导致反复唤醒休眠节点,休眠节点的监听时间片长度也会比较长。
在第二代 WaveMesh 协议中对握手报文唤醒方式进行了改进。简化握手报文过多信息,将报文的长度缩短到最短;充分利用不同射频芯片的特点,采用时间精度更高、更智能的碰撞算法。将唤醒过程独立出来,不再和数据交换过程同时进行,避免被反复唤醒的情况。经过改进的唤醒算法保留了第一代握手报文唤醒优点的同时,将唤醒过程所需的时间进行了严格的控制,有着确定的唤醒延时和网络节点密度以及网络的规模无关。第二代协议唤醒方式会优先确保功耗,而第一代协议会优先保证成功率,这是两代休眠唤醒算法的本质区别。由于采用更短的唤醒报文可以使监听时间片进一步缩短至~1ms 以内。对于单播仅需要唤醒下一跳中继节点,对于广播可以进行全网唤醒。异步唤醒和数据交换的过程入下图所示:

同步休眠模式下,网络所有节点的休眠时间片是严格同步的,协议会尽可能将相邻节点之间的时间片误差降至最小,可以实现所有节点同时工作同时休眠。网络中需要指定某个网关负责时间片的同步,通过广播同步休眠报文实现,广播同步休眠报文携带本次同步休眠时间片的长度。因此同步休眠时间片长度不是固定值,可以根据需要进行随时调整。网络中若没有数据传输时可以立即进入下一个休眠时间片而不需要等待当前工作时间片结束。网关会根据静默超时判断工作时间片的结束时刻,因此工作时间片长度也随着网络数据量、节点数量的变化而变化。同步休眠模式下各节点时间片的误差很小,因此在工作时间片内进行数据传输不需要唤醒过程。同步模式下的时间片的使用如下图所示:

💡说明:
- 为了降低硬件成本和功耗,模块休眠时采用的是 MCU 片内的低速 RC 振荡器,频偏比较大;
- 协议软件会对低速 RC 振荡器进行校准,使其频偏在可控的范围内;
- 协议充分考虑了校准后的 RC 振荡器的频偏带来的误差;
- 综合考虑 MCU 的性能和低速 RC 振荡器的误差,目前允许的最大同步时间片的长度为~17分钟;
- 同步休眠参数仅仅需要对负责同步休眠的网关设置即可;
- 同步休眠时间片无法提前结束,也无法进行突发数据传输;
- 同步休眠数据传输功耗优先级大于可靠性,单次全网数据集抄不保证 100%可靠性;
单纯采用同步休眠会在节点收到干扰收不到正确的同步休眠报文而无法进入休眠的异常情况,这时节点就处于接收状态,就会产生比较大的功耗。为了增加同步休眠的健壮性,可以搭配异步休眠一起使用,称之为混合休眠模式。在同步时间片结束时刻,节点不会立即进入工作时间片,而是进入异步休眠。因此在下一个工作时间片开始之前需要进行异步休眠唤醒,在唤醒结束时才会进入工作时间片。采用混合休眠的节点在受到干扰接收不到同步休眠报文时,会进入异步休眠模式,这时待机功耗要远低于工作时间片,确保功耗优先的原则。采用混合休眠另一个好处是降低节点对工作片同步的精度要求,因为只要时间片的误差小于一个异步休眠时间片的长度均可以正常工作。混合模式时间片的使用如下图所示:

💡说明:
- 异步休眠在混合休眠里起着异常情况处理的作用,仅仅是辅助作用;
- 需要平衡正常工作和异常处理下的功耗平衡,推荐异步休眠时间片长度为 100ms~500ms;
对于不需要进行数据中继和路由转发的叶子节点(终端节点),可以仅仅在需要进行收发或者询问属于自己的数据报文时才会打开射频进行数据传输,在数据传输完毕可以立即进入休眠,称之为自主休眠。 自主休眠节点可以和不休眠节点之间进行突发数据传输,但自主休眠节点之间无法进行数据交换。自主休眠节点和不休眠节点之间不存在绑定关系,因此自主休眠节点可以在网络中任意移动,甚至脱离网络。自主休眠的节点按照预设的休眠时间片进行休眠, 在休眠时间片结束后会主动发送报文询问广播报文,以及探测不休眠节点的存在。因此,不休眠节点无需主动唤醒自主休眠节点。在接收到串口数据报文时,可以立即结束自主休眠时间片,进行突发数据传输。自主休眠时间片的使用如下图所示:

💡说明:
- 自主休眠节点没有路由和数据中继转发的能力,网络需要有不休眠的路由/网关节点和自主休眠节点配合才能进行数据传输;
- 不要求自主休眠节点的休眠时间片都相同,可以任意设定;
- 自主休眠节点可以主动醒来探测网络和询问广播报文,其休眠时间片可以设置为 1 秒~4.5分钟;
- 如果不需要自主休眠节点主动醒来探测网络,可以设置自主休眠时间片为无穷大,这样自主休眠节点只有在收到串口数据报文时才打开射频进行数据传输,没有数据传输时会一直休眠状态;
- 自主休眠节点可以获得最低的待机功耗,节点功耗通常比异步休眠低 1-3 个数量级,可以用于低功耗传感节点、人员定位卡等应用;
- 在允许部署少量不休眠节点做路由的情况下,自主休眠是最佳选择;
- 自主休眠节点在主动醒来探测网络时采用碰撞算法,在遇到网络拥塞或者无线报文错误时,可能会导致此次数据交换失败立刻重新进入休眠时间片,但数据报文不会丢失,并且在休眠时间片结束后会继续尝试;
- 因此只要给足够多的时间,自主休眠单次全网数据集抄保证 100%可靠性;
- 自主休眠的网络稳定性、抗干扰能力和网络规模都要优于异步休眠网络;
外部 MCU 可以通过串口发送 ATTS 指令,使节点立即进入休眠状态,其休眠策略而并非来自协议本身,称之为被动休眠。可以指定被动休眠的时间片长度 1 秒~4.5 分钟或者永久。在节点休眠时间片结束之后或者接收到串口的数据报文后,协议栈会重新接管对硬件的控制权,恢复休眠之前的工作模式。这种休眠方式可以用来满足以下应用需求:
💡说明:
- 被动休眠不需要设置任何参数,直接发送 AT 指令即可。
在网络个别节点硬件出现异常如不停复位等情况出现后,可能会和网络中相邻正常节点反复进行数据交换,导致正常节点无法休眠的极端情况出现。为了降低这种异常情况下的正常节点的功耗,可以使能强制休眠。强制休眠的休眠策略是:如果节点的工作时间片超出~8 分钟会强制节点休眠~17 分钟。这样做会使正常节点主动断开异常节点的数据请求,网络会处于比较长时间的共同静默状态。这段静默时间很可能会迫使异常节点放弃数据传输请求。强制休眠策略相当于飞机跑道最后的防护网,仅仅为了应对硬件的异常情况。
💡说明:
- 需要确保正常情况下节点的工作时间片小于 8 分钟,才能使能强制休眠;
- 强制休眠工作时间片超时时间为固定值,无法通过参数配置。
无线自组网的大部分应用就是收集网络中海量节点数据,同时伴随着实时性和低功耗的要求,例如无线抄表、传感器采集等应用。如何快速实时获得全网所有节点的数据并且满足功耗的要求,WaveMesh 协议给出的答案就是全网集抄,这也是该协议的精髓。全网数据集抄只需要网关发送一条广播抄读报文,网关在数秒之内即可以获得全部节点的数据。对于不休眠的应用如电表抄表协议可以保证单次集抄 100%的成功率;对于自主休眠低功耗网络协议保证单次集抄100%成功率;对于同步休眠和异步休眠低功耗网络,本着功耗优先的原则,协议可以提供单次集抄接近 100%成功率。
为什么集抄能在如此短的时间内获得全网数据?我们可以看一下集抄的工作过程:
在网关看来,反馈的数据报文会从网络远处的各个节点源源不绝的汇聚过来,理论上单个网关的吞吐量可以达到物理层带宽的 80%到 90%(实际上需要根据射频芯片的能力,需要计算收发切换时间、校准时间和不同的报文长度,吞吐量可以达到物理层带宽的~70%)。整个网络的数据集抄时间可以根据总的数据量和吞吐量进行简单计算就可以得出。如果网络中有多个网关,可以使网络的吞吐量成倍的增加,这样整个网络的数据集抄时间可以成倍减少。
对全部节点处于异步休眠状态的网络进行全网集抄时,需要逐级唤醒所有节点,其中每级唤醒需要 1-2 倍异步休眠时间片长度。异步唤醒整个网络所需要时间跟网络最大跳数相关,跳数越多其唤醒时间就越久。然而全网异步唤醒过程和全网数据集抄过程可以并行进行,因此全网异步唤醒过程给集抄过程带来的额外时间开销并不多。按照通常情况如果每一级节点数量达到几十个以上,异步唤醒过程会比数据传输过程耗时要短,这样以来异步唤醒过程就不会额外增加时间开销。因此,通常情况下全网异步唤醒过程给整个集抄过程总时间仅仅增加 1-2 倍异步休眠时间片长度。鉴于异步休眠时间片为 0 - 4 秒,因此对于异步休眠的网络集抄用时仍然可以达到秒级。
💡说明:
- 集抄的过程会自动建立网关到节点的双向路由,因此整个网络不需要事前建立路由,网络上电可以立即工作;
- 如果节点需要上报的数据量大于协议支持的最大报文长度,则需要将数据打包成多个报文进行发送;
- 集抄的过程各节点向网关发送的数据报文个数不限,如果需要发送多个报文则需要与无线模块进行串口握手,以确保在网络拥塞的情况下报文不被串口丢弃;
- 对于成百上千点密度适中的网络来说,每节点均上报一包数据,射频速率采用 100kbps,全网集抄可以在数秒内完成;
- 对于包含自主休眠的节点网络,全网集抄可以保证 100%可靠性,但是需要等待 1 到多个自主休眠时间片长度(时间片无限长除外)才能得到全部数据。这是因为休眠节点为了保证功耗优先,在拥塞和碰撞的时候很可能会放弃数据传输立即休眠,但会在休眠时间片结束再次尝试;
为了减小应用层开发的工作量甚至免除协议栈二次开发的必要,WaveMesh 协议栈可以直接接受客户的应用层的数据帧,并且协议栈的行为不需要应用层进行干预。在应用层看来,WaveMesh 无线模块按照透明传输的方式收发应用层的数据报文,在使用上和没有协议栈的UART-RF 透明传输模块基本没有区别。但是,简单的透明传输应用层的数据报文无法保证数据帧的完整性,也无法从数据帧中获得地址信息也就无法进行精确路由。因此,WaveMesh 协议栈设计了非常灵活的应用层数据帧解析功能,该功能可以通过参数灵活配置,基本上可以适配何种数据帧格式。WaveMesh 数据帧解析过程如下所示:

WaveMesh 的数据帧解析参数仅有 4 个参数而且都是可选的:帧起始字符、帧结束字符、长度偏移量、长度修正值。可以解析以下数据帧:
💡说明:
- 数据帧解析可以过滤垃圾字节,特别是模块在使用串口休眠唤醒时容易产生垃圾数据;
- 确认数据帧的完整性,特别是需要确认数据帧的开始位置,这是获取正确地址信息进行路由转发的基石;
- 数据帧解析和串口握手报文搭配使用,确保串口数据不丢失,是实现网络可靠传输的关键;
- AT 指令解析模式和应用层数据帧解析模式会同时进行,因此不需要主动切换这两种帧解析模式,但是 AT 指令识别优先于应用层数据帧;
WaveMesh 协议在不休眠情况下可以保证 100%数据可靠性。在休眠情况下会因为优先保证功耗,存在极小无线数据报文发送不成功的可能性。但是在无线发送失败的情况下也绝不会丢弃任何数据报文,等待网络恢复或者干扰消除后会继续发送之前未发送的报文。因此 WaveMesh协议可以被认为是一种可靠传输网络协议。
在连续发送多个报文的应用中仍然会发现无线模块丢包的现象,其实数据包是被无线模块的串口丢弃而不是无线。无线模块的片内的数据缓存数量有限,在无线网络拥塞的情况下,模块缓存中的数据报文还没得及通过无线发送,这时如果向模块串口持续发送新的报文会导致缓冲区满。在模块缓冲区满之后会临时关闭串口,这时再向模块串口发送数据报文就会被丢弃。只有等待数据报文发送成功或者失败之后,才会再次打开模块串口接收新的报文。
与无线模块进行简单的串口握手,就可以保证模块的串口数据报文的可靠性。模块提供参数可以设置 3 个串口握手报文:
💡说明:
- 串口握手是可选项,在需要连续发送多个数据报文时或者实际应用中会发现丢包现象时需要使能该功能;
- 串口握手各报文内容由客户自己定义,长度最大仅为 15 字节;
- 串口握手各报文设置后就为固定内容,目前无法回应序列号等其它信息;
WaveMesh 协议底层是分布式异步网络,即使采用同步休眠的节点底层也是个纯异步的网络。并且该协议采用完全扁平化设计,多种类型的设备如路由中继节点和叶子节点会共享相同的物理信道,其数据传输和路由完全依赖碰撞避免算法,因此碰撞避免算法的效率和策略对该协议而且显得异常重要。WaveMesh 碰撞避免算法经过了很多年的改进,无论网络的疏密、节点类型的不同,新一代的算法目前的有效物理层带宽效利用率可以达到 90%以上,基本上已经到达理想极限。
相对于上一代碰撞避免算法做了以下改进:
💡说明:
- 新一代碰撞避免算法根据实际应用场景和资源开销综合设计,要求同时发送数报文的相邻节点的数量尽可能控制在 250 点以内;
- 不过在实际使用中基本上不可能所有相邻节点会同时发送数据,因此对相邻节点的数量的限制不是个硬性指标;
- 对于非常密集的网络,相邻节点数量远远大于 250 的情况下,可以通过降低射频发射功率的方法减小相邻节点数量;
- 对于生产出厂测试来说,往往节点数量非常多和密集,这就需要按照分批测试和逐个测试的原则,不能上千个节点放在一起测试;
- 相邻节点的数量和网络节点容量是完全不同的概念,对相邻节点的数量的限制不是对网络节点容量的限制;
无线移动自组网是多个具有路由功能的移动节点组成的多跳网络,数据的传输需要多个节点的协作才能完成,因此路由协议是网络实现至关重要的一部分。与传统有线网络相比,无线移动自组网有自己的特点,如分布式控制、动态变化的网络拓扑结构、无线传输带宽和节点能力有限、安全性差、路由生存时间短等。
理想的无线移动自组网路由协议应该具有以下特点:
无线移动自组网中从任何一个源节点到目的节点的路径通常会有多条,而且节点具有随机移动性,整个网络的拓扑结构经常变化。WaveMesh 协议采用私有按需轻量动态多径路由协议,该协议是针对硬件资源条件苛刻的移动自组网设计的,适用于移动速度快、拓扑结构变化快的无线网络。该路由协议可以最大限度减小路由建立和维护过程的开销,能够在多条路径并行进行数据报文的发送,可以感知网络拓扑结构的变化并对路由进行更新不需要进行洪泛,在不同路由之见无缝切换。
WaveMesh 路由协议特点有:

WaveMesh 多径路由示意图如上所示,网络拓扑结构图如左侧所示,黑线代表节点间的链路。右侧为的 A 和 B 两点建立的数据链路,红线为从 A 到 B 点的路径,蓝线为逆向路径。路由的建立通过可靠广播的方式实现,多条路由间没有闭环回路、允许多条路径相交。每个节点都会选择尽可能多的节点作为自己的下一跳路由,数据报文可以在多条路径之间动态切换,能够并行传输。失效路由检测、新路由发现、网络拓扑结构的变化通过监听相邻节点间的握手报文来感知,不需要进行洪泛也不需要额外的开销。包括源节点在内的所有节点仅需要寻找自己的下一跳中继节点,而不需要确定整条路径,因此该路由协议开销很小,适合拓扑结构快速变化的移动网络,能够迅速发现即时最佳路由,支持 255 级路由的超大规模网络。
WaveMesh 路由协议会综合多种选择算法进行路由的筛选,包括距离矢量、信号质量和节点剩余电量。距离矢量算法根据目的地的远近来决定的路径,每个节点都会维护一张矢量表,表中列出了当前已知的到每个目标的最佳距离。节点可以根据这张矢量表,选择比自己更接近目的地的节点作为转发路由。根据距离矢量算法可以找到两个节点间的最近路径,但不一定是最佳路径。
不同于有线的网络,对于无线移动自组网来说无线信号容易受外界干扰的影响,造成数据链路生存时间短、稳定性差的特点。路由协议必须能够正确选择信号质量好、链路稳定的路径才能保证网络的稳定性、实时性、可靠性和抗干扰能力。WaveMesh 路由协议能够迅速探测多条路由的即时链路质量,能在极短时间内选择出最佳链路质量的路径做路由,并且在必要时可以选择次最近路径作为路由。WaveMesh 链路状态算法路由选择示意图如下所示,A 可以通过 B 中继到 C 既 A-B-C 但该条路径受到干扰为不稳定链路,同时 A 到 C 有另外一条链路质量好的路径 A-D-E-C。选择 A-B-C 这条路径虽然距离更近,但是由于链路不稳定性报文的接收成功率很低,会大大增加报文的重发概率耗费大量时间。而如果选择 A-D-E-C,虽然距离会远一些,但是能保证报文传输的可靠性和实时性。

另外对于低功耗无线移动自组网来说,路由选择需要充分考虑节点电池的电量,应尽可能避开电池电量低的节点进行路由。在距离矢量和信号质量都相同的条件下,WaveMesh 路由协议会自动选择剩余电量相对大的节点做路由。WaveMesh 节点剩余电量路由选择算法示意图如下所示,A 可以通过 B 中继到 C 既 A-B-C 但 B 节点的剩余电量低,同时 A 到 C 有另外一条稍远的路径 A-D-E-C,路径中的节点剩余电量较高。选择 A-B-C 这条路径虽然距离更近,但是会很快耗尽 B 节点的电量。如果选择 A-D-E-C,虽然距离会远一些,但是增加整个网络的使用寿命减小系统的维护费用。

WaveMesh 标准无线模块搭载 WaveMesh 标准协议族的固件,其硬件的尺寸、外观和使用完全一模一样,方便产品更换硬件模块。所有模块采用相同的配置参数结构,使用统一的 AT 指令和同一配置工具进行参数配置,屏蔽硬件上的差异。目前为止 WaveMesh 2.x 协议已经支持的标准硬件模块如下: