1# @ohos.bluetooth.socket (蓝牙socket模块)
2
3socket模块提供了操作和管理蓝牙socket的方法。
4
5> **说明:**
6>
7> 本模块首批接口从API version 10开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8
9
10
11## 导入模块
12
13```js
14import { socket } from '@kit.ConnectivityKit';
15```
16
17## socket.sppListen
18
19sppListen(name: string, options: SppOptions, callback: AsyncCallback<number>): void
20
21创建一个服务端监听Socket。使用Callback异步回调。
22
23**需要权限**:ohos.permission.ACCESS_BLUETOOTH
24
25**系统能力**:SystemCapability.Communication.Bluetooth.Core26
27**参数:**
28
29| 参数名      | 类型                          | 必填   | 说明                      |
30| -------- | --------------------------- | ---- | ----------------------- |
31| name     | string                      | 是    | 服务的名称。                  |
32| options   | [SppOptions](#sppoptions)     | 是    | spp监听配置参数。              |
33| callback | AsyncCallback<number> | 是    | 表示回调函数的入参,服务端Socket的id。 |
34
35**错误码**:
36
37以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
38
39| 错误码ID | 错误信息 |
40| -------- | ---------------------------- |
41|201 | Permission denied.                 |
42|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                 |
43|801 | Capability not supported.          |
44|2900001 | Service stopped.                         |
45|2900003 | Bluetooth disabled.                 |
46|2900004 | Profile not supported.                |
47|2900099 | Operation failed.                        |
48
49**示例:**
50
51```js
52import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
53let serverNumber = -1;
54let serverSocket = (code: BusinessError, number: number) => {
55  if (code) {
56    console.error('sppListen error, code is ' + code);
57    return;
58  } else {
59    serverNumber = number;
60    console.info('sppListen success, serverNumber = ' + serverNumber);
61  }
62}
63
64let sppOption:socket.SppOptions = {uuid: '00001810-0000-1000-8000-00805F9B34FB', secure: false, type: 0};
65try {
66    socket.sppListen('server1', sppOption, serverSocket);
67} catch (err) {
68    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
69}
70```
71
72
73## socket.sppAccept
74
75sppAccept(serverSocket: number, callback: AsyncCallback<number>): void
76
77服务端监听socket等待客户端连接。使用Callback异步回调。
78
79**系统能力**:SystemCapability.Communication.Bluetooth.Core80
81**参数:**
82
83| 参数名          | 类型                          | 必填   | 说明                      |
84| ------------ | --------------------------- | ---- | ----------------------- |
85| serverSocket | number                      | 是    | 服务端socket的id。           |
86| callback     | AsyncCallback<number> | 是    | 表示回调函数的入参,客户端socket的id。 |
87
88**错误码**:
89
90以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
91
92| 错误码ID | 错误信息 |
93| -------- | ---------------------------- |
94|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                 |
95|801 | Capability not supported.          |
96|2900001 | Service stopped.                         |
97|2900003 | Bluetooth disabled.                 |
98|2900004 | Profile not supported.                |
99|2900099 | Operation failed.                        |
100
101**示例:**
102
103```js
104import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
105let clientNumber = -1;
106let serverNumber = -1;
107let acceptClientSocket = (code: BusinessError, number: number) => {
108  console.info('bluetooth error code: ' + code.code);
109  if (code) {
110    console.error('sppListen error, code is ' + code);
111    return;
112  } else {
113    clientNumber = number; // 获取的clientNumber用作客户端后续读/写操作socket的id。
114    console.info('sppListen success, serverNumber = ' + clientNumber);
115  }
116}
117try {
118    socket.sppAccept(serverNumber, acceptClientSocket); // serverNumber是sppListen回调中得到的serverNumber。
119} catch (err) {
120    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
121}
122```
123
124
125## socket.sppConnect
126
127sppConnect(deviceId: string, options: SppOptions, callback: AsyncCallback<number>): void
128
129客户端向远端设备发起spp连接。使用Callback异步回调。
130
131**需要权限**:ohos.permission.ACCESS_BLUETOOTH
132
133**系统能力**:SystemCapability.Communication.Bluetooth.Core134
135**参数:**
136
137| 参数名      | 类型                          | 必填   | 说明                             |
138| -------- | --------------------------- | ---- | ------------------------------ |
139| deviceId | string                      | 是    | 对端设备地址,例如:"XX:XX:XX:XX:XX:XX"。 |
140| options   | [SppOptions](#sppoptions)     | 是    | spp客户端连接配置参数。                  |
141| callback | AsyncCallback<number> | 是    | 表示回调函数的入参,客户端socket的id。        |
142
143**错误码**:
144
145以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
146
147| 错误码ID | 错误信息 |
148| -------- | ---------------------------- |
149|201 | Permission denied.                 |
150|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                 |
151|801 | Capability not supported.          |
152|2900001 | Service stopped.                         |
153|2900003 | Bluetooth disabled.                 |
154|2900004 | Profile not supported.                |
155|2900099 | Operation failed.                        |
156
157**示例:**
158
159```js
160import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
161
162let clientNumber = -1;
163let clientSocket = (code: BusinessError, number: number) => {
164  if (code) {
165    console.error('sppListen error, code is ' + code);
166    return;
167  } else {
168    console.info('bluetooth serverSocket Number: ' + number);
169    // 获取的clientNumber用作客户端后续读/写操作socket的id。
170    clientNumber = number;
171  }
172}
173let sppOption:socket.SppOptions = {uuid: '00001810-0000-1000-8000-00805F9B34FB', secure: false, type: 0};
174try {
175    socket.sppConnect('XX:XX:XX:XX:XX:XX', sppOption, clientSocket);
176} catch (err) {
177    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
178}
179```
180
181
182## socket.sppCloseServerSocket
183
184sppCloseServerSocket(socket: number): void
185
186关闭服务端监听Socket,入参socket由sppListen接口返回。
187
188**系统能力**:SystemCapability.Communication.Bluetooth.Core189
190**参数:**
191
192| 参数名    | 类型     | 必填   | 说明              |
193| ------ | ------ | ---- | --------------- |
194| socket | number | 是    | 服务端监听socket的id。 |
195
196**错误码**:
197
198以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
199
200| 错误码ID | 错误信息 |
201| -------- | ---------------------------- |
202|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.             |
203|801 | Capability not supported.          |
204|2900001 | Service stopped.                         |
205|2900099 | Operation failed.                        |
206
207**示例:**
208
209```js
210import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
211let serverNumber = -1; // 此处serverNumber需赋值为调用sppListen接口后,回调中得到的serverNumber。
212try {
213    socket.sppCloseServerSocket(serverNumber);
214} catch (err) {
215    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
216}
217```
218
219
220## socket.sppCloseClientSocket
221
222sppCloseClientSocket(socket: number): void
223
224关闭客户端socket,入参socket由sppAccept或sppConnect接口获取。
225
226**系统能力**:SystemCapability.Communication.Bluetooth.Core227
228**参数:**
229
230| 参数名    | 类型     | 必填   | 说明       |
231| ------ | ------ | ---- | ------------- |
232| socket | number | 是    | 客户端socket的id。 |
233
234**错误码**:
235
236以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
237
238| 错误码ID | 错误信息 |
239| -------- | ---------------------------- |
240|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.              |
241|801 | Capability not supported.          |
242|2900001 | Service stopped.                         |
243|2900099 | Operation failed.                        |
244
245**示例:**
246
247```js
248import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
249let clientNumber = -1; // 入参clientNumber由sppAccept或sppConnect接口获取。
250try {
251    socket.sppCloseClientSocket(clientNumber);
252} catch (err) {
253    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
254}
255```
256
257
258## socket.sppWrite
259
260sppWrite(clientSocket: number, data: ArrayBuffer): void
261
262通过socket向远端发送数据,入参clientSocket由sppAccept或sppConnect接口获取 。
263
264**系统能力**:SystemCapability.Communication.Bluetooth.Core265
266**参数:**
267
268| 参数名          | 类型          | 必填   | 说明            |
269| ------------ | ----------- | ---- | ------------- |
270| clientSocket | number      | 是    | 客户端socket的id。 |
271| data         | ArrayBuffer | 是    | 写入的数据。        |
272
273**错误码**:
274
275以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
276
277| 错误码ID | 错误信息 |
278| -------- | ---------------------------- |
279|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.             |
280|801 | Capability not supported.          |
281|2901054 | IO error.                                |
282|2900099 | Operation failed.                        |
283
284**示例:**
285
286```js
287import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
288let clientNumber = -1; // 入参clientNumber由sppAccept或sppConnect接口获取。
289let arrayBuffer = new ArrayBuffer(8);
290let data = new Uint8Array(arrayBuffer);
291data[0] = 123;
292try {
293    socket.sppWrite(clientNumber, arrayBuffer);
294} catch (err) {
295    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
296}
297```
298
299
300## socket.on('sppRead')
301
302on(type: 'sppRead', clientSocket: number, callback: Callback<ArrayBuffer>): void
303
304订阅spp读请求事件,入参clientSocket由sppAccept或sppConnect接口获取。使用Callback异步回调。
305
306**系统能力**:SystemCapability.Communication.Bluetooth.Core307
308**参数:**
309
310| 参数名          | 类型                          | 必填   | 说明                         |
311| ------------ | --------------------------- | ---- | -------------------------- |
312| type         | string                      | 是    | 填写"sppRead"字符串,表示spp读请求事件。 |
313| clientSocket | number                      | 是    | 客户端socket的id。              |
314| callback     | Callback<ArrayBuffer> | 是    | 表示回调函数的入参,读取到的数据。          |
315
316**错误码**:
317
318以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
319
320| 错误码ID | 错误信息 |
321| -------- | ---------------------------- |
322|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.            |
323|801 | Capability not supported.          |
324|2901054 | IO error.                                |
325|2900099 | Operation failed.                        |
326
327**示例:**
328
329```js
330import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
331let clientNumber = -1; // 入参clientNumber由sppAccept或sppConnect接口获取。
332let dataRead = (dataBuffer: ArrayBuffer) => {
333    let data = new Uint8Array(dataBuffer);
334    console.info('bluetooth data is: ' + data[0]);
335}
336try {
337    socket.on('sppRead', clientNumber, dataRead);
338} catch (err) {
339    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
340}
341```
342
343
344## socket.off('sppRead')
345
346off(type: 'sppRead', clientSocket: number, callback?: Callback<ArrayBuffer>): void
347
348取消订阅spp读请求事件,入参clientSocket由sppAccept或sppConnect接口获取。
349
350**系统能力**:SystemCapability.Communication.Bluetooth.Core351
352**参数:**
353
354| 参数名          | 类型                          | 必填   | 说明                                       |
355| ------------ | --------------------------- | ---- | ---------------------------------------- |
356| type         | string                      | 是    | 填写"sppRead"字符串,表示spp读请求事件。               |
357| clientSocket | number                      | 是    | 客户端Socket的id。                            |
358| callback     | Callback<ArrayBuffer> | 否    | 表示取消订阅spp读请求事件上报。不填该参数则取消订阅该type对应的所有回调。 |
359
360**错误码**:
361
362以下错误码的详细介绍请参见[蓝牙服务子系统错误码](errorcode-bluetoothManager.md)。
363
364| 错误码ID | 错误信息 |
365| -------- | ---------------------------- |
366|401 | Invalid parameter. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.              |
367|801 | Capability not supported.          |
368
369**示例:**
370
371```js
372import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
373let clientNumber = -1; // 入参clientNumber由sppAccept或sppConnect接口获取。
374try {
375    socket.off('sppRead', clientNumber);
376} catch (err) {
377    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
378}
379```
380
381
382## SppOptions
383
384描述spp的配置参数。
385
386**系统能力**:SystemCapability.Communication.Bluetooth.Core387
388| 名称     | 类型                | 可读   | 可写   | 说明          |
389| ------ | ------------------- | ---- | ---- | ----------- |
390| uuid   | string              | 是    | 是    | spp单据的uuid。 |
391| secure | boolean             | 是    | 是    | 是否是安全通道。true表示是安全通道,false表示非安全通道。    |
392| type   | [SppType](#spptype)            | 是    | 是    | Spp链路类型。    |
393
394
395## SppType
396
397枚举,Spp链路类型。
398
399**系统能力**:SystemCapability.Communication.Bluetooth.Core400
401| 名称         | 值  | 说明            |
402| ---------- | ---- | ------------- |
403| SPP_RFCOMM | 0    | 表示rfcomm链路类型。 |