此示例显示如何使用Bluetooth®低能量(BLE)核心规范中指定的频道选择算法选择频道索引[1]使用Communications Toolbox™库进行Bluetooth®协议。
BLE系统工作在2.4 GHz ISM频带2400 - 2483.5 MHz。它使用40个射频通道(每个通道是2 MHz宽)。下图显示了频率和BLE信道之间的映射关系。每个射频信道都分配了一个唯一的信道索引(在图中标记为“BLE信道”)。
BLE将这些四十次RF通道分为三个广告频道(频道指数:37,38,39)和三十七个数据通道(通道指数:0到36)。请注意,广告频道遍布2.4 GHz频谱。这种宽间距的目的是避免在相同频谱中操作的其他设备的干扰,例如WLAN。广告频道主要用于传输广告数据包,扫描请求/响应报文和连接指示数据包。数据通道主要用于交换数据包。
蓝牙采用信道跳变技术,减少干扰,提高传输速率。蓝牙标准定义了信道之间的切换规则和执行信道跳频时使用的算法。
几种无线技术使用未经许可的2.4GHz ISM频段会增加干扰,并导致重新传输以纠正接收包中的错误。由于BLE协议是一种面向低能量的协议,因此它更容易受到干扰。BLE利用信道跳变来对抗干扰的影响。当一个信道被干扰完全阻断时,设备仍然可以在其他信道上继续通信。
在经典的蓝牙中,通道跳跃限制为1600频率跳跃/秒。对于BLE,频道跳跃规范已被修订。不同的规则适用于广告和连接的设备,并定义了两个通道选择算法。
广告设备以循环的方式(从通道索引37开始)在三个广告通道上发送广告报文。扫描/发起设备使用相同的程序,以循环的方式侦听三个广告通道。
每个连接事件都将连接设备更改为一个新的数据通道。连接事件是两个连接设备之间数据包交换的序列。连接事件定期发生,其间隔称为连接间隔。连接事件中的所有数据包都在同一数据通道上传输。新的连接事件使用新的数据通道。
两个替代的频道选择算法由蓝牙核心规范指定(参见[3.5.8,Part-B,[1)可用于为每个连接事件选择数据通道:
算法# 1
算法#2
两种信道选择算法避免了容易出现传输错误的信道。在主设备和从设备之间交换通道映射。这个映射表示好的和坏的数据通道。好的和坏的数据通道的分类是依赖于实现的,可以根据各种参数,如信噪比(SNR), PER(包错误率)等来完成。只有良好的数据通道用于设备之间的通信。如果主设备识别到任何错误的数据通道,则通道映射将由主设备更新。两种通道选择算法使用通道映射来确定所选数据通道是否适合使用。如果选择的数据通道是坏的,则使用通道重映射过程选择一个新的数据通道(见[第4.5.8节,Part-B,卷6]1),将坏数据通道重新映射到一个好的数据通道。每个算法都有自己的重映射过程。
%检查“蓝牙协议的通信工具箱库”%支万博1manbetx持包安装或不安装。comm万博1manbetxSupportPackageCheck ('蓝牙');
您可以使用blechannelselection.
系统对象,以选择新的通道索引。这个System对象配置选择通道索引所需的字段。
为算法#1创建一个系统对象
要选择频道索引,请创建一个blechannelselection.
系统对象算法
设置为1。
CSA = BlechAnnelselection('算法',1);
配置字段。
的HopIncrement
属性定义要使用的跳增计数。缺省值是5。这个属性适用于'算法#1'。
的代克南尔斯
属性定义已使用的(好的)数据通道列表。
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
您可以使用blechannelselection.
系统对象,以选择新的通道索引。这个System对象配置选择通道索引所需的字段。
为算法#2创建一个系统对象
要选择频道索引,请创建一个blechannelselection.
系统对象算法
设置为2。
CSA = BlechAnnelselection('算法'2);
配置字段。
的AccessAddress
属性定义两个设备之间的32位唯一连接地址。默认值为“8E89BED6”。这个属性适用于'算法#2'。
的代克南尔斯
属性定义已使用的(好的)数据通道列表。
csa。AccessAddress =“E89BED68”;csa。UsedChannels = [9, 10, 21, 22, 23, 33, 34, 35, 36]
CSA = BlechannElsElection具有属性:算法:2 AccessAddress:'E89Bed68'子文本编织:0代使用太尔:[9 10 21 22 23 33 35 36] ChannelIndex:0 EventCounter:0
选择下一跳的通道索引
调用对象csa
作为一个函数来确定下一个通道跳,并为每个新连接事件选择一个新通道。
nextChannel = CSA();流('使用'算法#2'为连接事件%d选择的通道为:%d\n', csa。EventCounter nextChannel);
连接事件0的选定频道使用'算法#2'是:22
这个函数helperBLEChannelHopSelectionUI提供图形用户界面,以生成所需的通道跳数,用于分析算法。可以使用此GUI分析两个通道选择算法。它可用于绘制算法的频道跳跃模式,并且还绘制相应的直方图。
helperBLEChannelHopSelectionUI ()
提供样本数据来验证算法#2(见[1])。然而,没有样本数据可用来验证算法#1。
样本数据1(37个良好的数据通道)
访问地址= 8E89BED6
[0:33] [0:33]
当使用上述输入时,算法#2预计根据第3.1节,Part-B,Vol-6选择以下通道。1]
以下代码为前三个连接事件选择三个通道。
%为算法#2创建一个系统对象CSA = BlechAnnelselection('算法'2);
使用示例数据#1配置字段。
%连接访问地址csa。AccessAddress ='8e89bed6';根据样本数据使用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个良好的数据通道)
访问地址= 8E89BED6
使用通道= [9,10,21,22,23,33,34,35,36]
当使用上述输入时,算法2将根据[第6卷Part-B,第3.2节,选择以下通道1].由于通道映射包含坏通道,因此也验证了算法中使用的通道重映射过程。
下面的代码为前8个连接事件选择8个通道。
%为算法#2创建一个系统对象CSA = BlechAnnelselection('算法'2);
使用示例数据#2配置字段。
%连接访问地址csa。AccessAddress ='8e89bed6';%使用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'为前100个连接事件选择通道索引。将选定的通道绘制出来,并与‘算法#2’的通道进行比较。
'算法#1'的系统对象csa = bleChannelSelection;%100个连接事件numconnectionEvents = 100;hopsequence = zeros(1,numconnectionEvents);%为100个连接事件生成通道跳转序列为i = 1:numConnectionEvents hopSequence(i) = csa();结尾
的helperBLEPlotChannelHopSequence函数绘制跳跃模式,并输出所选通道的直方图。
HelperbleplotChannelhopequence(CSA,Hopsequence);
下面的代码使用“算法#2”为前100个连接事件生成通道索引。将选定的通道绘制出来,并与‘算法#1’的通道进行比较。
'算法#2'的系统对象CSA = BlechAnnelselection('算法'2);%100个连接事件numconnectionEvents = 100;hopsequence = zeros(1,numconnectionEvents);%为100个连接事件生成通道跳转序列为i = 1:numConnectionEvents hopSequence(i) = csa();结尾
的helperBLEPlotChannelHopSequence函数绘制跳跃模式,并输出所选通道的直方图。
HelperbleplotChannelhopequence(CSA,Hopsequence);
算法#1 VS算法#2
上面的绘图显示了两种算法之间的差异。
算法#1是一个简单的增量算法,它产生一个统一的通道序列。在选择新通道的过程中没有随机化。
算法#2在蓝牙核心规范的5.0版本中被引入[1].与算法#1相比,这更复杂并产生随机的通道序列。
这个例子演示了蓝牙核心规范中指定的信道选择算法的行为[1].
示例中使用了这个特性:
blechannelselection.
:创建用于选择新数据通道以发送数据包的系统对象
这个例子使用了这些助手:
helperBLEChannelHopSelectionUI: helperBLEChannelHopSelectionUI图的脚本
helperBLEPlotChannelHopSequence:绘制给定算法的信道跳频序列
Bluetooth®技术网站。“蓝牙技术网站|蓝牙技术的官方网站。”2020年7月8日访问。https://www.bluetooth.com/.