1# 查找设备 2 3<!--Kit: Connectivity Kit--> 4<!--Subsystem: Communication--> 5<!--Owner: @enjoy_sunshine--> 6<!--Designer: @chengguohong; @tangjia15--> 7<!--Tester: @wangfeng517--> 8<!--Adviser: @zhang_yixin13--> 9 10## 简介 11本指南主要提供了查找设备相关的开发指导,包括如何扫描周边设备、设置本机蓝牙扫描模式以及查找已配对设备信息。 12 13## 开发步骤 14 15### 申请蓝牙权限 16需要申请权限ohos.permission.ACCESS_BLUETOOTH。如何配置和申请权限,具体操作请参考[声明权限](../../security/AccessToken/declare-permissions.md)和[向用户申请授权](../../security/AccessToken/request-user-authorization.md)。 17 18### 导入所需API模块 19导入connection和错误码模块。 20```ts 21import { connection } from '@kit.ConnectivityKit'; 22import { BusinessError } from '@kit.BasicServicesKit'; 23``` 24 25### 扫描周边蓝牙设备 26用于扫描周边支持蓝牙能力的设备,并获取到蓝牙设备的部分信息。此过程也可被称为“搜索”、“发现”或“查找”。只有周边蓝牙设备处于可被发现的状态时,才能被本机蓝牙设备扫描到。 27 28**1. 订阅扫描设备结果上报事件**<br> 29- 推荐使用API version 18开始支持的扫描结果上报方式。该方式可获取到更多设备信息,包括设备地址、设备信号强度、设备名称和设备类型。详情请见[connection.on('discoveryResult')](../../reference/apis-connectivity-kit/js-apis-bluetooth-connection.md#connectionondiscoveryresult18)。 30```ts 31// 定义扫描结果上报回调函数 32function onReceiveEvent(data: Array<connection.DiscoveryResult>) { 33 console.info('bluetooth device: '+ JSON.stringify(data)); 34} 35 36try { 37 // 发起订阅 38 connection.on('discoveryResult', onReceiveEvent); 39} catch (err) { 40 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 41} 42``` 43- API version 17及以前的扫描结果上报方式只支持获取设备地址信息。详情请见[connection.on('bluetoothDeviceFind')](../../reference/apis-connectivity-kit/js-apis-bluetooth-connection.md#connectiononbluetoothdevicefind)。 44```ts 45// 定义扫描结果上报回调函数 46function onReceiveEvent(data: Array<string>) { 47 console.info('bluetooth device: '+ JSON.stringify(data)); 48} 49 50try { 51 // 发起订阅 52 connection.on('bluetoothDeviceFind', onReceiveEvent); 53} catch (err) { 54 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 55} 56``` 57 58**2. 发起设备扫描**<br> 59应用发起扫描后,整个扫描过程大约持续12s。应用可以对扫描到的蓝牙设备发起配对、连接和传输数据流程。具体操作请参考[配对连接设备](br-pair-device-development-guide.md)、[连接和传输数据](spp-development-guide.md)。 60```ts 61try { 62 // 判断本机设备是否正在进行扫描 63 let scan = connection.isBluetoothDiscovering(); 64 if (!scan) { 65 // 若当前不处于扫描过程,则开始扫描设备 66 connection.startBluetoothDiscovery(); 67 } 68} catch (err) { 69 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 70} 71``` 72**3. 停止设备扫描**<br> 73扫描是一个很消耗蓝牙硬件资源的过程。当扫描到应用所需的蓝牙设备后,在发起连接前,必须停止设备扫描。 74```ts 75// 定义扫描结果上报回调函数 76function onReceiveEvent(data: Array<string>) { 77 console.info('bluetooth device: '+ JSON.stringify(data)); 78} 79 80try { 81 // 判断本机设备是否正在进行扫描 82 let scan = connection.isBluetoothDiscovering(); 83 if (scan) { 84 // 若当前处于扫描过程,则停止扫描设备 85 connection.stopBluetoothDiscovery(); 86 } 87 // 若不再需要使用扫描,可以取消订阅扫描上报结果 88 connection.off('bluetoothDeviceFind', onReceiveEvent); 89} catch (err) { 90 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 91} 92``` 93 94### 设置本机蓝牙扫描模式 95本机蓝牙扫描模式用于控制本机设备是否可以被周边其他蓝牙设备扫描到或连接上。非系统应用一般不用关注这个模式,系统设置应用会决定如何设置。 96- 系统设置应用打开蓝牙后,若系统蓝牙设置界面在前台,会将本机蓝牙扫描模式设置为可被扫描和可被连接,即[SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE](../../reference/apis-connectivity-kit/js-apis-bluetooth-connection.md#scanmode)。 97- 系统设置应用打开蓝牙后,若系统蓝牙设置界面在后台,会将本机蓝牙扫描模式设置为可被连接,即[SCAN_MODE_CONNECTABLE](../../reference/apis-connectivity-kit/js-apis-bluetooth-connection.md#scanmode)。 98 99```ts 100try { 101 // 获取当前本机的扫描模式 102 let scanMode: connection.ScanMode = connection.getBluetoothScanMode(); 103 console.info('scanMode: ' + scanMode); 104 if (scanMode != connection.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE) { 105 // 将本机设备的扫描模式设置为可被发现和可被连接 106 connection.setBluetoothScanMode(connection.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 0); 107 } 108} catch (err) { 109 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 110} 111``` 112 113### 查找已配对设备信息 114在发起扫描设备前,可以查找该设备是否是已配对的设备,以减少扫描设备的流程。也可以对已配对设备发起连接和传输数据流程,具体操作请参考[配对连接设备](br-pair-device-development-guide.md)和[传输数据](spp-development-guide.md)。 115 116```ts 117try { 118 // 获取已配对设备信息 119 let devices = connection.getPairedDevices(); 120 console.info('pairedDevices: ' + JSON.stringify(devices)); 121 // 若已知道设备地址,可主动查询该设备是否是已配对的 122 if (devices.length > 0) { 123 let pairState = connection.getPairState(devices[0]); 124 console.info('device: '+ devices[0] + ' pairState is ' + pairState); 125 } 126} catch (err) { 127 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 128} 129``` 130 131## 完整示例 132```ts 133import { connection } from '@kit.ConnectivityKit'; 134import { BusinessError } from '@kit.BasicServicesKit'; 135 136export class DiscoveryDeviceManager { 137 // 定义扫描结果上报回调函数 138 onReceiveEvent = (data: Array<string>) => { 139 console.info('bluetooth device: '+ JSON.stringify(data)); 140 }; 141 142 public startDiscovery() { 143 try { 144 connection.on('bluetoothDeviceFind', this.onReceiveEvent); 145 } catch (err) { 146 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 147 } 148 try { 149 // 判断本机设备是否正在进行扫描 150 let scan = connection.isBluetoothDiscovering(); 151 if (!scan) { 152 // 若当前不处于扫描过程,则开始扫描设备 153 connection.startBluetoothDiscovery(); 154 } 155 } catch (err) { 156 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 157 } 158 } 159 160 public stopDiscovery() { 161 try { 162 // 判断本机设备是否正在进行扫描 163 let scan = connection.isBluetoothDiscovering(); 164 if (scan) { 165 // 若当前处于扫描过程,则停止扫描设备 166 connection.stopBluetoothDiscovery(); 167 } 168 // 若不再需要使用扫描,可以取消订阅扫描上报结果 169 connection.off('bluetoothDeviceFind', this.onReceiveEvent); 170 } catch (err) { 171 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 172 } 173 } 174 175 public setScanMode() { 176 try { 177 // 获取当前本机的扫描模式 178 let scanMode: connection.ScanMode = connection.getBluetoothScanMode(); 179 console.info('scanMode: ' + scanMode); 180 if (scanMode != connection.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE) { 181 // 将本机设备的扫描模式设为可被发现和可被连接 182 connection.setBluetoothScanMode(connection.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 0); 183 } 184 } catch (err) { 185 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 186 } 187 } 188 189 public getPairedDevices() { 190 try { 191 // 获取已配对设备信息 192 let devices = connection.getPairedDevices(); 193 console.info('pairedDevices: ' + JSON.stringify(devices)); 194 // 若已知道设备地址,可主动查询该设备是否是已配对的 195 if (devices.length > 0) { 196 let pairState = connection.getPairState(devices[0]); 197 console.info('device: '+ devices[0] + ' pairState is ' + pairState); 198 } 199 } catch (err) { 200 console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message); 201 } 202 } 203} 204 205let discoveryDeviceManager = new DiscoveryDeviceManager(); 206export default discoveryDeviceManager as DiscoveryDeviceManager; 207```