# ä¸²è¡Œé€šä¿¡å¼€å‘æŒ‡å¯¼ ## 简介 SPP是Serial Port Profile(串å£å议)的缩写,是一ç§è“牙å议,用于在è“牙设备之间建立串行通信连接。通过SPP,è“牙设备å¯ä»¥åƒä½¿ç”¨ä¸²å£ä¸€æ ·è¿›è¡Œæ•°æ®ä¼ è¾“ï¼Œä¾‹å¦‚ä¼ è¾“æ–‡ä»¶ã€æ–‡æœ¬ç‰ã€‚ ## åœºæ™¯ä»‹ç» ä¸»è¦åœºæ™¯æœ‰ï¼š - æœåŠ¡ç«¯å‘客户端写入数æ®ã€‚ - 通过socket连接对端设备。 ## 接å£è¯´æ˜Ž 完整的 JS API 说明以åŠå®žä¾‹ä»£ç 请å‚考:[SPP 接å£](../../reference/apis-connectivity-kit/js-apis-bluetooth-socket.md)。 具体接å£è¯´æ˜Žå¦‚下表。 | 接å£å | 功能æè¿° | | ---------------------------------- | ------------------------------------------------------------------------------ | | sppListen() | 创建一个æœåŠ¡ç«¯ç›‘å¬socket。 | | sppAccept() | æœåŠ¡ç«¯ç›‘å¬socketç‰å¾…客户端连接。 | | sppConnect() | 客户端å‘远端设备å‘èµ·spp连接。 | | sppCloseServerSocket() | 关闿œåŠ¡ç«¯ç›‘å¬socket。 | | sppCloseClientSocket() | å…³é—客户端socket。 | | sppWrite() | 通过socketå‘远端å‘逿•°æ®ã€‚ | | on(type: 'sppRead') | 订阅spp读请求事件。 | | off(type: 'sppRead') | å–æ¶ˆè®¢é˜…spp读请求事件。 | ## 主è¦åœºæ™¯å¼€å‘æ¥éª¤ ### æœåŠ¡ç«¯å‘å®¢æˆ·ç«¯å†™å…¥æ•°æ® 1. import需è¦çš„socket模å—。 2. 需è¦SystemCapability.Communication.Bluetooth.Core系统能力。 3. å¼€å¯è®¾å¤‡è“牙。 4. 创建æœåŠ¡ç«¯socket,返回serverId。 5. æœåŠ¡ç«¯ç‰å¾…客户端连接,返回clientId。 6. æœåŠ¡ç«¯å‘客户端写入数æ®ã€‚ 7. (å¯é€‰ï¼‰æœåŠ¡ç«¯è®¢é˜…å®¢æˆ·ç«¯å†™å…¥çš„æ•°æ®ã€‚ 8. 注销æœåŠ¡ç«¯socket。 9. 注销客户端socket。 10. 示例代ç : ```ts import { socket } from '@kit.ConnectivityKit'; import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit'; // 创建æœåŠ¡å™¨ç›‘å¬Socket, 返回serverId let serverNumber = -1; let sppOption: socket.SppOptions = { uuid: '00001101-0000-1000-8000-00805f9b34fb', secure: true, type: 0 }; socket.sppListen('server1', sppOption, (code, serverSocketID) => { if (code != null) { console.error('sppListen error, code is ' + (code as BusinessError).code); return; } else { serverNumber = serverSocketID; console.info('sppListen success, serverNumber = ' + serverNumber); } }); // socketç‰å¾…客户端连接,连接æˆåŠŸè¿”å›žclientId let clientNumber = -1; socket.sppAccept(serverNumber, (code, clientSocketID) => { if (code != null) { console.error('sppAccept error, code is ' + (code as BusinessError).code); return; } else { clientNumber = clientSocketID; console.info('accept the client success'); } }) console.info('waiting for client connection'); // å‘å®¢æˆ·ç«¯å†™å…¥æ•°æ® let array = new Uint8Array(990); array[0] = 'A'.charCodeAt(0); array[1] = 'B'.charCodeAt(0); array[2] = 'C'.charCodeAt(0); array[3] = 'D'.charCodeAt(0); socket.sppWrite(clientNumber, array.buffer); console.info('sppWrite success'); // 订阅读请求事件 socket.on('sppRead', clientNumber, (dataBuffer: ArrayBuffer) => { const data = new Uint8Array(dataBuffer); if (data != null) { console.info('sppRead success, data = ' + JSON.stringify(data)); } else { console.error('sppRead error, data is null'); } }); // å–æ¶ˆè®¢é˜…读请求事件 socket.off('sppRead', clientNumber, (dataBuffer: ArrayBuffer) => { const data = new Uint8Array(dataBuffer); if (data != null) { console.info('offSppRead success, data = ' + JSON.stringify(data)); } else { console.error('offSppRead error, data is null'); } }); // 注销æœåŠ¡ç«¯socket socket.sppCloseServerSocket(serverNumber); console.info('sppCloseServerSocket success'); // 注销客户端socket socket.sppCloseClientSocket(clientNumber); console.info('sppCloseClientSocket success'); ``` 11. 错误ç 请å‚è§[è“牙æœåŠ¡å系统错误ç ](../../reference/apis-connectivity-kit/errorcode-bluetoothManager.md)。 ### 通过socket连接对端设备 1. import需è¦çš„socket模å—。 2. 需è¦SystemCapability.Communication.Bluetooth.Core系统能力。 3. å¼€å¯è®¾å¤‡è“牙。 4. å¼€å¯ble扫æï¼ŒèŽ·å–对端设备mac地å€ã€‚ 5. 连接对端设备。 6. 示例代ç : ```ts import { socket } from '@kit.ConnectivityKit'; import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit'; // å¼€å¯ble扫æï¼ŒèŽ·å–对端设备macåœ°å€ let deviceId = 'xx:xx:xx:xx:xx:xx'; // 连接对端设备 socket.sppConnect(deviceId, { uuid: '00001101-0000-1000-8000-00805f9b34fb', secure: true, type: 0 }, (code, socketID) => { if (code != null) { console.error('sppConnect error, code = ' + (code as BusinessError).code); return; } console.info('sppConnect success, socketId = ' + socketID); }) ``` 7. 错误ç 请å‚è§[è“牙æœåŠ¡å系统错误ç ](../../reference/apis-connectivity-kit/errorcode-bluetoothManager.md)。