低功耗蓝牙(BLE)-- advertisements广播篇

为了更方便理解 BLE 中的广播,首先要先了解 BLE 架构中的通用访问配置文件 (GAP)层。

GAP 为BLE 设备相互交互提供了一个框架,包括:

  •         BLE 设备角色
  •         广播(广播、发现、广播参数、广播数据)
  •         扫描
  •         连接建立(发起连接、接受连接、连接参数)
  •         安全相关

BLE 设备有四种主要的 GAP 角色:

Central:发现 BLE 外围设备和广播者的设备,具有连接外围设备的能力。
Peripheral:可以广播,可以接受连接请求。
Broadcaster:广播者是一个纯广播设备
Observer:扫描者是一个纯扫描设备

1.广播信道

图1  信道分配

        BLE设备共40个信道,3个作为主广播信道,其余37个作为数据信道或辅助广播信道。

        次要广播频道用作“辅助”频道,这意味着设备必须先在主要广播频道上做广播,然后才能在次要频道上发送广播数据包。

        如果设备想要使用次要广播通道,它会在主要通道上发送指向次要广播数据包的广播数据包。

2.广播包格式

        PDU 字段是我们感兴趣的。这个字段会根据传输的数据包类型(数据与广播)而变化。

PDU Header

PDU 类型:该字段的长度为 4 位,对于广播包来说,具有以下可能的值:

PDU 根据用途分为多个类别,在我们列出每个 PDU 之前,先介绍一些常用术语:

定向与非定向:定向广告类型接受来自已知对端设备的连接请求,而非定向接受来自任何对端设备的连接请求。

可连接与不可连接:确定广播设备是否允许建立连接。

可扫描与不可扫描:广播设备是否能够处理来自观察者或中央的扫描请求消息。

扩展广告:扩展广播相比传统广播,允许的携带更多数据。

注意:由于蓝牙 5.0以下的设备无法发现扩展广播,建议广播者也使用带有传统广播 PDU 的广播集,以便较旧的扫描设备能够发现终端设备。广播集用于同时发送不同类型的广播事件。每个广播集都会有不同的广播参数,例如广播 PDU 类型、广播间隔和 PHY。

周期广播:蓝牙 5 .0开始支持的扩展广播的另一个功能是周期广播。这用于在两个未连接的设备之间的设定时间段内向设备广播数据包,这意味着多个设备可以同时收听这些周期广播。它们由以固定间隔发送的广播组成,广播数据内容不时变化。

Legacy Advertising PDUs

这些适用于所有蓝牙版本 - 支持向后兼容,并用于主要广播信道。

ADV_IND:可连接的可扫描非定向广播。
ADV_DIRECT_IND:可连接的定向广播
ADV_NONCONN_IND:不可连接不可扫描非定向广播
ADV_SCAN_IND:可扫描非定向广播

Extended Advertising PDUs

这些类型是在蓝牙5.0 中引入的。 除了主要广播信道之外,它们还为设备提供了在次要广播信道上做广播的选项。 辅助通道的好处是它们允许增加广播数据容量。

ADV_EXT_IND:扩展广播(用于除 Connectable Scannable Undirected 之外的所有广播类型)——在主要广播信道上发送。
AUX_ADV_IND:扩展广播(用于除 Connectable Scannable Undirected 之外的所有广播类型)——在辅助广播信道上发送。
AUX_SCAN_IND:用于周期广播。
AUX_CHAIN_IND:与其他广播类型一起使用以保存额外的广播数据。

RFU:保留以备将来使用

ChSel:如果广播者支持 LE 信道选择算法 #2 功能,则该位将设置为 1。

TxAdd:如果广播者的地址是随机的,则该位设置为 1,如果地址是公共的,则该位设置为 0

RxAdd:如果目标设备的地址是随机的,则该位设置为 1,如果地址是公共的,则设置为 0

Length:保存数据包有效载荷的长度。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用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通信的基本过程。在实际应用中,您需要根据设备的具体规格和特性来编写更复杂的代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值