• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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```