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<number>): void 36 37创建一个服务端监听Socket。使用Callback异步回调。 38 39**需要权限**:ohos.permission.ACCESS_BLUETOOTH 40 41**系统能力**:SystemCapability.Communication.Bluetooth.Core。 42 43**参数:** 44 45| 参数名 | 类型 | 必填 | 说明 | 46| -------- | --------------------------- | ---- | ----------------------- | 47| name | string | 是 | 服务的名称,该字符串的字符个数范围为[0, 256]。 | 48| options | [SppOptions](#sppoptions) | 是 | spp监听配置参数。 | 49| callback | AsyncCallback<number> | 是 | 回调函数。当创建服务端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<number>): void 128 129服务端监听socket等待客户端连接。使用Callback异步回调。 130 131**系统能力**:SystemCapability.Communication.Bluetooth.Core。 132 133**参数:** 134 135| 参数名 | 类型 | 必填 | 说明 | 136| ------------ | --------------------------- | ---- | ----------------------- | 137| serverSocket | number | 是 | 服务端socket的id。<br>该值是调用[sppListen](#socketspplisten)接口后,通过其异步callback获取到的。 | 138| callback | AsyncCallback<number> | 是 | 回调函数。当收到客户端的连接时,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<number>): void 180 181客户端向远端设备发起spp连接。使用Callback异步回调。 182 183**需要权限**:ohos.permission.ACCESS_BLUETOOTH 184 185**系统能力**:SystemCapability.Communication.Bluetooth.Core。 186 187**参数:** 188 189| 参数名 | 类型 | 必填 | 说明 | 190| -------- | --------------------------- | ---- | ------------------------------ | 191| deviceId | string | 是 | 对端设备地址,例如:"XX:XX:XX:XX:XX:XX"。 | 192| options | [SppOptions](#sppoptions) | 是 | spp客户端连接配置参数。 | 193| callback | AsyncCallback<number> | 是 | 回调函数。当客户端发起连接成功,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.Core。 290 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.Core。 329 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.Core。 368 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<ArrayBuffer>): void 407 408订阅spp读请求事件,入参clientSocket由sppAccept或sppConnect接口获取。使用Callback异步回调。 409 410**系统能力**:SystemCapability.Communication.Bluetooth.Core。 411 412**参数:** 413 414| 参数名 | 类型 | 必填 | 说明 | 415| ------------ | --------------------------- | ---- | -------------------------- | 416| type | string | 是 | 事件回调类型,支持的事件为'sppRead',表示订阅spp读请求事件。<br>当收到了对端发送的数据时,触发该事件。| 417| clientSocket | number | 是 | 客户端socket的id。<br>该值是调用[sppAccept](#socketsppaccept)或[sppConnect](#socketsppconnect)接口,通过其异步callback获取到的。 | 418| callback | Callback<ArrayBuffer> | 是 | 指定订阅的回调函数,会返回读取到的数据。 | 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<ArrayBuffer>): void 452 453取消订阅spp读请求事件,入参clientSocket由sppAccept或sppConnect接口获取。 454 455**系统能力**:SystemCapability.Communication.Bluetooth.Core。 456 457**参数:** 458 459| 参数名 | 类型 | 必填 | 说明 | 460| ------------ | --------------------------- | ---- | ---------------------------------------- | 461| type | string | 是 | 事件回调类型,支持的事件为'sppRead',表示取消订阅spp读请求事件。 | 462| clientSocket | number | 是 | 客户端socket的id。<br>该值是调用[sppAccept](#socketsppaccept)或[sppConnect](#socketsppconnect)接口,通过其异步callback获取到的。 | 463| callback | Callback<ArrayBuffer> | 否 | 指定取消订阅的回调函数通知。<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<void> 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<void> | 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<ArrayBuffer> 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<ArrayBuffer> | 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.Core。 605 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.Core。 625 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链路。 |