
回复
作为一个曾为智能手环续航焦虑的开发者,今天要聊的BLE技术简直是低功耗设备的救星!当初做健康监测项目时,用HarmonyOS的BLE功能实现了传感器与手机的通信,电量消耗低到惊喜,快来看看这些超实用的广播扫描技巧~
第一次接触BLE时,被它的省电能力惊艳到——智能手表每天同步数据,居然一周才充一次电!BLE全称蓝牙低功耗技术,特别适合这类「小数据量、长续航」的场景:
广播就像设备在发传单,告诉周围「我在这里」。HarmonyOS里实现广播超简单:
// 1. 先打开蓝牙,订阅广播状态变化
ble.on('advertisingStateChange', (data) => {
console.log('广播状态变啦:', data.state);
});
// 2. 设置广播参数(间隔/功率/是否可连接)
let setting = {
interval: 160, // 广播间隔,数值越大越省电
txPower: 0, // 发射功率,0是中等强度
connectable: true // 允许被连接
};
// 3. 构造广播内容(服务UUID/制造商数据)
let advData = {
serviceUuids: ['00001888-...'], // 服务ID,像设备的「门牌号码」
manufactureData: [{
manufactureId: 4567, // 制造商ID
manufactureValue: new Uint8Array([1,2,3,4]).buffer
}]
};
// 4. 启动广播,拿到广播ID方便后续控制
ble.startAdvertising(setting, advData, (err, id) => {
if (!err) console.log('广播启动成功,ID是', id);
});
扫描就像拿雷达找广播设备,HarmonyOS里可以过滤特定设备:
// 1. 构造扫描过滤器(只找特定制造商的设备)
let filter = {
manufactureId: 4567, // 只扫描这个制造商的设备
manufactureData: new Uint8Array([1,2,3,4]).buffer,
manufactureDataMask: new Uint8Array([0xFF,0xFF,0xFF,0xFF]).buffer
};
// 2. 设置扫描参数(低功耗模式)
let options = {
interval: 0, // 0表示使用默认间隔
dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER, // 低功耗扫描
matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE // 激进匹配,更快找到设备
};
// 3. 开始扫描,收到设备会触发回调
ble.startBLEScan([filter], options);
ble.on('BLEDeviceFind', (devices) => {
if (devices.length > 0) {
let deviceId = devices[0].deviceId;
console.log('找到设备啦,ID是', deviceId);
// 找到设备后可以连接传数据
}
});
操作 | 省电技巧 | 场景建议 |
---|---|---|
广播 | 增大广播间隔(如500ms) | 非实时场景(传感器上报) |
扫描 | 用过滤条件减少无效扫描 | 只找特定设备(如自家门锁) |
连接后 | 数据攒一批再传,减少连接次数 | 运动数据10秒传一次 |
记得第一次调BLE扫描时,没设过滤条件,结果收到一堆无关设备,功耗蹭蹭涨。后来加了manufactureId过滤,功耗直接降了一半!现在做项目时,都会先想清楚「广播多久发一次」「扫描间隔设多大」,毕竟省电才是BLE的灵魂~