当前位置: 首页 > news >正文

【android bluetooth 协议分析 15】【SPP详解 1】【SPP 介绍】

1. 什么是 SPP(Serial Port Profile)

SPP 是一种经典蓝牙协议(基于 RFCOMM),用于模拟串口通信。

  • 应用场景:设备间简单的数据传输,如串口打印机、蓝牙 OBD 车载诊断仪、蓝牙扫描枪、蓝牙调试工具、车载系统认证通信等。

  • 特点:基于 RFCOMM 传输,应用层可读写类似串口的数据。


2. SPP 通信整体流程

阶段Client 端Server 端
1. UUID 协议识别使用固定的 SPP UUID(00001101-0000-1000-8000-00805F9B34FB)或自定义 UUID注册并广播 UUID 到 SDP(服务发现协议)中
2. Socket 创建使用 createRfcommSocketToServiceRecord(UUID) 创建 RFCOMM socket使用 listenUsingRfcommWithServiceRecord(name, UUID) 创建监听 socket
3. 连接建立调用 connect() 主动连接调用 accept() 等待连接
4. 数据传输使用 InputStream / OutputStream 收发数据同样使用流进行读写
5. 关闭连接调用 close() 关闭连接同上

3. Server 与 Client 示例代码

1. Server 端代码

public class BluetoothSppServer extends Thread {private final BluetoothServerSocket serverSocket;private static final UUID SPP_UUID =UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");public BluetoothSppServer(BluetoothAdapter adapter) throws IOException {serverSocket = adapter.listenUsingRfcommWithServiceRecord("SPP_SERVER", SPP_UUID);}public void run() {BluetoothSocket socket;while (true) {try {socket = serverSocket.accept();  // 阻塞等待连接} catch (IOException e) {break;}if (socket != null) {new SppConnectionHandler(socket).start();  // 启动数据处理线程}}}public void cancel() throws IOException {serverSocket.close();}
}

2. Client 端代码

public class BluetoothSppClient extends Thread {private final BluetoothSocket socket;private static final UUID SPP_UUID =UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");public BluetoothSppClient(BluetoothDevice device) throws IOException {socket = device.createRfcommSocketToServiceRecord(SPP_UUID);}public void run() {try {socket.connect();  // 主动连接OutputStream out = socket.getOutputStream();InputStream in = socket.getInputStream();out.write("Hello Server!".getBytes());byte[] buffer = new byte[1024];int bytes = in.read(buffer);String response = new String(buffer, 0, bytes);Log.d("SPPClient", "Received: " + response);} catch (IOException e) {e.printStackTrace();}}public void cancel() throws IOException {socket.close();}
}

4. SPP 在车机中的应用场景

应用场景是否使用 SPP说明
车载蓝牙调试端口开发人员通过串口协议调试 ECU 等设备
蓝牙 OBD 读码器车机与 OBD 通信获取车辆状态信息
CarPlay 蓝牙认证✅(使用相同 API)虽不使用标准 SPP 协议,但使用 RFCOMM 套接字建立 iAP2 通道
蓝牙打印机一些车载小票打印应用
远程诊断工具(带蓝牙)蓝牙串口传输指令和日志数据

5. CarPlay 与 SPP 的联系和区别

虽然 CarPlay 并不严格遵循 Bluetooth SIG 定义的 SPP profile,但其 iAP2 over Bluetooth 的认证阶段仍然使用 listenUsingRfcommWithServiceRecordcreateRfcommSocketToServiceRecord 进行连接,因此其流程与 SPP 本质上相同,只是:

项目SPPCarPlay
使用 UUID标准 UUID (00001101...)Apple 自定义 iAP2 UUID
协议内容串口透明数据Apple 私有 iAP2 协议帧
应用层数据任意串口数据MFi 授权认证帧等
是否公开❌ 私有

因此我们可以说:

CarPlay 使用的是“SPP 风格”的 Bluetooth RFCOMM 通道,但走的是 Apple 私有协议(iAP2)


6. 总结

项目内容
listenUsingRfcommWithServiceRecordServer 端使用,注册服务并等待连接(通过 SDP 广播 UUID)
createRfcommSocketToServiceRecordClient 端使用,连接指定 UUID 的服务
SPP 场景串口调试、OBD 读码器、蓝牙打印、CarPlay 认证等
CarPlay 与 SPP 区别协议不同,机制类似,使用相同的 Android API
是否可以使用 SPP 做调试通道?✅ 非常适合,Android 支持良好,使用简单
http://www.xdnf.cn/news/917839.html

相关文章:

  • ThinkPHP 5.1 中的 error 和 success 方法详解
  • 【LangchainAgent】Agent基本构建与使用
  • 基于Spring Boot的云音乐平台设计与实现
  • Vue3 项目的基本架构解读
  • K8S认证|CKS题库+答案| 6. 创建 Secret
  • Gartner《How to Create and Maintain a Knowledge Base forHumans and AI》学习报告
  • 学习使用YOLO的predict函数使用
  • Android 平台RTSP/RTMP播放器SDK接入说明
  • 现代简约壁炉:藏在极简线条里的温暖魔法
  • 数据库(sqlite)基本操作
  • 量子计算突破:新型超导芯片重构计算范式
  • Axure应用交互设计:注册登录页完整交互设计
  • Web前端基础
  • Axure应用交互设计:如何构建注册登录页
  • AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
  • 1.5 Node.js 的 HTTP
  • 9.进程间通信
  • 提供MD5解密的网站
  • JAVA学习 DAY3 注释与编码规范讲解
  • Supersonic 新一代AI数据分析平台
  • 【题解-洛谷】B3622 枚举子集(递归实现指数型枚举)
  • 设计一个算法:删除非空单链表L中结点值为x的第一个结点的前驱结点
  • 零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
  • 【20250607接单】Spark + Scala + IntelliJ 项目的开发环境配置从零教学
  • Spark 之 AQE
  • OneNet + openssl + MTLL
  • 科学选购儿童用品 | 了解增塑剂(尤其邻苯类)化学成分的来源与用途,为孩子多加一层健康防护。
  • 基于SpringBoot解决RabbitMQ消息丢失问题
  • Srping Cloud Gateway 跨域配置 CorsWebFilter
  • conda指定包安装的channel