低功耗蓝牙(BLE)的信道划分及跳频机制 #理论与现实#

无线电"跳频技术"的发明人是曾就读通信专业的影视明星海蒂·拉玛(Hedy Lamarr)和钢琴作曲家乔治·安太尔(George Antheil), 二战期间她们受到自动钢琴原理的启发研制出"频率跳变"装置并申请了专利,此技术最早用于鱼雷无线控制系统中,用于防止干扰和被追踪,后来此技术广泛应用于包括蓝牙、Wi-Fi在内的各种现代无线电通信系统中。海蒂·拉玛精美绝伦、跌宕起伏的人生之谱落下休止符多年后,她发明的跳频技术依然在人世间铿锵激荡、翩跹而舞。

海蒂·拉玛

低功耗蓝牙的信道划分

蓝牙无线技术工作于无需频谱授权的2.4GHz ISM(工业、科学、医疗)频段,该频段的可用频率范围为2400MHz到2483.5MHz。低功耗蓝牙在2.4GHz ISM频段上定义了40个射频信道,从2402MHz开始每间隔2MHz一个信道,最高信道频率为2480MHz。这些射频信道进一步被划分为3个主广播信道和37个一般用途信道,其中主广播信道用于连接前的初始广播及所有传统广播活动,一般用途信道则主要用于设备间的数据通信。每一个射频信道被分配了唯一的信道索引。

下表显示了射频信道与物理信道索引的映射关系,表中的●表示此射频信道及物理信道索引在特定用途中被使用。由于主广播不在LE 2M模式下发送因而3个主广播信道不会在LE 2M模式中被使用。

射频信道与物理信道索引间的映射

下图中3个以绿色标示的信道为主广播信道,37个以蓝色标示的信道为一般用途信道。中间的数字显示每一个射频信道的物理信道索引,下方显示的是每一个射频信道的中心频率值。

低功耗蓝牙的跳频机制 - #1信道选择算法

低功耗蓝牙有两种跳频机制,一种是自低功耗蓝牙诞生以来就有的#1信道选择算法,另一种是蓝牙5.0版本引入的#2信道选择算法。两种跳频机制都基于信道地图(Channel Map)及一定的算法实现每一个通信事件(或子事件)的载波频率在所有可用物理信道之间跳变,以达到随机使用各个可用信道并提高抗干扰性的目的。本文仅介绍所有低功耗蓝牙都支持的#1信道选择算法。

信道地图对每一个物理信道的可用性进行分类标注为可用或不可用。对于标注为不可用的物理信道在跳频时不予选用。信道地图由低功耗蓝牙连接中的中心设备(指发起连接的设备, 在蓝牙5.3版本之前被称为主设备-Master)绘制并提供给与其相连接的周边设备(在蓝牙5.3版本之前被称为从设备-Slave)。每一个物理信道的可用性由芯片控制器通过主动或被动电磁环境评估来确定,或由芯片的主机层提供信息,周边设备也可向中心设备发送物理信道可用性报告(蓝牙5.3版本新增的特性),但最终的信道地图均统一由中心设备更新并通知与其相连接的周边设备。

低功耗蓝牙#1信道选择算法的具体流程如下:

  1. 基本跳频算法: fn+1 = (fn + hop) mod 37,fn为上一次连接事件使用的信道索引(初始连接时此值为0);fn+1为首次计算得到的下一次连接事件使用的信道索引;hop为跳频参数值,取值范围为5到16,由中心设备决定并在发起连接时通知与其连接的周边设备;mod为求余运算符。
  2. 根据以上基本跳频算法计算后当fn+1为信道地图中的可用信道时则直接使用。
  3. 根据以上跳频算法计算后当fn+1为信道地图中的不可用信道时则按以下重新计算算法进行计算。
  4. 重新计算算法: fnew = fn+1 mod N, fnew为重新计算得到的下一次连接事件使用的信道编号(信道地图中的可用信道从0开始升序编号), N指可用信道数量。

#1信道选择算法如下图如示:

#1信道选择算法示例一:

  1. 设fn=28, hop=7, 信道地图中的可用信道=[9, 10, 21, 22, 23, 33, 34, 35, 36]
  2. fn+1=(28+7) mod 37=35, 因为35是可用信道,直接使用
  3. 下一次连接事件使用信道索引为35的信道,即2476MHz

#1信道选择算法示例二:

  1. 设fn=0, hop=7, 信道地图中的可用信道=[9, 10, 21, 22, 23, 33, 34, 35, 36]
  2. fn+1=(0 + 7) mod 37=7, 因为7为不可用信道,需要重新计算
  3. fnew=7 mod 9 (可用频道数) = 7, 则fnew= 编号为7的可用信道=35
  4. 下一次连接事件使用信道索引为35的信道,即2476MHz

现实极限条件下的跳频图谱

电磁环境评估没有侦测到任何干扰的条件下37个一般用途信道都为可用信道,信道索引0~36在跳频序列中随机被使用:

当电磁环境评估侦测到存在Wi-Fi信道1(中心频率为2412MHz)干扰的条件下信道索引0~8在信道地图中被标示为不可用,在跳频中不使用信道索引0~8:

当电磁环境评估侦测到存在Wi-Fi信道6(中心频率为2437MHz)干扰的条件下信道索引11~20在信道地图中被标示为不可用,在跳频中不使用信道索引11~20:

当电磁环境评估侦测到存在Wi-Fi信道11(中心频率为2462MHz)干扰的条件下信道索引24~32在信道地图中被标示为不可用,在跳频中不使用信道索引24~32:

当电磁环境评估侦测到存在Wi-Fi信道1(中心频率为2412MHz)和Wi-Fi信道11(中心频率为2462MHz)干扰的条件下,信道索引0~8和24~32在信道地图中被标示为不可用,在跳频中不使用信道索引0~8和24~32:

当电磁环境评估侦测到存在Wi-Fi信道1(中心频率为2412MHz)、Wi-Fi信道6(中心频率为2437MHz)、Wi-Fi信道11(中心频率为2462MHz)干扰的条件下,仅信道索引9,10,21,22,23,33,34,35,36(共计9个信道)在信道地图中被标示为可用,在跳频中仅使用这些信道索引:

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用C#实现低功耗蓝牙BLE数据读写功能的示例代码: ```C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.Devices.Bluetooth; using Windows.Devices.Bluetooth.GenericAttributeProfile; using Windows.Devices.Enumeration; namespace BleCommunication { class Program { static void Main(string[] args) { var task = MainAsync(args); task.Wait(); } static async Task MainAsync(string[] args) { // 查询所有蓝牙设备 string selector = BluetoothLEDevice.GetDeviceSelector(); var devices = await DeviceInformation.FindAllAsync(selector); // 过滤出指定名称的设备 var device = devices.FirstOrDefault(d => d.Name == "My BLE Device"); if (device != null) { // 连接设备 var bleDevice = await BluetoothLEDevice.FromIdAsync(device.Id); // 查询服务 var serviceUuid = Guid.Parse("0000fff0-0000-1000-8000-00805f9b34fb"); var serviceResult = await bleDevice.GetGattServicesForUuidAsync(serviceUuid); var service = serviceResult.Services.FirstOrDefault(); if (service != null) { // 查询特征值 var characteristicUuid = Guid.Parse("0000fff1-0000-1000-8000-00805f9b34fb"); var characteristicResult = await service.GetCharacteristicsForUuidAsync(characteristicUuid); var characteristic = characteristicResult.Characteristics.FirstOrDefault(); if (characteristic != null) { // 订阅特征值通知 var status = await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify); if (status == GattCommunicationStatus.Success) { characteristic.ValueChanged += (sender, args) => { // 处理接收到的数据 var data = args.CharacteristicValue.ToArray(); Console.WriteLine("Received data: {0}", BitConverter.ToString(data)); }; // 发送数据 var dataToSend = new byte[] { 0x01, 0x02, 0x03 }; var writeStatus = await characteristic.WriteValueAsync(dataToSend.AsBuffer()); if (writeStatus == GattCommunicationStatus.Success) { Console.WriteLine("Data sent successfully."); } else { Console.WriteLine("Failed to send data."); } } else { Console.WriteLine("Failed to subscribe to notifications."); } } else { Console.WriteLine("Characteristic not found."); } } else { Console.WriteLine("Service not found."); } } else { Console.WriteLine("Device not found."); } Console.ReadLine(); } } } ``` 请注意,此示例仅用于演示BLE通信的基本过程。在实际应用中,您需要根据设备的具体规格和特性来编写更复杂的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值