<!--

前言

该章节小编将讲解中继节点的特性以及其工作流程,毫无疑问Relay Node在整个Mesh网络中置关重要的,可能很多读者可能会觉得 “这有什么难的?不就是帮忙转发其他的节点的Network PDU,从而扩大Mesh网络的范围嘛”;那么,你知道:

  1. “什么样的NetWork PDU才会被转发吗?”
  2. “已经帮忙中继了别人的数据,但是又收到该节点射频范围内其他节点所转发的同样的数据包,这个时候怎么处理?”
  3. “转发别人的数据包,需要更改哪些内容?直接原封发出去可以吗?”
  4. “中继节点自己做为源头时发送出去的数据包,被其他中继节点转发了,现在源头的中继节点又收到自己发送出去的数据包,这个时候咋搞?”
  5. ……

现在,你还敢这么“嚣张”地说:“这有什么难的吗?”

但是,你们都不要怕;以上问题统统将会从下述的内容中找到答案😄

Relay Node

如上所述,中继节点就是于用于中继或者转发其他节点的数据,从而扩大整个Mesh网络。但是,Spec中规定了很多的条件去限制过多的中继而导致网络堵塞;以下几点小编觉得还是有必要提醒一下读者:

至于,TTL相关的更多细节请参考BLE Mesh各层帧包格式详解

如何中继或者转发

本节内容将是整篇文章的核心所在,在前言中所提及的问题将统统在这里得到答案;废话不多说,先上图:

由上图可知,在中继Network PDU之前都是经过层层判断的;其中在前言中所提及的问题,小编相信读者应该可以 “拨开云雾,见阳光” 了:

  1. 源地址必须是单播地址,否则还没到判断是否要中继就已经被discard了
  2. 目标地址是单播地址时,只要是中继节点元素中的单播地址,则不中继该Network PDU;如果目标地址是组地址或者虚拟地址则不受此限制
  3. Network PDU中的TTL值必须大于等于2
  4. 中继特性必须被使能
  5. 只需要将TTL域的值减去1,Network PDU其他的内容均不变
  6. 如果再次接受到相同的Network PDU,则该PDU会被Message cache机制给过滤掉

至于中继的Network PDU要发送多少次 (在37、38、39通道发送表示为一次) ,每次的时间间隔是多少?这些内容请参考Configuration Model浅析.Relay & Relay Retransmit

最后

由于中继特性的功能比较单一简单,因此读者只需要记住上述的如何中继Network PDU即可。但是,为了方便网络封包是否中继的查阅以及比对,小编觉得还是有必要将接受到Network PDU的整个处理过程贴出来: