Labs 导读
蓝牙mesh技术是基于低功耗蓝牙广播报文来实现的,是一种基于泛洪的消息传递机制。
在传统蓝牙中,蓝牙与设备之间的关系是“一对一”的,因此设备间需要先进行“配对”,再建立一条稳定的连接进行数据传播。低功耗蓝牙设备则可以和其他设备建立“1对多”拓扑,通过广播的形式,向网络内的其他设备发送数据。蓝牙mesh网络则在低功耗蓝牙的基础上更进一步建立了设备间的“多对多”关系,通过中继,可以将消息发送到网络中的任意设备。
Part 01、 网络泛洪
蓝牙mesh网络使用了一种“管理型网络泛洪”的方式,即通过广播进行消息发送,让传输范围内的所有设备都可以接收消息。网络中的支持中继功能的设备就可以将消息转发给其相关联的所有设备,最终消息扩散到整个网络。
网络泛洪的优势在于不需要特定的设备专门扮演集中式路由器的角色。集中式路由器一旦发生故障,就会导致整个网络无法运行,从而影响网络通信的可靠性。网络泛洪的方式也意味着,网络中传输的消息不会沿着一条特定路径进行传输,而是可以通过多重路径到达目的地。
因为使用了泛洪技术,中继会转发从其他设备接收的消息。如果对此不加以限制,当网路中存在环路的时候,可能会造成网络风暴,对网络造成灾难性的影响。蓝牙mesh网络采取了一系列的措施,其中有两个主要的方法,信息缓存队列和TTL字段。
Part 02、 信息缓存队列
每个节点的网络层,都包含一个信息缓存队列,用于保存最近接收的网络数据包。如果某个刚收到的网络数据包已经在消息缓存队列里面,说明节点已经通过其他路径收到过该消息,就可以直接丢弃该数据包。如果该数据包不在缓存队列里,就可以进行下一步的消息处理。
消息缓存队列并不一定要求保存完整的消息数据包,只需要能识别消息即可。比如保存消息的唯一消息id。信息缓存队列是有长度限制的队列,如果队列已满,则需要按照最早到达丢弃的原则,将最老的消息丢弃,保存最新的消息。
Part 03、 TTL字段
TTL是Time To Live的缩写,TTL的作用是限制IP数据包在网络中存在的时间。在蓝牙mesh网络中,TTL实际上是数据包在网络中可以转发的最大跳数。TTL字段由数据的发送者设置,当转发节点的底层传输层收到网络层上报的信息时,把这个TTL的值减1,然后将数据包转发出去。若信息的TTL 小于1,则该信息会直接被丢弃。
Part 04、 广播数据格式
蓝牙mesh广播实际上是以低功耗蓝牙广播为基础的,所有的数据包格式也是基于低功耗蓝牙广播的数据包格式,通过AD Type字段与其他广播进行区分。可以理解成一种特殊的BLE广播包。蓝牙广播包中的有效数据由若干个AD Structure单元组成。每个AD Structure由Length,AD Type,AD Data三个部分组成。
Mesh profile消息涉及的AD Type有三种,见下表:
其中Mesh Beacon用于对蓝牙mesh节点或未配网节点进行周期性的广播,比如未配网的设备通过周期性发送广播信息,让自己可以被配网器(Provisioner)发现,从而加入蓝牙mesh网络。
Mesh Message用于在正常的蓝牙mesh节点之间传输网络数据包。
PB-ADV 一般作用于设备配网期间,主要用于传输通用配网PDU。
Part 05、 小结
蓝牙通过蓝牙mesh这项新的协议规格正式进入物联网的领域,蓝牙mesh技术是一种基于泛洪的信息传递机制,以保证目标节点只要在网络覆盖范围内就能收到消息。但是这种机制也带来了一定的弊端,就是网络中信息的泛滥。蓝牙mesh网络采用了信息缓存队列和TTL字段这两种方案来避免信息被无限制地转发下去。