在上一篇文章中从蓝牙发展的历史和蓝牙各个版本的功能,和技术衍变,讲到蓝牙mesh从哪来,将要到哪去。了解BLE更新迭代的历史,有助于理解为什么在mesh中要大力解决安全性问题,为什么要加入那么多复杂的加密和安全性的保障措施,就能更容易理解为什么整个蓝牙mesh要这么设计。再总结一下:从哪来,到哪去,将要干什么?从蓝牙BLE4.0中来,将会在蓝牙5.0技术中成长,蓝牙mesh已经是目前万物互联时代重要的组成部分,与AI结合的智能音箱是目前万物互联的最佳方案。它是BLE4.0后时代的产物,是未来技术发展潮流和趋势。
在这一篇中讲的是,我是谁,我在哪?什么是蓝牙mesh,目前蓝牙mesh在技术方向上发展到什么程度。
蓝牙Mesh网络是用于建立多对多设备通信的低能耗蓝牙网络拓扑。允许创建基于多个设备的大型网络,网络可以包含数十台,数百甚至数千台蓝牙Mesh设备,设备之间可以相互进行信息数据传递,这样应用形态为楼宇自动化,无线传感器网络,资产跟踪和其他解决方案提供了理想的选择。
蓝牙mesh 的基本概念
通常在BLE4.0中,设备与手机端APP建立连接的方式,是通过设备作为从机,像四周发送电磁波,蓝牙广播的方式告知自己的存在。这其中有两个技术过程,广播(AD)和连接(GATT),蓝牙mesh正是基于这两个核心,来扩展的。这也是为什么说蓝牙mesh 诞生于蓝牙4.0。(可能会有人说蓝牙mesh是基于广播,但是我觉得这个说法不够准确)
节点和设备
- 在蓝牙mesh网络中,我们通常把还未加入蓝牙mesh网络的设备叫做未配网设备(Unprovisioned Device)。
- 未配网设备在加入到一个mesh网络之后就被称为节点(Node)。
- 把一个未配网设备加入蓝牙mesh网络变成节点的过程叫做配网过程(Provisioning)。
- 配网器(Provisioner)在Nodic文档中是一句阐述用途的话,没有给出具体的定义。A Provisioner is used to manage the transitions between an unprovisioned device and a node.从广义上讲,配网器是设备,比如手机,平板,电脑。但实际上是应用程序来实现这个配网流程。如果非要给一个定义的话,这句话可能更适合一点:配网过程一般由产品制造商提供的应用程序完成,运行这个应用程序的设备被称为配网器。
广播和洪泛
在蓝牙mesh中,节点间传递消息的方式是通过低功耗蓝牙广播报文来实现的,这是一种基于洪泛(Managed-flooding)的信息传递机制,当一个节点要给另外一个节点发送消息时,它会广播一条消息,所有收到这个消息的节点都接收和处理这条消息。如果开启了节点的转发功能,那么消息可以到达网络覆盖范围内的任何地方。这就是蓝牙mesh的实现原理。
蓝牙mesh的这个原理是把双刃剑。我们蓝牙广播是向所有方向上发送电磁波的,不会像红外遥控那样指定方向。如果是蓝牙5.0设备,理论上300米范围内的所有设备都会收到这个消息,如果网络中所有节点收到这个消息的节点都将消息转发,那么每个节点300米范围内的又会收到这个消息并转发,一个消息就会无数次来回转发,而且消息永远不会停止,这种情况就是网络的消息泛滥。
这种情况当然是不能接受的,蓝牙mesh网络也不可能这么差劲,SIG也不可能设计出这种东西来。针对这个情况,蓝牙mesh 采用两个做法:消息缓存(Message Cache)和TTL(Time To Live,消息寿命),来避免消息被无限制转发下去。是不是感觉很熟悉,这两个玩意在网络路由器的处理方式一样,这说明不同技术的应用场景都差不多,掌握一种技术,同样可以使用到另外一个场景下。
消息缓存队列和TTL是如何解决问题?在节点收到后,会在消息缓存队列中查找是否存在这个消息,如果存在,则直接过滤掉这条消息,什么都不做。如果不存在,则判断TTL的值是否需要处理。如果消息缓存队列和TTL的值都通过了,则进入真正的处理流程,然后再判断是否需要转发。如果一个消息处理后,就会把处理的消息放到消息缓存队列,以便下次收到消息的时候做比对,消息缓存队列也不是无限大,是一个环形队列,如果超过我们设置的大小,则会把最久的那边消息覆盖。TTL是一个0~127的整数,这个值代表这一个消息能转发的次数,如果一个消息处理后,在转发的时候,TTL的值会减一,减小到0后,这个消息就不会被节点处理。
那你肯定又有一个疑问,可以不发给不需要处理的节点吗?如果只发给需要处理这个消息的节点,或者只经过最优路线达到最终的处理节点,这样就非常完美。很遗憾,这是无法做到的,毕竟设备没有像人智能。所以对技术人员的水平是有一定要求的,在构建网络拓扑的时候,如果搭建比较好的网络,根据实际场景把节点放在比较好的位置,能减少无效消息的转发,减少资源的浪费。对于这个课题,目前Bluetooth SIG也在想办法进行优化,是否加入路由机制,或者是其他更好的办法。
蓝牙mesh网络拓扑
如果在这里不讲一下网络拓扑,那么上面的内容对新接触的朋友来说可能半知半解。
这个图片出自2019年1月21号Sig董事会(Bluetooth SIG Board of Directors)发布的最新版MshPRFV1.0.1版本。网上这张图被大量引用,因为确实非常经典。
为什么说它经典?在回答这个问题之前,需要讲图中各种符号和标注的含义。前面提到过转发,转发只是蓝牙mesh中设备功能的一种。未来随着蓝牙mesh的发展,肯定会新增其他功能,但就目前来说,是4大功能:
- 转发功能:收到一条消息后将其转发出去,这样可以扩大mesh网络的覆盖范围,支持转发的节点被称为转发节点(Relay Node)。中继节点一直是"醒着的",对比低功耗的设备隔一段时间做一次数据交互的方式,中继节点肯定功耗略高,但是大多数实际场景中中继节点根本不需要考虑功耗问题。
- 代理功能:为了兼容旧的不支持蓝牙mesh广播包传播的设备(比如手机),具备代理功能的设备可以与旧设备建立低功耗蓝牙GATT连接,在mesh广播数据包和mesh GATT连接数据包之间转换,支持代理功能的节点被称为代理节点(Proxy Node)。(如果暂时对手机不支持BLE广播包传输这句话不理解的朋友,我会在后面的文章中给出解释)
- 低功耗功能:能够有效降低设备工作时间占空比的功能,让mesh设备做到可以使用电池供电,需要与朋友功能配合使用。支持低功耗功能的节点被称为低功耗节点( Low Power Node)。
- 朋友功能:帮助其他支持低功耗功能的节点缓存信息,让支持低功耗功能的节点能在低功耗状态下工作,支持朋友功能的节点被称为朋友节点(Friend node)。
节点可以支持以上4种功能中的一种或者多种,每个功能都可以设置成开启或者关闭,可以通过APP去修改这些值。
有了这些基本概念,再看那张图,图中中继节点有Q、R、S,低功耗节点有I、J、K、L、M和朋友节点N、O、P。N节点没有连接低功耗节点,S节点通过GATT连接了T节点。S节点必须将蓝牙mesh网络中收到的所有广播包转换成GATT数据包转发给T节点,所以S节点也是代理节点。有箭头代表节点之间的信息可达。这里要说明一下,配网器也是一个节点。
当节点A想要发数据给节点T的时候,数据流是这样的:A广播一条消息a出来,目标地址是T的地址,节点B、P、Q收到了消息a,检查发现目标地址是T,则B、P节点丢弃了这条消息(因为不具备转发功能),而节点Q转发了这条消息a,转发的消息a被节点A、B、C、D、E、R、P收到后,除了R之外其他节点都丢弃了消息a,节点R转发了消息a,节点E、N、S、H收到消息a后,E、N、H节点都丢弃了消息a,S节点消息将消息a发给T节点。
这个图说它是经典,作为教学把蓝牙mesh的优势和处理逻辑讲的淋漓尽致,但是如果要是这样去布置mesh网络,那就存在风险了,如果图中R节点设备没电停机了,那整个网络裂开成两个网络了。
看完这个文章,再结合广播和洪泛中讲到的场景。应该知道怎么搭建一个比较靠谱的网络拓扑,结合使用的节点的实际传输距离,考虑到某个节点可能发生异常的情况,如果室外,考虑好雨天对信号的影响,或者是其他一些特殊场景,不要按理论值去布置节点,布置一个mesh的第一件事是确定节点在实际场景中的实际传输距离。