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的世界充满了无限可能呢?