文档管理中心

广播开发指导

简介

广播与扫描,主要提供了蓝牙设备的开启广播、关闭广播、开启扫描、关闭扫描方法,通过广播和扫描发现对端蓝牙设备,实现低功耗的通信。

场景介绍

主要场景有:开启、关闭广播,开启、关闭扫描。

接口说明

完整的 API 说明以及实例代码请参考:蓝牙ble模块

展开
接口名 功能描述
startAdvertising 开始发送BLE广播。
stopAdvertising 停止发送BLE广播。
startBLEScan 发起BLE扫描流程。
stopBLEScan 停止BLE扫描流程。
on('BLEDeviceFind') 订阅BLE设备发现上报事件。使用Callback异步回调。
off('BLEDeviceFind') 取消订阅BLE设备发现上报事件。

主要场景开发步骤

import需要的ble模块。在module.json5文件中添加需要使用的ACCESS_BLUETOOTH权限,调用requestPermissionsFromUser接口获取用户授权的ACCESS_BLUETOOTH权限。

收起
自动换行
深色代码主题
复制
  1. import { ble } from '@kit.ConnectivityKit';
  2. import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
  3. import {abilityAccessCtrl, Context, PermissionRequestResult } from '@kit.AbilityKit';
  4. requestPermissionsFromUser() {
  5. let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  6. try {
  7. let context = this.getUIContext().getHostContext();
  8. atManager.requestPermissionsFromUser(context, ['ohos.permission.ACCESS_BLUETOOTH']).then(() => {
  9. })
  10. } catch (err) {
  11. console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
  12. }
  13. }

import需要的ble模块,完成ACCESS_BLUETOOTH权限申请。开启广播,对端设备扫描该广播,关闭广播。

收起
自动换行
深色代码主题
复制
  1. import { ble } from '@kit.ConnectivityKit';
  2. const TAG: string = 'BleAdvertisingManager';
  3. export class BleAdvertisingManager {
  4. public async startAdvertising() {
  5. let manufactureValueBuffer = new Uint8Array(4);
  6. manufactureValueBuffer[0] = 1;
  7. manufactureValueBuffer[1] = 2;
  8. manufactureValueBuffer[2] = 3;
  9. manufactureValueBuffer[3] = 4;
  10. let serviceValueBuffer = new Uint8Array(4);
  11. serviceValueBuffer[0] = 4;
  12. serviceValueBuffer[1] = 6;
  13. serviceValueBuffer[2] = 7;
  14. serviceValueBuffer[3] = 8;
  15. console.info(`manufactureValueBuffer = ${JSON.stringify(manufactureValueBuffer)}`);
  16. console.info(`serviceValueBuffer = ${JSON.stringify(serviceValueBuffer)}`);
  17. try {
  18. let setting: ble.AdvertiseSetting = {
  19. interval: 150,
  20. txPower: 0,
  21. connectable: true,
  22. };
  23. let manufactureDataUnit: ble.ManufactureData = {
  24. manufactureId: 4567,
  25. manufactureValue: manufactureValueBuffer.buffer
  26. };
  27. let serviceDataUnit: ble.ServiceData = {
  28. serviceUuid: "00001888-0000-1000-8000-00805f9b34fb",
  29. serviceValue: serviceValueBuffer.buffer
  30. };
  31. let advData: ble.AdvertiseData = {
  32. serviceUuids: ["00001888-0000-1000-8000-00805f9b34fb"],
  33. manufactureData: [manufactureDataUnit],
  34. serviceData: [serviceDataUnit],
  35. };
  36. let advResponse: ble.AdvertiseData = {
  37. serviceUuids: ["00001888-0000-1000-8000-00805f9b34fb"],
  38. manufactureData: [manufactureDataUnit],
  39. serviceData: [serviceDataUnit],
  40. };
  41. ble.startAdvertising(setting, advData, advResponse);
  42. } catch (err) {
  43. console.error(`errCode: ${err.code}, errMessage: ${err.message}`);
  44. }
  45. }
  46. // 完全关闭广播,释放广播资源
  47. public async stopAdvertising() {
  48. try {
  49. ble.stopAdvertising();
  50. } catch (err) {
  51. console.error(`errCode: ${err.code}, errMessage: ${err.message}`);
  52. }
  53. }
  54. }
  55. let bleAdvertisingManager = new BleAdvertisingManager();
  56. export default bleAdvertisingManager as BleAdvertisingManager;

开启、关闭扫描,设备发现。

收起
自动换行
深色代码主题
复制
  1. import { ble } from '@kit.ConnectivityKit';
  2. const TAG: string = 'BleScanManager';
  3. export class BleScanManager {
  4. // 1 订阅扫描结果
  5. public onScanResult() {
  6. ble.on('BLEDeviceFind', (data: Array<ble.ScanResult>) => {
  7. if (data.length > 0) {
  8. console.info(TAG, `BLE scan result = ${data[0].deviceId}`);
  9. }
  10. });
  11. }
  12. // 2 开启扫描
  13. public startScan() {
  14. // 2.1 构造扫描过滤器,需要能够匹配预期的广播包内容
  15. let manufactureId = 4567;
  16. let manufactureData: Uint8Array = new Uint8Array([1, 2, 3, 4]);
  17. let manufactureDataMask: Uint8Array = new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF]);
  18. let scanFilter: ble.ScanFilter = { // 根据业务实际情况定义过滤器
  19. manufactureId: manufactureId,
  20. manufactureData: manufactureData.buffer,
  21. manufactureDataMask: manufactureDataMask.buffer
  22. };
  23. // 2.2 构造扫描参数
  24. let scanOptions: ble.ScanOptions = {
  25. interval: 0,
  26. dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER,
  27. matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE
  28. }
  29. try {
  30. this.onScanResult(); // 订阅扫描结果
  31. ble.startBLEScan([scanFilter], scanOptions);
  32. console.info(TAG, 'startBleScan success');
  33. } catch (err) {
  34. console.error(`errCode: ${err.code}, errMessage: ${err.message}`);
  35. }
  36. }
  37. // 3 关闭扫描
  38. public stopScan() {
  39. try {
  40. ble.off('BLEDeviceFind', (data: Array<ble.ScanResult>) => { // 取消订阅扫描结果
  41. console.info(TAG, 'off success');
  42. });
  43. ble.stopBLEScan();
  44. console.info(TAG, 'stopBleScan success');
  45. } catch (err) {
  46. console.error(`errCode: ${err.code}, errMessage: ${err.message}`);
  47. }
  48. }
  49. }
  50. let bleScanManager = new BleScanManager();
  51. export default bleScanManager as BleScanManager;
在 指南 中进行搜索
请输入您想要搜索的关键词