主要内容

BLE信道选择算法

此示例显示如何使用Bluetooth®Low Energy (BLE)核心规范中指定的信道选择算法来选择信道索引[1]使用蓝牙协议的通信工具箱™库。

BLE渠道

BLE系统工作在2.4 GHz ISM频段2400 ~ 2483.5 MHz。它使用40个射频信道(每个信道2 MHz宽)。下图显示了频率和BLE通道之间的映射关系。每个射频信道都被分配一个唯一的信道索引(在图中标记为“BLE信道”)。

BLE将这40个射频信道分为3个广告信道(信道指数:37,38,39)和37个数据信道(信道指数:0到36)。请注意,广告频道分布在2.4 GHz频谱上。这种宽间距的目的是避免来自同一频谱中工作的其他设备(如WLAN)的干扰。广告通道主要用于发送广告报文、扫描请求/响应报文和连接指示报文。数据通道主要用于数据包的交换。

频道跳

在蓝牙技术中采用信道跳变技术来减少干扰,提高吞吐量。蓝牙标准定义了在信道之间切换的规则和执行信道跳频时使用的算法。

一些无线技术使用未经许可的2.4GHz ISM频段会增加干扰,并导致重传以纠正接收数据包中的错误。由于BLE是一种低能量导向的协议,因此更容易受到干扰。BLE使用信道跳变来对抗干扰的影响。当一个信道被干扰完全阻塞时,设备之间可以在其他信道上继续通信。

在经典的蓝牙中,信道跳频被限制为1600频率跳/秒。对于BLE,信道跳频规范已经修订。不同的规则适用于广告和连接设备,并定义了两种渠道选择算法。

广告设备在三个广告通道上循环传输广告报文(从通道索引37开始)。扫描/启动设备使用相同的程序,以循环方式监听三个广告通道。

连接的设备对于每个连接事件都会更改为新的数据通道。连接事件是两个连接设备之间的数据包交换序列。连接事件周期性地发生,间隔称为连接间隔。连接事件中的所有数据包都在同一数据通道上传输。新的连接事件使用新的数据通道。

蓝牙核心规范指定了两种可供选择的信道选择算法(参见[1])可以用来为每个连接事件选择数据通道:

  1. 算法# 1

  2. 算法2

这两种信道选择算法避免了容易产生传输错误的信道。在主设备和从设备之间交换通道映射。这个映射表示好的和坏的数据通道。好的和坏的数据通道的分类是依赖于实现的,可以根据各种参数进行,如SNR(信噪比),PER(包错误率)等。只有良好的数据通道用于设备之间的通信。如果主设备识别出任何坏的数据通道,则将更新通道映射。这两种信道选择算法使用信道映射来确定所选的数据信道是否适合使用。如果所选的数据信道是坏的,则使用信道重映射过程选择一个新的数据信道(参见[1]),它将坏的数据通道重新映射到一个好的数据通道。每种算法都有自己的重映射过程。

检查支持包是否安装金宝app

检查“蓝牙协议的通信工具箱库”%支金宝app持包是否安装。comm金宝appSupportPackageCheck (“蓝牙”);

模拟算法#1

你可以使用bleChannelSelection系统对象来选择新的通道索引。这个System对象配置选择通道索引所需的字段。

为“Algorithm #1”创建一个System对象

要选择通道索引,请创建bleChannelSelection系统对象算法设置为1。

csa = bleChannelSelection(“算法”1);

配置字段。

  • HopIncrement属性定义要使用的跳增量计数。缺省值为5。此属性适用于“算法#1”。

  • UsedChannels属性定义已使用(良好)数据通道的列表。

csa。HopIncrement = 8;csa。UsedChannels = [0,5,13,9,24,36]
csa = bleChannelSelection with properties: Algorithm: 1 HopIncrement: 8 UsedChannels: [0 5 9 13 24 36] ChannelIndex: 0 EventCounter: 0
  • ChannelIndex是一个只读属性,指示正在使用的当前通道。

  • EventCounter一个只读属性,指示到目前为止发生的连接事件的数量。对于每一个新选择的通道,它都会递增。

选择下一跳通道索引

调用对象csa作为函数确定下一个通道跳,并为每个新连接事件选择一个新通道。

nextChannel = csa();流(使用“算法#1”的连接事件%d的选择通道为:%d\n, csa。EventCounter nextChannel);
使用“算法#1”的连接事件0的选择通道为:9

模拟算法2

你可以使用bleChannelSelection系统对象来选择新的通道索引。这个System对象配置选择通道索引所需的字段。

为“Algorithm #2”创建一个System对象

若要选择通道索引,请创建bleChannelSelection系统对象算法设置为2。

csa = bleChannelSelection(“算法”2);

配置字段。

  • AccessAddress属性定义两个设备之间的32位唯一连接地址。默认值为“8E89BED6”。此属性适用于“算法#2”。

  • UsedChannels属性定义已使用(良好)数据通道的列表。

csa。AccessAddress =“E89BED68”;csa。UsedChannels = [9,10,21,22,23,33,34,35,36]
csa = bleChannelSelection with properties: Algorithm: 2 AccessAddress: 'E89BED68' SubeventChannelSelection: 0 UsedChannels: [9 10 21 22 23 33 34 35 36] ChannelIndex: 0 EventCounter: 0

选择下一跳通道索引

调用对象csa作为函数确定下一个通道跳,并为每个新连接事件选择一个新通道。

nextChannel = csa();流(使用“算法#2”的连接事件%d的选择通道为:%d\n, csa。EventCounter nextChannel);
使用“算法#2”为连接事件0选择的通道为:22

用于分析信道选择算法的GUI

这个函数helperBLEChannelHopSelectionUI提供一个图形用户界面来生成所需的通道跳数,用于分析算法。两种信道选择算法都可以使用这个GUI进行分析。它可以用来绘制算法的信道跳变模式,也可以用来绘制相应的直方图。

helperBLEChannelHopSelectionUI ()

用样本数据进行算法验证

提供样本数据以验证算法#2(见[第6卷,C部分]第3节,[1])。但是,没有用于验证算法#1的示例数据。

示例数据1(37个良好数据通道)

  1. 访问地址= 8E89BED6

  2. 已使用频道= [0:36]

当使用上述输入时,预计算法2将根据[第6卷第一部分b节3.1节]选择以下通道1

数组$ $ \开始{}{l l c | | | |} \线\ vphantom {\ displaystyle \ int} & # xA; \ mathbf {EventCounter} & # 38; \开始{数组}{1}\ mathbf{频道}\结束数组{}\ \ & # xA; \线\ mathrm{1} & # 38; \开始{数组}{1}\ mathrm{20} \结束数组{}\ \ & # xA; \线\ mathrm{2} & # 38; \开始{数组}{1}\ mathrm{6} \结束数组{}\ \ & # xA; \线\ mathrm{3} & # 38; \开始{数组}{1}\ mathrm{21} \结束数组{}\ \ & # xA; \线\{数组}$ $

下面的代码为前三个连接事件选择了三个通道。

为“算法#2”创建一个System对象csa = bleChannelSelection(“算法”2);

使用示例数据#1配置字段。

%连接访问地址csa。AccessAddress =“8 e89bed6”%根据样本数据使用37个好的数据通道作为已使用的通道csa。UsedChannels = (0:36);

为前3个连接事件选择通道索引。用上面提到的表验证生成的输出。

numConnectionEvents = 4;i = 1:numConnectionEvents通道= csa();流('事件计数器:%d,所选通道:%d\n', csa。EventCounter、通道);结束
事件计数器:0,选中通道:25事件计数器:1,选中通道:20事件计数器:2,选中通道:6事件计数器:3,选中通道:21

样本数据2(9个良好数据通道)

  1. 访问地址= 8E89BED6

  2. 已使用通道= [9,10,21,22,23,33,34,35,36]

当使用上述输入时,预计算法2将根据[[Part-B, Vol-6节3.2]选择以下通道1].由于信道映射中包含坏信道,对算法中使用的信道重映射过程也进行了验证。

数组$ $ \开始{}{l l c | | | |} \线\ vphantom {\ displaystyle \ int} & # xA; \ mathbf {EventCounter} & # 38; \开始{数组}{1}\ mathbf{频道}\结束数组{}\ \ & # xA; \线\ mathrm{6} & # 38; \开始{数组}{1}\ mathrm{23} \结束数组{}\ \ & # xA; \线\ mathrm{7} & # 38; \开始{数组}{1}\ mathrm{9} \结束数组{}\ \ & # xA; \线\ mathrm{8} & # 38; \开始{数组}{1}\ mathrm{34} \结束数组{}\ \ & # xA; \线\{数组}$ $

下面的代码为前八个连接事件选择了八个通道。

为“算法#2”创建一个System对象csa = bleChannelSelection(“算法”2);

使用示例数据#2配置字段。

%连接访问地址csa。AccessAddress =“8 e89bed6”%根据样本数据使用9个好的数据通道作为已使用的通道csa。UsedChannels = [9,10,21,22,23,33,34,35,36];

为前8个连接事件选择通道索引。用上面提到的表验证生成的输出。

numConnectionEvents = 9;i = 1:numConnectionEvents通道= csa();流('事件计数器:%d,所选通道:%d\n', csa。EventCounter、通道);结束
事件计数器:0,所选通道:35事件计数器:1,所选通道:9事件计数器:2,所选通道:33事件计数器:3,所选通道:21事件计数器:4,所选通道:34事件计数器:5,所选通道:36事件计数器:6,所选通道:23事件计数器:7,所选通道:9事件计数器:8,所选通道:34

绘制并分析跳变模式-算法1和算法2

下面的代码使用“算法#1”为前100个连接事件选择通道索引。所选通道被绘制出来并与“算法#2”的通道进行比较。

“算法#1”的系统对象csa = bleChannelSelection;用于100个连接事件numConnectionEvents = 100;hopSequence = 0 (1, numConnectionEvents);为100个连接事件生成通道跳序列i = 1:numConnectionEvents hopSequence(i) = csa();结束

helperBLEPlotChannelHopSequence函数绘制跳跃模式,并输出所选通道的直方图。

helperBLEPlotChannelHopSequence (csa, hopSequence);

下面的代码使用“算法#2”为前100个连接事件生成通道索引。所选通道被绘制出来并与“算法#1”的通道进行比较。

信道选择算法“算法2”的系统对象csa = bleChannelSelection(“算法”2);用于100个连接事件numConnectionEvents = 100;hopSequence = 0 (1, numConnectionEvents);为100个连接事件生成通道跳序列i = 1:numConnectionEvents hopSequence(i) = csa();结束

helperBLEPlotChannelHopSequence函数绘制跳跃模式,并输出所选通道的直方图。

helperBLEPlotChannelHopSequence (csa, hopSequence);

算法1 vs算法2

上面的图显示了两种算法之间的差异。

  • 算法#1是一个简单的增量算法,它产生一个统一的通道序列。在选择新渠道的过程中不涉及随机化。

  • 算法#2在蓝牙核心规范5.0版本中引入[1].与算法#1相比,这更复杂,并产生一个随机的通道序列。

结论

此示例演示了蓝牙核心规范中指定的信道选择算法的行为[1].

附录

下面的例子使用了这个特性:

下面的例子使用了这些helper:

选定的参考书目

  1. Bluetooth®技术网站。“蓝牙技术网站|蓝牙技术官网。”2020年7月8日访问。https://www.bluetooth.com/