第22章 HarmonyOs开发图解之 蓝牙
HarmonyOS 学习系统 | 阶段四:专业精通期
学习目标
| 序号 | 能力 |
|---|---|
| 1 | 理解传统蓝牙与 BLE(低功耗蓝牙)的核心区别 |
| 2 | 掌握蓝牙设备扫描、发现、配对的标准流程 |
| 3 | 能够实现 BLE 中心设备和外围设备的基本通信 |
核心图解

内容讲解
22.1 蓝牙概述
HarmonyOS 的蓝牙模块支持传统蓝牙(Bluetooth 3.0 以下)和 BLE(Bluetooth Low Energy 4.0+)两种模式。传统蓝牙适合大数据量传输(文件、音频流),BLE 适合低功耗小数据交互(传感器、心率带)。
生活化类比:BLE 就像"对讲机"
传统蓝牙(Bluetooth 3.0 以下)就像打一通长电话------建立连接后持续占用线路,耗电量大但传输稳定,适合传文件、听音乐。BLE(Bluetooth Low Energy 4.0+)就像对讲机------平时不耗电,有事才"按住说话"发一小段数据,功耗极低,适合心率手环、温度传感器等场景。一台设备可以同时扮演"中心设备"(对讲机的主人,负责扫描)和"外围设备"(对讲机的频道,负责广播)两种角色。
22.2 传统蓝牙 vs BLE 对比
| 特性 | 传统蓝牙(< 3.0) | BLE(4.0+) |
|---|---|---|
| 功耗 | 较高(持续连接) | 极低(间歇连接) |
| 数据传输 | 大文件、音频流 | 小数据包、传感器数据 |
| 连接方式 | 配对后长连接 | GATT 连接,可快速断开 |
| 典型设备 | 耳机、音箱、车载 | 手环、心率带、门锁 |
| 管理类 | BluetoothHost | BleCentralManager / BleAdvertiser |
| 配对方式 | PIN 码 / 简单配对 | 无需配对(可直连) |
22.3 传统蓝牙开发
java
// 1. 初始化蓝牙
BluetoothHost bluetoothHost = BluetoothHost.getDefaultHost(context);
bluetoothHost.enableBt(); // 打开蓝牙
// 2. 扫描周边设备
bluetoothHost.startBtDiscovery();
// 3. 注册广播接收扫描结果
MatchingSkills skills = new MatchingSkills();
skills.addEvent(CommonEventData.CommonEventToDevice.EVENT_DEVICE_DISCOVERED);
CommonEventSubscriber subscriber = new CommonEventSubscriber(skills) {
@Override
public void onReceiveEvent(CommonEventData commonEventData) {
BluetoothRemoteDevice device =
(BluetoothRemoteDevice) commonEventData.getIntent()
.getSequenceableParam(ParamAttr.PARAM_DEVICE);
HiLog.info(TAG, "发现设备: " + device.getDeviceName()
+ " " + device.getDeviceAddr());
}
};
// 4. 向设备发起配对
BluetoothRemoteDevice remoteDevice = bluetoothHost.getRemoteDevice(macAddress);
remoteDevice.startPair();
// 5. 获取已配对设备列表
List<BluetoothRemoteDevice> pairedDevices = bluetoothHost.getPairedDevices();
22.4 BLE 扫描与广播
java
// BLE 中心设备:扫描
BleCentralManager centralManager = new BleCentralManager(context, bleCallback);
BleScanCallbacks scanCallback = new BleScanCallbacks() {
@Override
public void onScanResult(BleScanResult result) {
HiLog.info(TAG, "BLE设备: " + result.getDevice().getDeviceAddr()
+ ", RSSI: " + result.getRssi());
}
};
centralManager.startScan(filters, scanCallback);
// BLE 外围设备:广播
BleAdvertiser advertiser = new BleAdvertiser(context);
BleAdvertiseSettings settings = new BleAdvertiseSettings.Builder()
.setConnectable(true)
.build();
BleAdvertiseData data = new BleAdvertiseData.Builder()
.addServiceUuid(uuid)
.build();
advertiser.startAdvertising(settings, data, advCallback);
代码速查卡
| API | 功能 | 示例 |
|---|---|---|
getDefaultHost(context) |
获取蓝牙本机管理对象 | BluetoothHost.getDefaultHost(context) |
enableBt() / disableBt() |
打开/关闭蓝牙 | bluetoothHost.enableBt() |
startBtDiscovery() |
扫描周边蓝牙设备 | bluetoothHost.startBtDiscovery() |
getPairedDevices() |
获取已配对设备列表 | bluetoothHost.getPairedDevices() |
startPair() |
向远端设备发起配对 | remoteDevice.startPair() |
startScan(filters, callback) |
启动 BLE 扫描 | centralManager.startScan(filters, cb) |
startAdvertising(settings, data, cb) |
启动 BLE 广播 | advertiser.startAdvertising(...) |
getDeviceAddr() |
获取远端设备 MAC 地址 | device.getDeviceAddr() |
与 Android/iOS 对比
| 特性 | HarmonyOS | Android | iOS |
|---|---|---|---|
| 蓝牙管理 | BluetoothHost | BluetoothAdapter | CBCentralManager |
| BLE 扫描 | BleCentralManager | BluetoothLeScanner | CBCentralManager |
| BLE 广播 | BleAdvertiser | BluetoothLeAdvertiser | CBPeripheralManager |
| GATT 操作 | GattClientDevice / GattServerDevice | BluetoothGatt | CBPeripheral / CBPeripheralManager |
| 配对流程 | startPair() | createBond() | 配对由系统自动处理 |
⚠️ 踩坑回忆录
BLE 广播为什么总是 failed?
我第一次调用 startAdvertising() 时,回调一直返回 failed。后来发现是因为同时在用 BLE 扫描,而某些设备不支持同时进行扫描和广播。正确做法是先停止扫描再开始广播。
还有一个坑:蓝牙扫描需要 ohos.permission.LOCATION 权限(系统需要位置权限才能扫描到蓝牙设备的信号强度),很多人以为只有 GPS 才需要位置权限。没有这个权限,扫描回调永远触发不了。
必做实操任务
| 序号 | 任务 | 难度 |
|---|---|---|
| 1 | 实现蓝牙开关控制和设备扫描列表 | 中 |
| 2 | 实现蓝牙设备配对功能 | 中 |
| 3 | 实现 BLE 扫描并展示周边 BLE 设备 | 高 |
| 4 | 实现 BLE 广播并让另一台设备发现 | 高 |
| 5 | 实现 BLE GATT 读写特征值通信 | 高 |
学习检查清单
- 能说出传统蓝牙和 BLE 的核心区别(功耗/数据量/连接方式)
- 能实现蓝牙设备扫描和发现
- 能实现蓝牙设备配对
- 能实现 BLE 中心设备扫描
- 能实现 BLE 外围设备广播
- 知道蓝牙扫描需要 LOCATION 权限
- 知道部分设备不支持同时 BLE 扫描和广播
- 能说出 GATT 协议的基本概念(Service / Characteristic / Descriptor)
进阶方向
- 深入学习 BLE GATT 协议,实现自定义 Service 和 Characteristic
- 结合传感器数据,实现蓝牙心率监测 App
- 探索蓝牙 Mesh 网络组网能力 GATT 协议的基本概念(Service / Characteristic / Descriptor)
进阶方向
- 深入学习 BLE GATT 协议,实现自定义 Service 和 Characteristic
- 结合传感器数据,实现蓝牙心率监测 App
- 探索蓝牙 Mesh 网络组网能力