Peripheral — 是 Bluetooth Low Energy 架构中的一种设备,通过 advertising 数据包广播其服务并等待 Central 的连接。在 IoT 生态系统中,Peripheral 通常是功耗受限的设备:温度传感器、智能灯泡、健身手环、信标(Beacon)。Bluetooth Core Specification 5.4(2023)定义了广播协议:Peripheral 定期发送包含设备名称、服务列表和用户数据的 advertising 数据包,而 Central 扫描这些数据包并决定是否连接。建立连接后,Peripheral 充当 GATT 服务器,提供服务和特征用于读写。
要点
Peripheral — 是一种 BLE 设备,实现 GATT 服务器并通过 advertising 信道广播其能力。与主动搜索设备的 Central 不同,Peripheral 被动等待连接。这是一种非对称模型,针对电池供电设备的能效进行了优化。
Peripheral 可以处于多种模式:advertising(广播)、connected(已连接到 Central)、sleeping(睡眠且广播关闭)。在广播模式下,Peripheral 定期发送短数据包,消耗最少的能量。连接后,Peripheral 进入 connected 模式,根据约定的连接间隔与 Central 交换数据。
根据 Bluetooth Core Specification 5.4(2023),设备可以在 Peripheral 和 Central 角色之间动态切换,但在每个时刻,对于一个连接,角色是固定的。典型场景:IoT 传感器始终以 Peripheral 角色工作,智能手机作为 Central 管理连接。
对于开发者来说,理解这一点很重要:Peripheral 确定哪些服务和特征可用并管理对它们的访问。Peripheral 上的 GATT 服务器结构决定了 Central 可以读取哪些数据以及可以写入哪些命令。
Advertising(广播) — 是 Peripheral 宣布其存在的机制。Peripheral 在三个专用信道(37、38、39)上以 20 毫秒到 10.24 秒的间隔发送 advertising 数据包。每个广播数据包包含固定信息,并可以包含可选数据。
有两种类型的广播数据包:advertising PDU(主数据包)和 scan response PDU(对 Central 请求的响应)。主数据包包含必填字段:数据包类型、发送方地址、数据。如果 Central 发送扫描请求(scan request),Peripheral 会以包含更完整信息(例如完整设备名称)的附加数据包进行响应。
广播参数影响检测速度和功耗。Advertising interval — 数据包发送之间的时间。间隔越短,Central 检测设备越快,但 Peripheral 消耗的能量越多。建议间隔:对于大多数设备为 100–1000 毫秒。
| 参数 | 范围 | 影响 | 建议 |
|---|---|---|---|
| Advertising Interval | 20 ms – 10.24 s | 检测速度,能量 | 100–1000 ms 以保持平衡 |
| Advertising Channels | 37, 38, 39 | 检测可靠性 | 所有 3 个信道必须 |
| Tx Power | −20 – +10 dBm | 距离,干扰 | 室内使用 0 dBm,室外使用 +4 dBm |
| Advertising Timeout | 0 – 180 秒 | 广播持续时间 | 信标使用 0(无限) |
BLE 广播数据包对于 advertising PDU 有 31 字节的限制,对于 scan response 另有 31 字节。在数据包内部,数据以 AD Structure(Advertising Data Structure)格式组织:每个字段包含类型(1 字节)、长度(1 字节)和值。
最常用的 AD Type:Flags(0x01)——连接和检测模式,Local Name(0x08 或 0x09)——设备名称,Service UUID List(0x02–0x07)——服务 UUID 列表,Manufacturer Specific Data(0xFF)——制造商数据。将数据正确打包到 31 字节的数据包中是嵌入式设备开发人员的重要任务。
对于需要传输更多数据的设备,存在extended advertising(BLE 5.0+),它将广播数据包大小增加到 251 字节并添加新的数据包类型。Extended advertising 还支持编码信道(coded PHY),以在开放区域将范围扩展到 1 公里。
在设计广播数据包时要注意:广播数据包中的数据越多,与其他设备发生冲突的可能性就越高。为了快速检测,建议仅在 advertising PDU 中放置关键数据(Service UUID),而将附加数据放在 scan response 中。
GATT 服务器在 Peripheral 上包含 Central 可以发现和交互的所有服务和特征。连接后,Central 发现服务(discover services),然后发现特征(discover characteristics)并通过 GATT 协议与之交互。
Peripheral 作为 GATT 服务器必须正确处理 Central 的请求:读取(read request)、写入(write request)、通知(notification)和确认通知(indication)。每个请求通过GATT 表,其中每个属性(服务、特征、描述符)对应一个 Handle——一个 16 位地址。
Peripheral 开发人员确定每个属性的访问权限:只读、只写、读写、加密或不加密。对于机密数据(个人信息、医疗参数),建议通过 MITM Protection 要求加密。
CBPeripheralManager — 用于在 iOS 上实现 Peripheral 角色的 Core Bluetooth 类。它管理 GATT 服务器,发布服务和特征,处理来自 Central 的请求。与 CBCentralManager 不同,CBPeripheralManager 不扫描——它只广播和服务连接。
在 iOS 上实现 Peripheral 的主要步骤:初始化 CBPeripheralManager,通过 add 添加服务,通过 startAdvertising 启动广播,通过委托 CBPeripheralManagerDelegate 处理来自 Central 的请求。
import CoreBluetooth
class BLEPeripheralManager: NSObject, CBPeripheralManagerDelegate {
private var peripheralManager: CBPeripheralManager!
func startAdvertising() {
let advertisementData: [String: Any] = [
CBAdvertisementDataLocalNameKey: "BLE Sensor",
CBAdvertisementDataServiceUUIDsKey: [
CBUUID("180F")
]
]
peripheralManager.startAdvertising(advertisementData)
}
func peripheralManagerDidUpdateState(
_ peripheral: CBPeripheralManager
) {
if peripheral.state == .poweredOn {
startAdvertising()
}
}
}
当 Background Modes 中存在 bluetooth-peripheral 键时,iOS 允许 Peripheral 在后台模式下工作。在后台,iOS 可以使用有限的数据集进行广播和服务连接。对于长时间广播(超过 180 秒),请使用 CBAdvertisementDataWaitForResponseFromCentral 选项以节省能源。
Android 提供 BluetoothLeAdvertiser 用于在 Peripheral 角色中工作(从 API 21 开始)。该 API 允许使用可配置的参数启动广播:发射器功率、广播间隔、数据包数据。Android 还在兼容设备上支持 extended advertising(BLE 5.0)。
import android.bluetooth.le.*;
private BluetoothLeAdvertiser advertiser;
public void startPeripheral() {
BluetoothAdapter adapter =
BluetoothAdapter.getDefaultAdapter();
advertiser = adapter.getBluetoothLeAdvertiser();
AdvertiseData data = new AdvertiseData.Builder()
.setIncludeDeviceName(true)
.addServiceUuid(
new ParcelUuid(
UUID.fromString("0000180F-0000-1000-8000-00805F9B34FB")
)
)
.build();
AdvertiseSettings settings = new AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
.build();
advertiser.startAdvertising(
settings, data, advertiseCallback
);
}
在 Android 上,对 Peripheral 的支持取决于制造商和操作系统版本。并非所有设备都支持 BluetoothLeAdvertiser——通过 adapter.isMultipleAdvertisementSupported() 进行检查。从 Android 10 开始,在 Peripheral 角色中工作需要 BLUETOOTH_ADVERTISE 权限,以及 target SDK 31+ 应用程序的运行时请求。
能效 — 是 BLE 的关键优势,而 Peripheral 在其中扮演主要角色。由于优化的功耗,设备可以在 CR2032 电池(220 mAh)上运行超过一年。Peripheral 大部分时间处于广播关闭的睡眠模式,仅在发送广播数据包或处理来自 Central 的请求时唤醒。
Peripheral 在不同模式下的功耗:睡眠模式(深度睡眠)——1–5 µA,定时器开启的空闲模式——10–50 µA,广播——5–15 mA(在数据包发送期间),已连接——5–10 mA(在连接事件期间)。在广播间隔 1000 毫秒和数据包持续时间 4 毫秒时,平均电流约为 50–100 µA。
根据 Texas Instruments Application Report (SWRA478, 2024),将广播间隔从 100 毫秒优化到 1000 毫秒可将平均功耗降低 90%。通过使用从机延迟(slave latency,跳过连接事件)、在短距离内降低 Tx Power 以及在连接后关闭广播(可连接广播),可以实现额外的节能。
常见问题
可以,通过通知(Notify/Indicate)机制。虽然连接的发起者始终是 Central,但在连接后,Peripheral 可以通过 GATT 通知发送数据,无需 Central 显式请求。为此,Central 必须事先通过 CCCD 进行订阅。
广播持续时间不受规范限制,但实际上受电池能量限制。在 iOS 上,Peripheral 在后台每次会话最多广播 180 秒,无需额外设置。在 Android 上,广播可以无限期工作,但会显著缩短自主工作时间。
增加广播间隔(建议 500–1000 毫秒),使用从机延迟跳过连接事件,连接后关闭广播,并选择在所需距离上稳定通信所需的最小 Tx Power。
不可连接广播(non-connectable advertising)——是 Peripheral 广播但不接受连接请求的模式。用于仅传输数据(例如商店标识符)而不建立双向连接的信标。与可连接广播相比,节省能源。
31 字节中可以包含:标志(3 字节)、设备名称(缩写形式最多 28 字节)、服务 UUID 列表(每个 UUID 2–16 字节)、制造商数据(最多 26 字节)。最佳策略——将服务 UUID 放在 advertising PDU 中以进行过滤,将完整名称放在 scan response 中。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。