主要内容

BLE信道选择算法

这个例子展示了如何使用蓝牙®低能量(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开始)在三个广告通道上发送广告报文。扫描/发起设备使用相同的程序,以循环的方式侦听三个广告通道。

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

蓝牙核心规范规定了两种可选的信道选择算法(见第4.5.8节,Part-B,卷6)1)可用于为每个连接事件选择数据通道:

  1. 算法# 1

  2. 算法2

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

检查支持包安装情况万博1manbetx

%检查“蓝牙协议的通信工具箱库”%支万博1manbetx持包是否安装。comm万博1manbetxSupportPackageCheck (“蓝牙”);

模拟算法# 1

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

为算法#1创建一个系统对象

要选择通道索引,请创建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 . csa = bleChannelSelection with properties: Algorithm: 1 HopIncrement: 8 UsedChannels: [0 5 9 13 24 36
  • ChannelIndex是一个只读属性,指示正在使用的当前通道。

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

选择下一跳的通道索引

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

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

模拟算法# 2

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

为算法#2创建一个系统对象

要选择通道索引,请创建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' subbeventchannelselection: 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(见[1])。然而,没有样本数据可用来验证算法#1。

样本数据1(37个良好的数据通道)

  1. 访问地址= 8E89BED6

  2. [0:33] [0:33]

当使用上述输入时,算法2将根据[第6卷Part-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创建一个系统对象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将根据[第6卷Part-B,第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; \线\{数组}$ $

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

%为算法#2创建一个系统对象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].

附录

示例中使用了这个特性:

  • bleChannelSelection:创建一个System对象,用于选择新的数据通道来传输数据包

这个例子使用了这些助手:

选定的参考书目

  1. 蓝牙®技术的网站。蓝牙技术网站|蓝牙技术官方网站2020年7月8日通过。https://www.bluetooth.com/