我们知道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.

Bluetooth MESH探究 --- (6) BLE core spec之广播信道防冲突与数据信道选择相关推荐

  1. Bluetooth MESH探究 --- (8) 怎么实现MESH网络?

    Bluetooth MESH目前采用的是基于flooding协议的MESH网络技术.在发布的协议版本中,有提到在未来的修订版本中可能会加入基于路由协议的MESH网络. 的确,flooding协议是相对 ...

  2. BLE广播信道的防冲突与跳频数据信道的选择

    本文转自:https://blog.csdn.net/yangfei1328/article/details/76599531 如有不妥,请联系我后,会马上删除. 我们知道BLE有3个广播信道,37个 ...

  3. Bluetooth Core Spec经典蓝牙安全机制导读

    关键词:Bluetooth Classic Security 经典蓝牙安全机制 Pairing Authentication Encryption 本文基于Bluetooth Core Spec v5 ...

  4. Android 经典蓝牙(Classic Bluetooth)和低功耗蓝牙(BLE)

    从蓝牙4.0开始包含两个蓝牙芯片模块:传统/经典蓝牙模块(Classic Bluetooth,简称BT)和低功耗蓝牙(Bluetooth Low Energy,简称BLE) 经典蓝牙是在之前的蓝牙1. ...

  5. 来吧, BlueTooth Mesh

    期待已久的蓝牙网格(BlueTooth Mesh)网络技术终于可以应用了. 蓝牙技术联盟在2017年6月份正式发布, 在现有的蓝牙网络拓扑(点对点.星形和广播)列表中添加了蓝牙网格这一工业级的安全网络 ...

  6. android ble 经典蓝牙,Android 经典蓝牙(Classic Bluetooth)和低功耗蓝牙(BLE)

    [实例简介] 从蓝牙4.0开始包含两个蓝牙芯片模块:传统/经典蓝牙模块(Classic Bluetooth,简称BT)和低功耗蓝牙(Bluetooth Low Energy,简称BLE) 经典蓝牙是在 ...

  7. Core Spec 5.0 学习

    Vol1 Architecture & Terminology Overview 1 GENERAL DESCRIPTION 蓝牙无线技术是一种短距通信系统,旨在取代连接便携式和/或固定电子设 ...

  8. 解决 .net core 中 nuget 包版本冲突问题

    解决 .net core 中 nuget 包版本冲突问题 参考文章: (1)解决 .net core 中 nuget 包版本冲突问题 (2)https://www.cnblogs.com/dudu/p ...

  9. .net excel导入mysql_.NET Core使用NPOI将Excel中的数据批量导入到MySQL - 追逐时光者 - 博客园...

    前言: 在之前的几篇博客中写过.NET Core使用NPOI导出Word和Excel的文章,今天把同样我们日常开发中比较常用的使用Excel导入数据到MySQL数据库中的文章给安排上.与此同时还把NP ...

最新文章

  1. 华为任正非谈退休:思维跟不上的时候退,目前是才思泉涌的状态
  2. python实现提取jira bug列表
  3. 如何将编写好的CS文件做成exe可执行文件
  4. Java 读写 hdfs文件或者目录
  5. Linux常用的20条运维命令,值得收藏!
  6. Linux的shell编写
  7. 在linux下安装mongo数据库,Linux系统下安装MongoDB
  8. Centos7 ifconfig这个命令没找到的解决方法
  9. java入门简单小项目_JAVA入门_java项目接入Mysql8.0
  10. 写烂代码的人离职之后...
  11. 虚拟机IP地址和主机IP不在同一个网段
  12. canvas双层复合饼图及点击效果的实现
  13. 20180925-7 规格说明书——吉林市两日游
  14. C语言写的一个贪吃蛇小游戏(windows系统)
  15. Doxygen错误error:failed to run html help compiler on index.hhp
  16. 左神算法基础class6—题目2宽度优先遍历和深度优先遍历
  17. Fluent中floating point exception的问题原因及处理方法
  18. __I、 __O 、__IO是什么意思?怎么用?
  19. lol-----寒冰射手-----艾希
  20. 如何让IE浏览器提示下载文件,而不是直接打开Excel文件

热门文章

  1. 咸鱼CAD笔记—二维构图
  2. 汤唯、胡歌、姚明打破次元壁 同框在线教育代言
  3. 【论文分享】Clothes-Changing Person Re-identification with RGB Modality Only
  4. java中密码修改核心代码_彻底告别加解密模块代码拷贝-JCE核心Cpiher详解
  5. php双向验证SSL,php curl实现https双向认证的实例代码
  6. sed删除匹配行到最后的行。
  7. mysql 导出建库_mysql 安装、建库、导入导出数据
  8. Change Buffer介绍
  9. 上海交通大学2017年复试题:FibonacciRepresentation
  10. Python中字典的key都可以是什么?