1# 广播与扫描开发指导 2 3## 简介 4广播与扫描,主要提供了蓝牙设备的开启广播、关闭广播、开启扫描、关闭扫描方法,通过广播和扫描发现对端蓝牙设备,实现低功耗的通信。 5 6## 场景介绍 7主要场景有: 8 9- 开启、关闭广播 10- 开启、关闭扫描 11 12## 接口说明 13 14完整的 JS API 说明以及实例代码请参考:[BLE 接口](../../reference/apis-connectivity-kit/js-apis-bluetooth-ble.md)。 15 16具体接口说明如下表。 17 18| 接口名 | 功能描述 | 19| ---------------------------------- | ------------------------------------------------------------------------------ | 20| startBLEScan() | 发起BLE扫描流程。 | 21| stopBLEScan() | 停止BLE扫描流程。 | 22| startAdvertising() | 开始发送BLE广播。 | 23| stopAdvertising() | 停止发送BLE广播。 | 24| on(type: 'advertisingStateChange') | 订阅BLE广播状态。 | 25| off(type: 'advertisingStateChange')| 取消订阅BLE广播状态。 | 26| on(type: 'BLEDeviceFind') | 订阅BLE设备发现上报事件。 | 27| off(type: 'BLEDeviceFind') | 取消订阅BLE设备发现上报事件。 | 28 29## 主要场景开发步骤 30 31### 开启、关闭广播 321. import需要的ble模块。 332. 开启设备的蓝牙。 343. 需要SystemCapability.Communication.Bluetooth.Core系统能力。 354. 开启广播,对端设备扫描该广播。 365. 关闭广播。 376. 示例代码: 38 39```ts 40import ble from '@ohos.bluetooth.ble'; 41import { BusinessError } from '@ohos.base'; 42 43// 开启广播 44let manufactureValueBuffer = new Uint8Array(4); 45manufactureValueBuffer[0] = 1; 46manufactureValueBuffer[1] = 2; 47manufactureValueBuffer[2] = 3; 48manufactureValueBuffer[3] = 4; 49let serviceValueBuffer = new Uint8Array(4); 50serviceValueBuffer[0] = 5; 51serviceValueBuffer[1] = 6; 52serviceValueBuffer[2] = 7; 53serviceValueBuffer[3] = 8; 54let setting: ble.AdvertiseSetting = { 55 interval: 150, 56 txPower: 0, 57 connectable: true 58}; 59let manufactureDataUnit: ble.ManufactureData = { 60 manufactureId: 4567, 61 manufactureValue: manufactureValueBuffer.buffer 62}; 63let serviceDataUnit: ble.ServiceData = { 64 serviceUuid: "00001888-0000-1000-8000-00805f9b34fb", 65 serviceValue: serviceValueBuffer.buffer 66}; 67let advData: ble.AdvertiseData = { 68 serviceUuids: ["00001888-0000-1000-8000-00805f9b34fb"], 69 manufactureData: [manufactureDataUnit], 70 serviceData: [serviceDataUnit], 71 includeDeviceName: false // 表示是否携带设备名,可选参数。注意带上设备名时广播包长度不能超出31个字节。 72}; 73let advResponse: ble.AdvertiseData = { 74 serviceUuids: ["00001888-0000-1000-8000-00805f9b34fb"], 75 manufactureData: [manufactureDataUnit], 76 serviceData: [serviceDataUnit] 77}; 78 79ble.startAdvertising(setting, advData, advResponse); 80console.info('startAdvertising success'); 81 82// 关闭广播 83ble.stopAdvertising(); 84console.info('stopAdvertising success'); 85``` 86 877. 错误码请参见[蓝牙服务子系统错误码](../../reference/apis-connectivity-kit/errorcode-bluetoothManager.md)。 888. 如何验证:执行开启广播的用例代码,记录日志“startAdvertising success”,并且使用另外一部手机安装nrfConnect软件开启扫描,如果扫描到该广播,广播内容“Manufacturer data的值为:0x01020304,Service Data的值为:0x05060708”,表示开启广播成功。关闭广播后,扫描不到该内容的广播。 89 90### 开启、关闭扫描 911. import需要的ble模块。 922. 开启设备的蓝牙。 933. 需要SystemCapability.Communication.Bluetooth.Core系统能力。 944. 对端设备开启广播。 955. 本端设备开启扫描,获取扫描结果。 966. 关闭扫描。 977. 示例代码: 98 99```ts 100import ble from '@ohos.bluetooth.ble'; 101import { BusinessError } from '@ohos.base'; 102 103// 开启扫描 104let scanFilter: ble.ScanFilter = { 105 name: 'Jackistang' 106}; 107let scanOptions: ble.ScanOptions = { 108 interval: 500, 109 dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER, 110 matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE 111} 112ble.startBLEScan([scanFilter], scanOptions); 113console.info('startBleScan success') 114 115// 接收扫描结果 116ble.on('BLEDeviceFind', (data) => { 117 if (data.length > 0) { 118 console.info('BLE scan result = ' + data[0].deviceName); 119 } 120}); 121 122// 关闭扫描 123ble.stopBLEScan(); 124console.info('stopBleScan success'); 125``` 126 1278. 错误码请参见[蓝牙服务子系统错误码](../../reference/apis-connectivity-kit/errorcode-bluetoothManager.md)。 1289. 如何验证:使用另外一部手机安装nrfConnect软件并且配置好广播,设备名称修改为“Jackistang”,开启广播。然后测试手机开启扫描,大概每隔0.5秒记录日志“BLE scan result = = Jackistang”,则表示开启扫描成功。关闭扫描后,不会再有该记录日志产生。