这个例子展示了如何使用蓝牙®低能量(BLE)核心规范中指定的信道选择算法来选择信道索引[1使用用于蓝牙协议的通信工具箱™库。
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
算法2
两种信道选择算法避免了容易出现传输错误的信道。在主设备和从设备之间交换通道映射。这个映射表示好的和坏的数据通道。好的和坏的数据通道的分类是依赖于实现的,可以根据各种参数,如信噪比(SNR), PER(包错误率)等来完成。只有良好的数据通道用于设备之间的通信。如果主设备识别到任何错误的数据通道,则通道映射将由主设备更新。两种通道选择算法使用通道映射来确定所选数据通道是否适合使用。如果选择的数据通道是坏的,则使用通道重映射过程选择一个新的数据通道(见[第4.5.8节,Part-B,卷6]1),将坏数据通道重新映射到一个好的数据通道。每个算法都有自己的重映射过程。
%检查“蓝牙协议的通信工具箱库”%支万博1manbetx持包是否安装。comm万博1manbetxSupportPackageCheck (“蓝牙”);
您可以使用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
您可以使用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
这个函数helperBLEChannelHopSelectionUI提供图形用户界面,以生成分析算法所需的信道跳数。两种信道选择算法都可以使用这个GUI进行分析。它可以用来绘制算法的信道跳变模式,也可以绘制相应的直方图。
helperBLEChannelHopSelectionUI ()
提供样本数据来验证算法#2(见[1])。然而,没有样本数据可用来验证算法#1。
样本数据1(37个良好的数据通道)
访问地址= 8E89BED6
[0:33] [0:33]
当使用上述输入时,算法2将根据[第6卷Part-B, 3.1节,选择以下通道1]
下面的代码为前三个连接事件选择三个通道。
%为算法#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个良好的数据通道)
访问地址= 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 =“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'为前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对象,用于选择新的数据通道来传输数据包
这个例子使用了这些助手:
helperBLEChannelHopSelectionUI: helperBLEChannelHopSelectionUI图的脚本
helperBLEPlotChannelHopSequence:绘制给定算法的信道跳频序列
蓝牙®技术的网站。蓝牙技术网站|蓝牙技术官方网站2020年7月8日通过。https://www.bluetooth.com/.