Central — 是蓝牙低能耗架构中的一种设备,它发起扫描、建立连接并管理与外围设备的数据交换。在移动开发的背景下,Central是运行iOS或Android的智能手机或平板电脑,连接BLE传感器、健身追踪器和智能配件。根据蓝牙核心规范5.4(2023),Central最多可以同时支持7个与不同Peripheral的连接,尽管实际限制取决于芯片制造商和操作系统版本。iOS上的Core Bluetooth和Android上的android.bluetooth.le提供了用于管理Central角色的完整API。
要点
Central — 是蓝牙低能耗架构中的GATT客户端,发起所有通信。与被动等待连接并广播其服务的Peripheral不同,Central主动扫描空中信号,检测广播数据包并发起连接。
Central-Peripheral的不对称模型是BLE的基本特征。Central管理交互逻辑:决定连接到哪个设备、检查哪些服务、读取和写入哪些特征。Peripheral扮演数据服务器的角色——存储服务和特征,但不发起连接。
根据蓝牙核心规范5.4(2023),一个设备可以同时是Central和Peripheral(双角色)。例如,智能手机可以是健身手环的Central,也可以是传输文件的另一台手机的Peripheral。然而,同时在两个角色中工作会增加能源消耗和连接管理的复杂性。
在移动开发生态系统中,Central角色是最常见的场景。智能手机上的应用搜索BLE设备(传感器、耳机、手环),连接到它们并接收数据。开发者使用操作系统的API与Central一起工作:iOS中的CBCentralManager,Android中的BluetoothLeScanner和BluetoothGatt。
扫描 — 是Central工作的第一阶段。设备监听BLE无线电信道(37、38、39)以检测Peripheral定期发送的广播数据包。每个广播数据包包含设备名称、服务UUID列表和用户数据。
Central可以在两种扫描模式下工作:被动扫描(仅接收广播数据包)和主动扫描(发送扫描请求以通过扫描响应获取额外数据)。被动扫描节省能源,但提供的信息较少。主动扫描可以获取广播数据包的完整数据,包括设备名称和完整的服务列表。
基于UUID的过滤——一项重要的优化。Central可以只扫描具有特定Service UUID的设备,忽略其他设备。这不仅节省能源,还简化了应用逻辑:委托只接收相关设备。
import CoreBluetooth
class BLECentralManager: NSObject, CBCentralManagerDelegate {
private var centralManager: CBCentralManager!
override init() {
super.init()
centralManager = CBCentralManager(
delegate: self,
queue: nil
)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(
withServices: nil,
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
}
连接管理 — Central的主要职责。在检测到合适的Peripheral后,Central发起连接。BLE连接通过连接建立过程建立,包括参数交换:连接间隔、从机延迟和监督超时。
连接间隔决定了Central和Peripheral在连接后交换数据的频率。间隔范围从7.5毫秒到4秒。间隔越短,带宽越高,但能耗也越高。从机延迟允许Peripheral跳过多个连接事件以节省能源。监督超时——无响应的最长时间,超过此时间连接被视为丢失。
Central负责在数据交换完成后断开连接。BLE设备通常不保持永久连接——Central连接、接收数据并断开。这是IoT传感器的标准模式:Central扫描、找到温度传感器、连接、读取值并断开。
| 参数 | 范围 | 目的 | 建议 |
|---|---|---|---|
| Connection Interval | 7.5 ms – 4 s | 数据交换频率 | 流数据30–50 ms,低频数据1–4 s |
| Slave Latency | 0–499个事件 | Peripheral跳过事件 | 传感器节能4–10 |
| Supervision Timeout | 100 ms – 32 s | 连接丢失超时 | 大多数场景6–10秒 |
| MTU | 23–517字节 | ATT数据包大小 | 连接时请求最大值 |
Core Bluetooth — Apple在iOS和macOS上用于BLE操作的框架。CBCentralManager类提供用于实现Central角色的完整API:扫描、连接、连接管理。iOS中与Central的工作基于委托模型:CBCentralManagerDelegate接收状态变化、设备检测和连接结果的事件。
iOS中Central工作的主要步骤:初始化CBCentralManager、检查蓝牙状态、启动扫描、通过委托处理检测到的设备、连接到选定的Peripheral、检测服务和特征、数据交换。
// 连接到发现的Peripheral
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// 保留对peripheral的引用并连接
discoveredPeripheral = peripheral
central.connect(peripheral, options: nil)
}
// 连接成功
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
iOS限制了BLE的后台工作:在后台模式下,应用只能使用Info.plist中的特定键进行扫描,连接的设备可以通知Central数据变化。对于关键应用(医疗设备),请使用带有bluetooth-central键的Background Modes。
Android提供BluetoothLeScanner API用于扫描BLE设备和BluetoothGatt用于管理连接。从Android 5.0(API 21)开始,BluetoothLeScanner取代了已弃用的startLeScan。该API需要BLUETOOTH、BLUETOOTH_ADMIN和ACCESS_FINE_LOCATION(或Android 10+的ACCESS_BACKGROUND_LOCATION)权限。
import android.bluetooth.le.*;
import android.bluetooth.*;
private BluetoothLeScanner scanner;
private BluetoothGatt bluetoothGatt;
// 配置扫描
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
// 开始扫描
scanner.startScan(null, settings, new ScanCallback() {
@Override
public void onScanResult(
int callbackType,
ScanResult result
) {
BluetoothDevice device = result.getDevice();
// 连接到设备
bluetoothGatt = device.connectGatt(
context, false, gattCallback
);
}
});
在Android中,必须考虑扫描限制:从Android 7(API 24)开始,在不使用Location的应用中,扫描不能在30秒内启动超过5次。Android 12+需要BLUETOOTH_SCAN、BLUETOOTH_CONNECT和ADVERTISE权限,以及这些权限的运行时请求。
Central的能耗高于Peripheral,因为需要持续扫描无线电信道。Central通过BLE数据包接收数据、处理数据、管理连接,并经常在应用处理器上执行计算。根据蓝牙SIG,扫描消耗30 mA到100 mA,取决于模式。
Central有几种节能策略。间隔扫描 — 最有效的方法:Central在短窗口(扫描窗口)中扫描,间隔长暂停(扫描间隔)。例如,当扫描窗口为30毫秒、扫描间隔为1000毫秒时,能耗与连续扫描相比降低了97%。
额外优化 — 基于UUID的过滤。Central更快地只处理相关的广播数据包,忽略其他包。这减少了处理器负载并延长了设备的电池寿命。也建议在检测到所需设备后立即停止扫描,并且不要保持连接超过必要的时间。
常见问题
是的,BLE支持双角色:一个设备可以同时作为某些设备的Central和其他设备的Peripheral。例如,智能手机从传感器读取数据(作为Central),同时广播自己的服务(作为Peripheral)以将数据传输到另一个设备。
BLE规范定义了一个Central的7个连接限制。在实践中,限制取决于芯片制造商:Nordic nRF52840芯片支持多达20个连接,而一些低成本蓝牙适配器不超过3-4个。
原因可能不同:传感器没有广播(不在advertising模式)、UUID过滤器过于严格、智能手机上的蓝牙已关闭、缺少必要的权限(Android上的Location)或传感器超出范围(室内建议最多10米)。
不一定。对于许多场景,使用连接-读取模式:Central扫描、连接、读取必要数据并断开连接。永久连接仅用于流数据(脉搏、心电图)或实时设备控制。
使用间隔扫描,扫描窗口30-50毫秒,扫描间隔500-1000毫秒。根据UUID过滤设备,只处理相关的广播数据包。检测到所需的Peripheral后立即停止扫描。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。