第22章_HarmonyOs开发图解之 蓝牙

118 阅读4分钟

第22章 HarmonyOs开发图解之 蓝牙

HarmonyOS 学习系统 | 阶段四:专业精通期


学习目标

序号能力
1理解传统蓝牙与 BLE(低功耗蓝牙)的核心区别
2掌握蓝牙设备扫描、发现、配对的标准流程
3能够实现 BLE 中心设备和外围设备的基本通信

核心图解

HarmonyOS 网络通信协议栈图

内容讲解

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 连接,可快速断开
典型设备耳机、音箱、车载手环、心率带、门锁
管理类BluetoothHostBleCentralManager / BleAdvertiser
配对方式PIN 码 / 简单配对无需配对(可直连)

22.3 传统蓝牙开发

// 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 扫描与广播

// 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 对比

特性HarmonyOSAndroidiOS
蓝牙管理BluetoothHostBluetoothAdapterCBCentralManager
BLE 扫描BleCentralManagerBluetoothLeScannerCBCentralManager
BLE 广播BleAdvertiserBluetoothLeAdvertiserCBPeripheralManager
GATT 操作GattClientDevice / GattServerDeviceBluetoothGattCBPeripheral / 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 网络组网能力