【蓝牙mesh】Bearer层(承载层)介绍
Bearer层简介
蓝牙Mesh协议栈由多个不同的协议层组成,其中最底层的协议就是Bearer层,它负责提供数据传输的底层支持。蓝牙Mesh协议栈的最底层就是BLE协议栈,所以Bearer层是直接与BLE协议栈连接的。在蓝牙Mesh网络中,Bearer层有两种类型,分别是广播Bearer和GATT Bearer。广播Bearer使用广播通道进行通信,这种通信方式非常适合在网络中传输短暂的数据包,例如传感器数据。而GATT Bearer则使用标准的蓝牙GATT(通用属性)协议进行通信,这种通信方式则更适合传输大型数据包和进行命令和控制。
需要说明一下,由于目前的手机都没有加入对蓝牙Mesh 广播Bearer的支持,所以我们想要使用手机APP控制蓝牙Mesh设备,只能使用代理的方式走Gatt通道与设备节点进行通信。 而设备节点与设备节点之间,往往都是通过广播Bearer通道进行通信的,当然低功耗节点除外。
概念介绍
蓝牙Mesh Bearer层分为广播Bearer层和Gatt bearer层,一个节点设备可以支持至少其中的一个,也可以都支持。 一般情况下,子设备节点如果不是低功耗设备,两个层都会支持的。
广播Bearer层
当使用广播Bearer层的时候,底层会发送BLE广播,广播包的类型如下图:
广播Bearer层使用的广播类型又两种,类型为0x2A表示的就是蓝牙Mesh的数据包, 类型0x2B表示的蓝牙Mesh的Beacon包。
至于上面的0x29是用来发送Gatt连接包的,是用在Gatt Bearer层的。
蓝牙Mesh的广播Bearer层使用的广播包是不可连接不可扫描的不定向广播包,如果接收到其他类型的广播包,应该直接丢弃。
Note: 蓝牙Mesh之所以使用不可连接的广播包就是为了节省掉Flags AD
Type所占用的广播字段,这样蓝牙Mesh的广播包数据有效长度可以达到29个字节。
Gatt Bearer
Gatt Bearer层一般是用在广播Bearer层不能使用的情况下,Gatt Bearer是使用的代理协议来发送和接收蓝牙Mesh数据的。
GATT服务端只能实例化一个蓝牙mesh代理服务,就是一个服务端不能同时连接多个客户端
Gatt客户端应该使用发现所有服务规程或者使用通过UUID发现服务规程来发现蓝牙Mesh的Proxy代理服务的。
Gatt客户端应该使用发现所有特征规程或者使用通过UUID发现特征规程来发现蓝牙Mesh的特征的
当Gatt客户端发现了蓝牙mesh的特征值描述符时,应该主动打开对应的通知。 当Gatt客户端需要发送数据到服务端时,需要使用write no response的发送指令。 当Gatt服务端需要发送数据给客户端是,需要使用Notify。
蓝牙mesh协议,实际上包括设备配网协议与配网后的7层网络架构协议。配网数据的发送和节点的消息发送是两种不同的协议层次。但是他们都会使用到承载层,所以可以看到设备在配网前后使用的代理特性是不一样的,在APP界面上,搜索未配网设备和搜索已配网设备的页面也是分开的,这样做的好处,在代码实现层面的结构更清晰。当然是可以做到把未配网设备和配网设备都放在同一个页面,但不管是从消费者使用方便还是程序业务逻辑上讲,都没有任何好处。
总结
在蓝牙Mesh网络中,Bearer层还提供了许多其他的功能,例如数据加密、数据压缩、数据分段等等。这些功能都是为了提高数据传输的效率和安全性。总的来说,Bearer层是蓝牙Mesh网络中非常重要的一层,它提供了数据传输的基础支持,使整个网络能够顺畅地运行。
蓝牙Mesh的Bearer层实际上就是对应的BLE协议的广播和Gatt连接,所以熟悉BLE协议的朋友应该都很熟悉。