HarmonyOS中的BLE广播与扫描:实现低功耗蓝牙通信

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

在智能设备的生态系统中,蓝牙低功耗(BLE)技术因其出色的节能特性和广泛的适用性,成为了众多低功耗设备连接的首选。HarmonyOS Next充分发挥了BLE的优势,为开发者提供了强大的工具和接口,实现设备间高效、低功耗的通信。今天,我们就深入探究HarmonyOS Next中的BLE广播与扫描机制,看看如何利用它们打造低功耗蓝牙通信的精彩应用。

一、BLE在低功耗设备上的应用

BLE技术在智能手表、健康监测设备、智能家居传感器等众多低功耗设备上发挥着关键作用。以智能手表为例,它通过BLE与手机保持连接,实时同步通知、运动数据等信息,而仅消耗极低的电量,确保了长时间的续航能力。健康监测设备如手环、血压计等,利用BLE将采集到的生理数据传输到手机或云端,方便用户随时查看健康状况,同时设备本身可以长时间稳定运行,无需频繁更换电池。在智能家居领域,BLE传感器可以实时监测环境参数(如温度、湿度、门窗状态等),并将数据发送到智能网关,实现对家居环境的智能控制,而其低功耗特性保证了传感器可以长期部署在家庭各个角落。

二、BLE广播和扫描机制

1. 广播机制

BLE设备可以通过广播向周围设备发送自己的存在信息和相关数据。在HarmonyOS Next中,广播的实现涉及以下关键步骤:

首先,需要开启设备的蓝牙功能(这是使用BLE的前提条件)。然后,设置广播发送的参数,如广播间隔(interval)、发射功率(txPower)和是否可连接(connectable)等。例如:

import { ble } from '@kit.ConnectivityKit';
import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';

const TAG: string = 'BleAdvertisingManager';

// 1 订阅广播状态
public onAdvertisingStateChange() {
    try {
        ble.on('advertisingStateChange', (data: ble.AdvertisingStateChangeInfo) => {
            console.info(TAG, 'bluetooth advertising state ='+ JSON.stringify(data));
            AppStorage.setOrCreate('advertiserState', data.state);
        });
    } catch (err) {
        console.error(TAG, 'errCode:'+ (err as BusinessError).code + ', errMessage:'+ (err
            as BusinessError).message);
    }
}

// 2 首次启动广播
public async startAdvertising() {
    // 2.1 设置广播发送的参数
    let setting: ble.AdvertiseSetting = {
        interval: 160,
        txPower: 0,
        connectable: true
    };
  ...
}

接着,构造广播数据,包括服务UUID、设备名称、制造商数据等信息。这些数据将被包含在广播包中发送出去,以便其他设备能够识别和发现该设备。例如:

let manufactureValueBuffer = new Uint8Array(4);
manufactureValueBuffer[0] = 1;
manufactureValueBuffer[1] = 2;
manufactureValueBuffer[2] = 3;
manufactureValueBuffer[3] = 4;
let serviceValueBuffer = new Uint8Array(4);
serviceValueBuffer[0] = 5;
serviceValueBuffer[1] = 6;
serviceValueBuffer[2] = 7;
serviceValueBuffer[3] = 8;
let manufactureDataUnit: ble.ManufactureData = {
    manufactureId: 4567,
    manufactureValue: manufactureValueBuffer.buffer
};
let serviceDataUnit: ble.ServiceData = {
    serviceUuid: "00001888-0000-1000-8000-00805f9b34fb",
    serviceValue: serviceValueBuffer.buffer
};
let advData: ble.AdvertiseData = {
    serviceUuids: ["00001888-0000-1000-8000-00805f9b34fb"],
    manufactureData: [manufactureDataUnit],
    serviceData: [serviceDataUnit],
    includeDeviceName: false
};
let advResponse: ble.AdvertiseData = {
    serviceUuids: ["00001888-0000-1000-8000-00805f9b34fb"],
    manufactureData: [manufactureDataUnit],
    serviceData: [serviceDataUnit]
};

最后,使用startAdvertising函数启动广播,并获取所启动广播的标识ID(用于后续对广播的操作,如暂停、恢复或停止广播)。

2. 扫描机制

设备可以通过扫描来发现周围正在广播的BLE设备。在HarmonyOS Next中,扫描操作如下:

同样先确保设备蓝牙已开启,然后构造扫描过滤器,根据业务需求定义过滤器条件,以便只接收符合特定条件的广播包。例如,可以根据制造商ID、服务UUID等信息进行过滤:

let manufactureId = 4567;
let manufactureData: Uint8Array = new Uint8Array([1, 2, 3, 4]);
let manufactureDataMask: Uint8Array = new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF]);
let scanFilter: ble.ScanFilter = {
    manufactureId: manufactureId,
    manufactureData: manufactureData.buffer,
    manufactureDataMask: manufactureDataMask.buffer
};

接着设置扫描参数,如扫描间隔(interval)、占空比模式(dutyMode)和匹配模式(matchMode)等:

let scanOptions: ble.ScanOptions = {
    interval: 0,
    dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER,
    matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE
}

最后,调用startBLEScan函数开始扫描,并订阅扫描结果事件。当扫描到符合条件的设备时,会通过回调函数返回设备信息:

ble.startBLEScan([scanFilter], scanOptions);
ble.on('BLEDeviceFind', (data: Array<ble.ScanResult>) => {
    if (data.length > 0) {
        console.info(TAG, 'BLE scan result ='+ data[0].deviceId);
        this.parseScanResult(data[0].data);
    }
});

三、示例代码

以下是一个简单的使用BLE进行设备发现和连接的代码示例:

import { ble } from '@kit.ConnectivityKit';
import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';

// 开启ble扫描,获取对端设备mac地址
let deviceId = '目标设备的MAC地址';

// 连接对端设备
ble.sppConnect(deviceId, {
    uuid: '00001101-0000-1000-8000-00805f9b34fb',
    secure: true,
    type: 0
}, (code, socketID) => {
    if (code!= null) {
        console.error('sppConnect error, code ='+ (code as BusinessError).code);
        return;
    }
    console.info('sppConnect success, socketId ='+ socketID);
})

四、BLE广播、扫描和数据传输的特点与适用场景

操作 特点 适用场景
广播 - 周期性发送设备信息,功耗低。
- 可携带有限数据,如设备名称、服务UUID等。
- 可设置为可连接或不可连接模式。
- 设备发现与宣告自身存在,如智能手表向手机广播自身状态。
- 向周围设备提供基本信息,方便其他设备进行连接或交互决策。
扫描 - 主动搜索周围广播设备,可根据过滤器筛选。
- 扫描间隔和模式可调整,平衡功耗与发现效率。
- 设备寻找特定类型或服务的BLE设备,如手机扫描附近的BLE传感器。
- 在需要动态发现设备的场景中,如智能家居设备配对过程。
数据传输 - 基于连接建立后进行数据交换,支持多种数据格式。
- 传输速率相对较低,但足以满足低功耗设备间的数据交互需求。
- 可通过特征值(Characteristic)和描述符(Descriptor)进行数据组织和操作。
- 智能手表与手机之间同步运动数据、通知等小数据量信息。
- 健康监测设备向手机或云端上传生理数据。
- 智能家居设备间的控制指令和状态信息传输。

通过对HarmonyOS Next中BLE广播与扫描机制的深入了解,我们可以看到BLE技术为低功耗设备间的通信提供了高效、灵活的解决方案。无论是打造智能穿戴设备、健康监测系统还是智能家居生态,BLE都将是开发者手中的得力工具。就像一个无声的使者,在低功耗的世界里传递着设备间的信息,让智能生活变得更加便捷和美好。希望这篇文章能够帮助大家更好地掌握BLE技术在HarmonyOS Next中的应用,创造出更多令人惊喜的低功耗蓝牙应用!哈哈,是不是感觉BLE的世界充满了无限可能呢?

posted @ 2024-11-14 09:21  SameX  阅读(5)  评论(0编辑  收藏  举报