第22章_HarmonyOs开发图解之 蓝牙

第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 网络组网能力
相关推荐
无人生还1 小时前
从 Vue3 到 React · 快速上手系列第 9 篇:自定义 Hook(对标 Composables)
前端·vue.js·react.js
别怪我很水2 小时前
Vue element admin 浏览器本地存储 localStorage、useStorage
前端·javascript·vue.js
猫猫不是喵喵.13 小时前
Vue3 Props 属性
前端·javascript·vue.js
小罗水20 小时前
第17章 后台管理端与演示支持
javascript·vue.js·ecmascript
猫猫不是喵喵.1 天前
Vue3 中 computed 计算属性与 watch、watchEffect 监听
前端·javascript·vue.js
En^_^Joy1 天前
Vue项目创建与入口配置全攻略
前端·vue.js·arcgis
猫猫不是喵喵.1 天前
Vue2 的 Vuex 状态管理与 Vue3 的 Pinia 状态管理
前端·javascript·vue.js
林焱_RPAAI2 天前
影刀RPA技术深度:CSS选择器高级实战指南——伪类属性选择器与性能对比完全解析
vue.js·react.js
陳陈陳2 天前
🚀 前端流式输出革命:SSE + BFF 架构从零到一实战指南
vue.js·架构·node.js