当前位置: 首页 > 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 支持良好,使用简单

相关文章:

  • 《JavaAI:稳定、高效、跨平台的AI编程工具优势解析》
  • Redis高可用架构
  • golang项目中如何使用私密仓库的扩展包
  • 【LLM大模型技术专题】「入门到精通系列教程」基于ai-openai-spring-boot-starter集成开发实战指南
  • uniapp- UTS 插件鸿蒙端开发示例 虽然我们这个示例简单 但是这个是难住很多人的一大步
  • vite+tailwind封装组件库
  • Android和硬件通信
  • 408第一季 - 数据结构 - 字符串和KMP算法
  • phosphobot开源程序是控制您的 SO-100 和 SO-101 机器人并训练 VLA AI 机器人开源模型
  • ubuntu20使用自主探索算法explore_lite实现机器人自主探索导航建图
  • PGSR : 基于平面的高斯溅射高保真表面重建【全流程分析与测试!】【2025最新版!!】
  • 中山大学美团港科大提出首个音频驱动多人对话视频生成MultiTalk,输入一个音频和提示,即可生成对应唇部、音频交互视频。
  • 【python与生活】如何构建一个解读IPO招股书的算法?
  • 机器学习的数学基础:神经网络
  • PCA笔记
  • Now formdata是什么?如何使用
  • SAP学习笔记 - 开发27 - 前端Fiori开发 Routing and Navigation(路由和导航)
  • STM32学习笔记:定时器(TIM)原理与应用(详解篇)
  • Linux进程(中)
  • AI大神吴恩达-提示词课程笔记
  • 网站中的横幅怎么做/郑州百度推广代理公司
  • 网站建设补充协议模板/今日新闻最新头条10条
  • 福州网站制作建设/易搜搜索引擎
  • hois.skxy.wordpress/seo分析案例
  • 明薇通网站建设首选/百度网站推广电话
  • 做网站的软件去哪里买/网络营销方案范文