• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.bluetooth.socket (蓝牙socket模块)
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支持的套接字链路类型包括[RFCOMM](../../connectivity/terminology.md#rfcomm)和[L2CAP](../../connectivity/terminology.md#l2cap)。
13
14- RFCOMM链路类型也称为串口通信协议(Serial Port Profile, [SPP](../../connectivity/terminology.md#spp)),适用于传统蓝牙([BR](../../connectivity/terminology.md#br)/[EDR](../../connectivity/terminology.md#edr))。
15- L2CAP链路类型适用于传统蓝牙(BR/EDR)和低功耗蓝牙([BLE](../../connectivity/terminology.md#ble))。
16
17通过[socket.sppConnect](#socketsppconnect)创建客户端套接字并向服务端发起连接。
18
19通过[socket.sppListen](#socketspplisten)创建服务端套接字并监听客户端的连接。
20
21> **说明:**
22>
23> 本模块首批接口从API version 10开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
24
25
26
27## 导入模块
28
29```js
30import { socket } from '@kit.ConnectivityKit';
31```
32
33## socket.sppListen
34
35sppListen(name: string, options: SppOptions, callback: AsyncCallback&lt;number&gt;): void
36
37创建一个服务端监听Socket。使用Callback异步回调。
38
39**需要权限**:ohos.permission.ACCESS_BLUETOOTH
40
41**系统能力**:SystemCapability.Communication.Bluetooth.Core42
43**参数:**
44
45| 参数名      | 类型                          | 必填   | 说明                      |
46| -------- | --------------------------- | ---- | ----------------------- |
47| name     | string                      | 是    | 服务的名称,该字符串的字符个数范围为[0, 256]。                  |
48| options   | [SppOptions](#sppoptions)     | 是    | spp监听配置参数。              |
49| callback | AsyncCallback&lt;number&gt; | 是    | 回调函数。当创建服务端socket成功,err为undefined,data为获取到的服务端socket的id;否则为错误对象。 |
50
51**错误码**:
52
53以下错误码的详细介绍请参见[通用错误码说明文档](../errorcode-universal.md)和[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
54
55| 错误码ID | 错误信息 |
56| -------- | ---------------------------- |
57|201 | Permission denied.                 |
58|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                 |
59|801 | Capability not supported.          |
60|2900001 | Service stopped.                         |
61|2900003 | Bluetooth disabled.                 |
62|2900004 | Profile not supported.                |
63|2900099 | Operation failed.                        |
64
65**示例:**
66
67```js
68import { BusinessError } from '@kit.BasicServicesKit';
69
70let serverNumber = -1;
71let serverSocket = (code: BusinessError, number: number) => {
72  if (code) {
73    console.error('sppListen error, code is ' + code);
74    return;
75  } else {
76    serverNumber = number;
77    console.info('sppListen success, serverNumber = ' + serverNumber);
78  }
79}
80
81let sppOption:socket.SppOptions = {uuid: '00001810-0000-1000-8000-00805F9B34FB', secure: false, type: 0};
82try {
83    socket.sppListen('server1', sppOption, serverSocket);
84} catch (err) {
85    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
86}
87```
88
89## socket.getL2capPsm<sup>20+</sup>
90getL2capPsm(serverSocket: number): number
91
92获取服务端L2CAP链路类型套接字的协议/服务多路复用器值(Protocol/Service Multiplexer, [PSM](../../connectivity/terminology.md#psm)),该值用于标识特定的服务数据传输通道。
93
94>**说明:**
95>
96> 需要在服务端调用完[socket.sppListen](#socketspplisten)后调用该接口,且传入的链路类型[SppType](#spptype)需是SPP_L2CAP或SPP_L2CAP_BLE。
97
98**系统能力**:SystemCapability.Communication.Bluetooth.Core
99
100**参数:**
101
102| 参数名          | 类型                          | 必填   | 说明                      |
103| ------------ | --------------------------- | ---- | ----------------------- |
104| serverSocket | number | 是 | 服务端套接字的id。<br>该值是调用[socket.sppListen](#socketspplisten)接口后,通过其异步callback获取到的。           |
105
106**返回值:**
107
108| 类型                                       | 说明                         |
109| ---------------------------------------- | -------------------------- |
110| number | 返回L2CAP链路类型套接字的psm值。<br>- [SppType](#spptype)设置为SPP_L2CAP_BLE时,返回值的有效值范围为[0x01, 0xFF]。<br>- [SppType](#spptype)设置为SPP_L2CAP时,返回值的有效值范围为[0x0000, 0xFFFF]。<br>- 服务端通道建立异常或[SppType](#spptype)非L2CAP链路类型时,返回-1。|
111
112**示例:**
113
114```js
115import { BusinessError } from '@kit.BasicServicesKit';
116
117// 服务端获取客户端设备地址。
118let serverNumber = 1; // 此处serverNumber需赋值为调用sppListen接口后,回调中得到的serverNumber。
119try {
120    let l2capPsm: number = socket.getL2capPsm(serverNumber);
121} catch (err) {
122    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
123}
124```
125## socket.sppAccept
126
127sppAccept(serverSocket: number, callback: AsyncCallback&lt;number&gt;): void
128
129服务端监听socket等待客户端连接。使用Callback异步回调。
130
131**系统能力**:SystemCapability.Communication.Bluetooth.Core132
133**参数:**
134
135| 参数名          | 类型                          | 必填   | 说明                      |
136| ------------ | --------------------------- | ---- | ----------------------- |
137| serverSocket | number                      | 是    | 服务端socket的id。<br>该值是调用[sppListen](#socketspplisten)接口后,通过其异步callback获取到的。           |
138| callback     | AsyncCallback&lt;number&gt; | 是    | 回调函数。当收到客户端的连接时,err为undefined,data为该客户端socket的id;否则为错误对象。 |
139
140**错误码**:
141
142以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
143
144| 错误码ID | 错误信息 |
145| -------- | ---------------------------- |
146|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                 |
147|801 | Capability not supported.          |
148|2900001 | Service stopped.                         |
149|2900003 | Bluetooth disabled.                 |
150|2900004 | Profile not supported.                |
151|2900099 | Operation failed.                        |
152
153**示例:**
154
155```js
156import { BusinessError } from '@kit.BasicServicesKit';
157
158let clientNumber = -1;
159let serverNumber = 1;
160let acceptClientSocket = (code: BusinessError, number: number) => {
161  if (code) {
162    console.error('sppListen error, code is ' + code);
163    return;
164  } else {
165    clientNumber = number; // 获取的clientNumber用作客户端后续读/写操作socket的id。
166    console.info('sppListen success, clientNumber = ' + clientNumber);
167  }
168}
169try {
170    socket.sppAccept(serverNumber, acceptClientSocket); // serverNumber是sppListen回调中得到的serverNumber。
171} catch (err) {
172    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
173}
174```
175
176
177## socket.sppConnect
178
179sppConnect(deviceId: string, options: SppOptions, callback: AsyncCallback&lt;number&gt;): void
180
181客户端向远端设备发起spp连接。使用Callback异步回调。
182
183**需要权限**:ohos.permission.ACCESS_BLUETOOTH
184
185**系统能力**:SystemCapability.Communication.Bluetooth.Core186
187**参数:**
188
189| 参数名      | 类型                          | 必填   | 说明                             |
190| -------- | --------------------------- | ---- | ------------------------------ |
191| deviceId | string                      | 是    | 对端设备地址,例如:"XX:XX:XX:XX:XX:XX"。 |
192| options   | [SppOptions](#sppoptions)     | 是    | spp客户端连接配置参数。                  |
193| callback | AsyncCallback&lt;number&gt; | 是    | 回调函数。当客户端发起连接成功,err为undefined,data为当前客户端socket的id;否则为错误对象。        |
194
195**错误码**:
196
197以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
198
199| 错误码ID | 错误信息 |
200| -------- | ---------------------------- |
201|201 | Permission denied.                 |
202|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                 |
203|801 | Capability not supported.          |
204|2900001 | Service stopped.                         |
205|2900003 | Bluetooth disabled.                 |
206|2900004 | Profile not supported.                |
207|2900099 | Operation failed.                        |
208
209**示例:**
210
211```js
212import { BusinessError } from '@kit.BasicServicesKit';
213
214let clientSocket = (code: BusinessError, number: number) => {
215  if (code) {
216    console.error('sppConnect error, code is ' + code);
217    return;
218  } else {
219    // 获取的number用作客户端后续读/写操作的socket id。
220    console.info('bluetooth clientSocket Number: ' + number);
221  }
222}
223let sppOption:socket.SppOptions = {uuid: '00001810-0000-1000-8000-00805F9B34FB', secure: false, type: 0};
224try {
225    socket.sppConnect('XX:XX:XX:XX:XX:XX', sppOption, clientSocket);
226} catch (err) {
227    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
228}
229```
230
231
232## socket.getDeviceId<sup>17+</sup>
233
234getDeviceId(clientSocket: number): string
235
236通过clientSocket获取对端设备地址。服务端、客户端均可调用,传入非法clientSocket无法获取。
237
238**系统能力**:SystemCapability.Communication.Bluetooth.Core
239
240**参数:**
241
242| 参数名      | 类型                          | 必填   | 说明                             |
243| -------- | ------------------------------- | ---- | ------------------------------ |
244| clientSocket | number                      | 是    | 客户端socket的id。<br>该值是调用[sppAccept](#socketsppaccept)或[sppConnect](#socketsppconnect)接口,通过其异步callback获取到的。 |
245
246**返回值:**
247
248| 类型                                       | 说明                         |
249| ---------------------------------------- | -------------------------- |
250| string | 返回对端设备地址。 |
251
252**错误码**:
253
254以下错误码的详细介绍请参见[通用错误码说明文档](../errorcode-universal.md)。
255
256| 错误码ID | 错误信息 |
257| -------- | ---------------------------- |
258|401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                 |
259
260**示例:**
261
262```js
263import { BusinessError } from '@kit.BasicServicesKit';
264
265// 服务端获取客户端设备地址。
266let clientSocket = 1; // clientSocket是sppAccept回调中得到的,调用getDeviceId接口前需更新clientSocket。
267try {
268    let deviceAddr: string = socket.getDeviceId(clientSocket);
269} catch (err) {
270    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
271}
272
273// 客户端获取服务端设备地址。
274// clientSocket是sppConnect回调中得到的,调getDeviceId接口前需更新clientSocket。
275try {
276    let deviceAddr: string = socket.getDeviceId(clientSocket);
277} catch (err) {
278    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
279}
280```
281
282
283## socket.sppCloseServerSocket
284
285sppCloseServerSocket(socket: number): void
286
287关闭服务端监听Socket,入参socket由sppListen接口返回。
288
289**系统能力**:SystemCapability.Communication.Bluetooth.Core290
291**参数:**
292
293| 参数名    | 类型     | 必填   | 说明              |
294| ------ | ------ | ---- | --------------- |
295| socket | number | 是    | 服务端监听socket的id。<br>该值是调用[sppListen](#socketspplisten)接口,通过其异步callback获取到的。 |
296
297**错误码**:
298
299以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
300
301| 错误码ID | 错误信息 |
302| -------- | ---------------------------- |
303|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.             |
304|801 | Capability not supported.          |
305|2900001 | Service stopped.                         |
306|2900099 | Operation failed.                        |
307
308**示例:**
309
310```js
311import { BusinessError } from '@kit.BasicServicesKit';
312
313let serverNumber = 1; // 此处serverNumber需赋值为调用sppListen接口后,在回调中得到的serverNumber。
314try {
315    socket.sppCloseServerSocket(serverNumber);
316} catch (err) {
317    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
318}
319```
320
321
322## socket.sppCloseClientSocket
323
324sppCloseClientSocket(socket: number): void
325
326关闭客户端socket,入参socket由sppAccept或sppConnect接口获取。
327
328**系统能力**:SystemCapability.Communication.Bluetooth.Core329
330**参数:**
331
332| 参数名    | 类型     | 必填   | 说明       |
333| ------ | ------ | ---- | ------------- |
334| socket | number | 是    | 客户端socket的id。<br>该值是调用[sppAccept](#socketsppaccept)或[sppConnect](#socketsppconnect)接口,通过其异步callback获取到的。 |
335
336**错误码**:
337
338以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
339
340| 错误码ID | 错误信息 |
341| -------- | ---------------------------- |
342|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.              |
343|801 | Capability not supported.          |
344|2900001 | Service stopped.                         |
345|2900099 | Operation failed.                        |
346
347**示例:**
348
349```js
350import { BusinessError } from '@kit.BasicServicesKit';
351
352let clientNumber = 1; // 入参clientNumber由sppAccept或sppConnect接口获取。
353try {
354    socket.sppCloseClientSocket(clientNumber);
355} catch (err) {
356    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
357}
358```
359
360
361## socket.sppWrite
362
363sppWrite(clientSocket: number, data: ArrayBuffer): void
364
365通过socket向远端发送数据,入参clientSocket由sppAccept或sppConnect接口获取 。
366
367**系统能力**:SystemCapability.Communication.Bluetooth.Core368
369**参数:**
370
371| 参数名          | 类型          | 必填   | 说明            |
372| ------------ | ----------- | ---- | ------------- |
373| clientSocket | number      | 是    | 客户端socket的id。<br>该值是调用[sppAccept](#socketsppaccept)或[sppConnect](#socketsppconnect)接口,通过其异步callback获取到的。 |
374| data         | ArrayBuffer | 是    | 写入的数据。        |
375
376**错误码**:
377
378以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
379
380| 错误码ID | 错误信息 |
381| -------- | ---------------------------- |
382|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.             |
383|801 | Capability not supported.          |
384|2901054 | IO error.                                |
385|2900099 | Operation failed.                        |
386
387**示例:**
388
389```js
390import { BusinessError } from '@kit.BasicServicesKit';
391
392let clientNumber = 1; // 入参clientNumber由sppAccept或sppConnect接口获取。
393let arrayBuffer = new ArrayBuffer(8);
394let data = new Uint8Array(arrayBuffer);
395data[0] = 123;
396try {
397    socket.sppWrite(clientNumber, arrayBuffer);
398} catch (err) {
399    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
400}
401```
402
403
404## socket.on('sppRead')
405
406on(type: 'sppRead', clientSocket: number, callback: Callback&lt;ArrayBuffer&gt;): void
407
408订阅spp读请求事件,入参clientSocket由sppAccept或sppConnect接口获取。使用Callback异步回调。
409
410**系统能力**:SystemCapability.Communication.Bluetooth.Core411
412**参数:**
413
414| 参数名          | 类型                          | 必填   | 说明                         |
415| ------------ | --------------------------- | ---- | -------------------------- |
416| type         | string                      | 是    | 事件回调类型,支持的事件为'sppRead',表示订阅spp读请求事件。<br>当收到了对端发送的数据时,触发该事件。|
417| clientSocket | number                      | 是    | 客户端socket的id。<br>该值是调用[sppAccept](#socketsppaccept)或[sppConnect](#socketsppconnect)接口,通过其异步callback获取到的。              |
418| callback     | Callback&lt;ArrayBuffer&gt; | 是    | 指定订阅的回调函数,会返回读取到的数据。       |
419
420**错误码**:
421
422以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
423
424| 错误码ID | 错误信息 |
425| -------- | ---------------------------- |
426|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.            |
427|801 | Capability not supported.          |
428|2901054 | IO error.                                |
429|2900099 | Operation failed.                        |
430
431**示例:**
432
433```js
434import { BusinessError } from '@kit.BasicServicesKit';
435
436let clientNumber = 1; // 入参clientNumber由sppAccept或sppConnect接口获取。
437let dataRead = (dataBuffer: ArrayBuffer) => {
438    let data = new Uint8Array(dataBuffer);
439    console.info('bluetooth data is: ' + data[0]);
440}
441try {
442    socket.on('sppRead', clientNumber, dataRead);
443} catch (err) {
444    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
445}
446```
447
448
449## socket.off('sppRead')
450
451off(type: 'sppRead', clientSocket: number, callback?: Callback&lt;ArrayBuffer&gt;): void
452
453取消订阅spp读请求事件,入参clientSocket由sppAccept或sppConnect接口获取。
454
455**系统能力**:SystemCapability.Communication.Bluetooth.Core456
457**参数:**
458
459| 参数名          | 类型                          | 必填   | 说明                                       |
460| ------------ | --------------------------- | ---- | ---------------------------------------- |
461| type         | string                      | 是    | 事件回调类型,支持的事件为'sppRead',表示取消订阅spp读请求事件。               |
462| clientSocket | number                      | 是    | 客户端socket的id。<br>该值是调用[sppAccept](#socketsppaccept)或[sppConnect](#socketsppconnect)接口,通过其异步callback获取到的。                            |
463| callback     | Callback&lt;ArrayBuffer&gt; | 否    | 指定取消订阅的回调函数通知。<br>若传参,则需与[socket.on('sppRead')](#socketonsppread)中的回调函数一致;若无传参,则取消订阅该type对应的所有回调函数通知。 |
464
465**错误码**:
466
467以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
468
469| 错误码ID | 错误信息 |
470| -------- | ---------------------------- |
471|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.              |
472|801 | Capability not supported.          |
473
474**示例:**
475
476```js
477import { BusinessError } from '@kit.BasicServicesKit';
478
479let clientNumber = 1; // 入参clientNumber由sppAccept或sppConnect接口获取。
480try {
481    socket.off('sppRead', clientNumber);
482} catch (err) {
483    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
484}
485```
486
487
488## socket.sppWriteAsync<sup>18+</sup>
489
490sppWriteAsync(clientSocket: number, data: ArrayBuffer): Promise&lt;void&gt;
491
492通过socket向远端发送数据的异步接口,该接口支持断开连接时SPP操作异常错误返回。
493
494**系统能力**:SystemCapability.Communication.Bluetooth.Core
495
496**参数:**
497
498| 参数名          | 类型                          | 必填   | 说明                                       |
499| ------------ | --------------------------- | ---- | ---------------------------------------- |
500| clientSocket | number                      | 是    | 客户端socket的id。<br>该值是调用[sppAccept](#socketsppaccept)或[sppConnect](#socketsppconnect)接口,通过其异步callback获取到的。                            |
501| data         | ArrayBuffer                 | 是    | 写入的数据。 |
502
503**返回值:**
504
505| 类型                            | 说明         |
506| ----------------------------- | ---------- |
507| Promise&lt;void&gt; | Promise对象,无返回结果。 |
508
509**错误码**:
510
511以下错误码的详细介绍请参见[通用错误码说明文档](../errorcode-universal.md)和[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
512
513| 错误码ID | 错误信息 |
514| -------- | ---------------------------- |
515|801 | Capability not supported.          |
516|2901054 | IO error. |
517|2900099 | Operation failed. |
518
519**示例:**
520
521```js
522import { BusinessError } from '@kit.BasicServicesKit';
523
524let clientNumber = 1; // 入参clientNumber由sppAccept或sppConnect接口获取。
525let arrayBuffer = new ArrayBuffer(8);
526let data = new Uint8Array(arrayBuffer);
527try {
528    socket.sppWriteAsync(clientNumber, arrayBuffer).then(() => {
529      console.info("sppWrite success");
530    });
531} catch (err) {
532    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
533}
534```
535
536
537## socket.sppReadAsync<sup>18+</sup>
538
539sppReadAsync(clientSocket: number): Promise&lt;ArrayBuffer&gt;
540
541通过socket读取对端所发送数据的异步接口,该接口支持断开连接时SPP操作异常错误返回。
542
543> **注意**:
544>
545> - 该接口不可与[socket.on('sppRead')](#socketonsppread)接口混用,同一路socket只能使用[socket.on('sppRead')](#socketonsppread)或者socket.sppReadAsync其中一个接口。
546>
547> - 该接口与[socket.on('sppRead')](#socketonsppread)使用方式不同,需要业务循环使用读取数据。
548
549**系统能力**:SystemCapability.Communication.Bluetooth.Core
550
551**参数:**
552
553| 参数名          | 类型                          | 必填   | 说明                                       |
554| ------------ | --------------------------- | ---- | ---------------------------------------- |
555| clientSocket | number                      | 是    | 客户端socket的id。<br>该值是调用[sppAccept](#socketsppaccept)或[sppConnect](#socketsppconnect)接口,通过其异步callback获取到的。                            |
556
557**返回值:**
558
559| 类型                            | 说明         |
560| ----------------------------- | ---------- |
561| Promise&lt;ArrayBuffer&gt; | Promise对象。返回读取的数据。 |
562
563**错误码**:
564
565以下错误码的详细介绍请参见[通用错误码说明文档](../errorcode-universal.md)和[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
566
567| 错误码ID | 错误信息 |
568| -------- | ---------------------------- |
569|801 | Capability not supported.          |
570|2901054 | IO error. |
571|2900099 | Operation failed. |
572
573**示例:**
574
575```js
576import { BusinessError } from '@kit.BasicServicesKit';
577
578let clientNumber = 1; // 入参clientNumber由sppAccept或sppConnect接口获取。
579let buffer = new ArrayBuffer(1024);
580let data = new Uint8Array(buffer);
581let flag = 1;
582while (flag) {
583  try {
584    socket.sppReadAsync(clientNumber).then((outBuffer: ArrayBuffer) => {
585      buffer = outBuffer;
586      if (buffer != null) {
587        console.info('sppRead success, data = ' + JSON.stringify(buffer));
588      } else {
589        console.error('sppRead error, data is null');
590      }
591    });
592  } catch (err) {
593    flag = 0;
594    console.error('startSppRead errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
595  }
596}
597```
598
599
600## SppOptions
601
602描述套接字的配置参数。
603
604**系统能力**:SystemCapability.Communication.Bluetooth.Core605
606| 名称     | 类型                | 只读   | 可选   | 说明          |
607| ------ | ------------------- | ---- | ---- | ----------- |
608| uuid   | string              | 否    | 否    | RFCOMM套接字链路类型的服务UUID,例如"00001101-0000-1000-8000-00805F9B34FB"。<br>- 建议开发者使用自定义的服务UUID(可通过工具函数[util.generateRandomUUID](../apis-arkts/js-apis-util.md#utilgeneraterandomuuid9)生成),也可以使用标准协议定义的Serial Port UUID服务(00001101-0000-1000-8000-00805F9B34FB)。<br>- SppType设置为SPP_RFCOMM时该参数必选。<br>- SppType设置为SPP_L2CAP或SPP_L2CAP_BLE时设置为空字符串。|
609| secure | boolean             | 否    | 否    | 是否是安全通道。true表示是安全通道,false表示非安全通道。    |
610| type   | [SppType](#spptype)            | 否    | 否    | 蓝牙套接字链路类型。    |
611| psm<sup>20+</sup>   | number              | 否    | 是    |协议/服务多路复用器值,用于标识特定的服务数据传输通道。不填写该参数时默认值为-1。<br>对于客户端:<br>- SppType设置为SPP_RFCOMM时,该参数不填。<br>-  SppType设置为SPP_L2CAP_BLE或SPP_L2CAP时,需和服务端的psm值保持一致。<br>对于服务端:<br>- SppType设置为SPP_RFCOMM时,该参数不填。<br>- SppType设置为SPP_L2CAP_BLE时,psm值必须由系统自动分配,有效值范围为[0x01, 0xFF]。<br>- SppType设置为SPP_L2CAP时,psm值可以主动设置或蓝牙子系统分配,若为主动设置,其有效范围为[0x00, 0xFFFF],并且需要满足低位字节最低位必须为1,高位字节最低位必须为0;若为蓝牙子系统分配,该参数不填,可以通过[socket.getL2capPsm](#socketgetl2cappsm20)接口获取psm值。|
612
613
614
615
616## SppType
617
618枚举,蓝牙套接字链路类型。
619
620- 不同类型的蓝牙设备需要选取不同的链路类型。
621- 针对低功耗蓝牙(BLE)设备,必须使用L2CAP链路类型。
622- 针对传统蓝牙(BR/EDR)设备,建议优先采用RFCOMM链路进行连接。其优势在于可通过UUID服务动态协商信道(即设备通过查询服务UUID自动确定通信频道的过程),同时具备更高的安全性和可靠性。
623
624**系统能力**:SystemCapability.Communication.Bluetooth.Core625
626| 名称         | 值  | 说明            |
627| ---------- | ---- | ------------- |
628| SPP_RFCOMM | 0    | 基于传统蓝牙(BR/EDR)的RFCOMM链路。 |
629| SPP_L2CAP<sup>20+</sup> | 1    | 基于传统蓝牙(BR/EDR)的L2CAP链路。 |
630| SPP_L2CAP_BLE<sup>20+</sup> | 2    | 基于低功耗蓝牙(BLE)的L2CAP链路。 |