BLE蓝牙广播入门(一)

本文详细介绍了蓝牙低功耗(BLE)广播的工作原理,包括三层协议结构、物理层的频道分配和广播间隔,以及广播报文的结构和类型。重点讨论了广播间隔的设置对连接速度和可靠性的影响,以及广播报文的PDU报头和净荷内容。通过对BLE广播的理解,有助于优化蓝牙设备的性能和连接质量。
摘要由CSDN通过智能技术生成

一、概述

BLE广播是低功耗蓝牙协议最重要的组成部分之一。深入理解如何使用广播可以有效降低蓝牙模块的功率、提高连接速度以及改善连接的可靠性。

BLE蓝牙协议一共有三层,分别是应用层,主机层和控制器层。

应用层:涵盖与应用程序实现的实际用例相关的所有内容的逻辑、用户界面和数据处理。 应用层协议的架构高度依赖于每个特定用例(use case)。它包括各种各样的配置文件(profile)。配置文件定义了层与层之间(App <-> Host)的垂直交互以及设备之间特定层的对等交互。每个特定用例,例如心率配置文件(HRP),由一项或多项服务(service)组成。
主机层:包括逻辑链路控制与适配协议(Logical Link Control and Adaptation Protocol,即L2CAP),属性协议(Attribute Protocol,即ATT),安全管理(Security Manager,即SM),通用属性配置文件(Generic Attribute Profile,即GATT)和通用访问配置文件(Generic Access Profile,即GAP)。

控制器层:包括物理层(Physical Layer),链路层(Link Layer)。主机与控制器之间通过HCI(Host Controller Interface)接口连接。

二、BLE物理层

BLE频道

BLE物理层的基本特征参数如下:

调制方式GFSK速率1Mbps
通道数量40频带间隙2MHz

BLE的频谱范围时2.402GHz ~ 2.480GHz,一共分为40个频道,每个频道带宽为1MHz,从通道0到通道39,其中通道37,38和39是广播频道,其他是数据通道。最新的BLE规范(5.x),对广播通道进行的扩展,使蓝牙设备也可以在其他通道上发送广播报文。本文主要介绍基本广播通道37,38和39。它们在2.4GHz的频谱范围内的位置如下图所示。

 BLE广播间隔

当一个BLE设备处于广播模式时,它周期性地在每个广播通道上发送广播报文。每两组广播报文之间的时间间隔由一个固定的间隔和一个随机的延时组成,其中固定间隔取值范围是20毫秒到10.24秒,步长为0.625毫秒,随机延时是一个取值范围是0到10毫秒的伪随机值,由系统自动产生并加入到广播间隔中。这主要是用来减少设备之间的信号冲突的几率,提高BLE连接的可靠性。另外需要提醒一下的是,广播间隔和连接间隔不是同一个概念。

虽然广播间隔的取值范围很广,但大部分的设备遵循以下广播间隔取值指引。

  • 小于100毫秒:适用于激进的设备
  • 100 ~ 500毫秒:常用快速广播,适用于大部分设备
  • 1000 ~ 2000毫秒:适用于连接网关且对延时要求不高的设备

三、BLE广播报文

广播报文结构

一个完整的BLE广播报文由四部分组成,分别是前导码、接入地址、协议数据单元和CRC校验码。

  • 前导码:用来同步时序,可以是0x55或者0xAA,由接入地址的第一个比特决定。如果接入地址的第一个比特是“0”,则前导码是0x55;如果接入地址的第一个比特是“1”,则前导码是0xAA。 在广播报文里面,这一字节为0xAA。
  • 接入地址:长度为4个字节,广播报文的接入地址为0x8E89BED6
  • 协议数据单元:包含两个字节的报头和0 ~ 37字节的净荷
  • CRC校验码:长度为3个字节

广播报文之PDU报头

  • PDU Type:PDU类型,标识广播报文的类型
  • RFU:Reserved For Future,保留位
  • TxAdd:发送地址类型,标识广播地址是公有地址还是随机地址
  • RxAdd:接收地址类型,广播报文不使用这一比特
  • Length:长度,标识净荷的长度(6 ~ 37字节)

PDU类型

PDU类型值PDU类型说明
0b0000ADV_IND:通用广播指示可连接到任何主设备
0b0001ADV_DIRECT_IND:定向连接指示与ADV_IND类似,表示可连接到特定主设备
0b0010ADV_NONCONN_IND:不可连接指示不可连接,对周边设备广播
0b0110ADV_SCAN_IND:可扫描指示类似ADV_NONCONN_IND,但可通过扫描响应获得额外的信息
0b0011SCAN_REQ:主动扫描请求由扫描设备主动发送
0b0100SCAN_RSP:主动扫描响应由广播设备发送的扫描响应
0b0101CONNECT_REQ:连接请求由发起设备(主设备)发起连接请求
其他值保留保留

广播报文之PDU净荷

  • AdvA: 广播设备地址,分为公有地址和随机地址。
  1. 公有地址:类似MAC地址,由OUI和一个唯一的数字组成
  2. 随机地址:为了防止设备被跟踪,广播地址可以是随机的。随机地址又分为静态设备地址(Static Device Address)、私有设备地址(Private Device Address)和不可解释私有地址(Non-resolvable Private Address)。
  • AdvData:广播数据,包含N个AD Structure,每个AD Structure由Length,AD Type和AD Data组成
Length (长度)AD Type和AD Data的长度
AD Type (类型)指示AD Data数据的含义
AD Data (数据)广播数据

广播报文之CRC检验码

报文的最后是3个字节的循环冗余校验。CRC对报头、长度域以及净荷域进行计算。该CRC的计算公式如下:

CRC = x^{24} + x^{10} + x^{9} + x^{6} + x^{4} + x^{3} + x^{1} + x^{0}

(未完待续)

要在 Android 设备上发送蓝牙低功耗(BLE广播,你需要执行以下步骤: 1. 获取 BluetoothAdapter 对象并检查是否支持 BLE。可以使用以下代码获取 BluetoothAdapter 对象: ``` BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter(); ``` 2. 创建一个 AdvertiseSettings 对象,用于配置广播的参数。你可以使用以下代码创建 AdvertiseSettings 对象: ``` AdvertiseSettings settings = new AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED) .setConnectable(false) .setTimeout(0) .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM) .build(); ``` 在这个示例中,我们将广播模式设置为平衡模式,使广播更加稳定。我们还将广播设置为不可连接,并将超时设置为 0。 3. 创建一个 AdvertiseData 对象,用于在广播中包含数据。你可以使用以下代码创建 AdvertiseData 对象: ``` AdvertiseData data = new AdvertiseData.Builder() .setIncludeDeviceName(true) .setIncludeTxPowerLevel(false) .addManufacturerData(0x1234, new byte[] { 0x01, 0x02, 0x03 }) .build(); ``` 在这个示例中,我们将设备名称包含在广播中,并添加了一个制造商数据字段。 4. 开始广播。你可以使用以下代码开始广播: ``` bluetoothAdapter.getBluetoothLeAdvertiser().startAdvertising(settings, data, advertisingCallback); ``` 在这个示例中,我们将 AdvertiseSettings 和 AdvertiseData 对象传递给 startAdvertising() 方法,并提供了一个广告回调函数 advertisingCallback。 这些步骤将使你的 Android 设备开始发送 BLE 广播
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值