Bluetooth MESH探究 --- (6) BLE core spec之广播信道防冲突与数据信道选择
2017-08-02 22:42
405 查看
我们知道BLE有3个广播信道,37个数据信道。那么,如果多个临近的BLE节点都在同一个广播信道发送广播消息,就可能会造成冲突。BLE的链路层是如何解决不同BLE节点的冲突问题呢?
在节点进入advertising state时,它会广播advertising events,协议中规定每个event的时间为:
T_advEvent = advInterval +advDelay
其中,advInterval是0.625ms的整数倍,取值范围在20ms与10.24s之间。
advDelay是一个伪随机数,它的取值范围是0到10ms。
从上面的公式可以看出,如果advInterval取值较大,将会降低出现冲突的概率,也降低了节点的功耗,但是,同时也会加大连接建立的时延。反之,如果advInterval取值较小,将会增加冲突概率和节点功耗,好处就是降低连接建立时延。
随机数advDelay可以在一定程度上降低advInterval相同的两个节点所发送的广播包的冲突概率。
下图是广播事件消息的时序示意图(图片来源于BLE协议规范):
一个节点发送完广播消息之后,如果接收到广播消息的节点希望建立连接。此时,它们之间是如何选择并确定数据信道的呢?
BLE链路层信道选择的算法流程如下:
(1) 首先,Master node在收到Slave node的广播消息之后,会发送CONNECT_REQPDU,其中,携带channel map用于通知slave node哪些信道可以用于数据连接,哪些信道不可以用于数据连接;
(2) 节点根据如下公式首先计算unmappedChannel:
unmappedChannel =(lastUnmappedChannel + hopIncrement) mod 37
其中,如果本次发送的event是数据连接的第一个connection event,上式中的lastUnmappedChannel为0;
hopIncrement的值在CONNECT_REQ PDU中指定,它是一个跳信道间隔值,影响两次数据传输信道的间隔。
当一个连接event结束时,unmappedChannel值被赋予lastUnmappedChannel。
(3) 得到unmappedChannel值之后,将该值与channelmap中可以使用的信道列表进行对比,如果在可以使用的数据信道列表中,找到了unmappedChannel,则使用该unmappedChannel作为本次连接event的信道。
(4) 如果unmappedChannel存在于不可用信道列表中,那么,需要将unmappedChannel重新映射到可用信道列表。使用如下公式:
remappingIndex =unmappedChannel mod numUsedChannels
其中,numUsedChannels表示channel map中可用信道的数量。
算法的流程图如下图所示(图片来源于BLE协议规范):
下面以一个例子解释信道选择算法:
(1) 假设hopIncrement = 2,channel map中可用信道列表包含:24,25,26,27;
(2) 某次连接的第一个连接event所选择的信道应该计算为:
unmappedChannel = (0 + 2)mod 37 = 2;
在可用信道列表中(24,25,26,27)没有2,那么需要重映射;
remappingIndex = 2 mod 3 = 2;
那么,第一次选定的信道应该为25.
在节点进入advertising state时,它会广播advertising events,协议中规定每个event的时间为:
T_advEvent = advInterval +advDelay
其中,advInterval是0.625ms的整数倍,取值范围在20ms与10.24s之间。
advDelay是一个伪随机数,它的取值范围是0到10ms。
从上面的公式可以看出,如果advInterval取值较大,将会降低出现冲突的概率,也降低了节点的功耗,但是,同时也会加大连接建立的时延。反之,如果advInterval取值较小,将会增加冲突概率和节点功耗,好处就是降低连接建立时延。
随机数advDelay可以在一定程度上降低advInterval相同的两个节点所发送的广播包的冲突概率。
下图是广播事件消息的时序示意图(图片来源于BLE协议规范):
一个节点发送完广播消息之后,如果接收到广播消息的节点希望建立连接。此时,它们之间是如何选择并确定数据信道的呢?
BLE链路层信道选择的算法流程如下:
(1) 首先,Master node在收到Slave node的广播消息之后,会发送CONNECT_REQPDU,其中,携带channel map用于通知slave node哪些信道可以用于数据连接,哪些信道不可以用于数据连接;
(2) 节点根据如下公式首先计算unmappedChannel:
unmappedChannel =(lastUnmappedChannel + hopIncrement) mod 37
其中,如果本次发送的event是数据连接的第一个connection event,上式中的lastUnmappedChannel为0;
hopIncrement的值在CONNECT_REQ PDU中指定,它是一个跳信道间隔值,影响两次数据传输信道的间隔。
当一个连接event结束时,unmappedChannel值被赋予lastUnmappedChannel。
(3) 得到unmappedChannel值之后,将该值与channelmap中可以使用的信道列表进行对比,如果在可以使用的数据信道列表中,找到了unmappedChannel,则使用该unmappedChannel作为本次连接event的信道。
(4) 如果unmappedChannel存在于不可用信道列表中,那么,需要将unmappedChannel重新映射到可用信道列表。使用如下公式:
remappingIndex =unmappedChannel mod numUsedChannels
其中,numUsedChannels表示channel map中可用信道的数量。
算法的流程图如下图所示(图片来源于BLE协议规范):
下面以一个例子解释信道选择算法:
(1) 假设hopIncrement = 2,channel map中可用信道列表包含:24,25,26,27;
(2) 某次连接的第一个连接event所选择的信道应该计算为:
unmappedChannel = (0 + 2)mod 37 = 2;
在可用信道列表中(24,25,26,27)没有2,那么需要重映射;
remappingIndex = 2 mod 3 = 2;
那么,第一次选定的信道应该为25.
相关文章推荐
- Bluetooth MESH探究 --- (4) BLE core spec之链路层信道与状态
- Bluetooth MESH探究 --- (7) BLE core spec之为什么BLE能有更低功耗
- Bluetooth MESH探究 --- (3) BLE core spec之物理层
- Bluetooth MESH探究 --- (5) BLE core spec之链路层基本流程
- 第4章 数据链路层(3)_广播信道的数据链路
- BLE广播数据类型(转自Bluetooth SIG)
- BLE 广播数据解析
- CoreBluetooth应用_蓝牙连接>>收集心跳数据
- BLE开发之CoreBluetooth
- Entity Framework Core 选择数据表的外键
- BLE 广播数据解析
- Android 蓝牙4.0 Bluetooth BLE 写数据(修改BLE设备的属性)
- BLE 广播数据解析
- BLE 广播数据解析
- 【BLE】CC2541之通过广播发送自定义数据
- 【BLE】CC2541之动态广播加密数据
- BLE 广播数据解析
- BLE广播数据的抓包解析
- BLE 广播数据解析
- 详解蓝牙BluetoothGattCallback用法之BLE数据接收