SPP_UUID 是什么协议?
SPP_UUID 主要用于 经典蓝牙(Bluetooth Classic,BR/EDR) 中的 串行端口协议(SPP, Serial Port Profile),用于在蓝牙设备之间建立 虚拟串口(Serial Port) 连接,实现类似于 串口通信(UART、RS232) 的数据传输。
1. SPP(Serial Port Profile)协议简介
- 协议类型: 经典蓝牙(Bluetooth BR/EDR,不支持 BLE)
- 主要用途: 通过蓝牙模拟串口通信(类似 UART)
- 应用场景:
- 蓝牙串口模块(HC-05、HC-06、JDY-08)
- 车载蓝牙 OBD 设备(OBD2 读码器)
- 蓝牙打印机(票据打印、标签打印)
- 工业设备无线通信(PLC、单片机)
SPP 允许两个设备建立点对点(P2P)连接,模拟 RS232 串口,使用 RFCOMM(Radio Frequency Communication)协议 进行数据传输。
2. SPP_UUID(串行端口 UUID)
在 SPP 中,蓝牙设备通过 UUID(通用唯一标识符) 来标识服务,其中 SPP 使用的标准 UUID 是:
00001101-0000-1000-8000-00805F9B34FB
这个 UUID 代表 "Serial Port Profile (SPP)",在蓝牙协议中是 标准化的 UUID。
3. SPP 的工作原理
SPP 的数据传输流程:
- 设备发现(Discovery):
- 设备 A 通过 蓝牙扫描(Bluetooth Discovery) 发现周围的设备 B。
- 连接建立(Pairing & Bonding):
- 设备 A 选择设备 B 并尝试配对(某些情况下需要 PIN 码)。
- SPP 连接建立(RFCOMM 端口分配):
- 设备 A 通过
00001101-0000-1000-8000-00805F9B34FB
请求 SPP 连接。 - 设备 B 监听 RFCOMM 端口(类似串口号) 并接受连接。
- 设备 A 通过
- 数据传输:
- 设备 A & B 之间建立 双向数据通道,像 串口 一样发送/接收数据。
- 连接断开:
- 设备 A 或 B 主动断开连接。
4. SPP 和 BLE(低功耗蓝牙)的区别
特性 | SPP(Serial Port Profile) | BLE(Bluetooth Low Energy) |
---|---|---|
协议 | 经典蓝牙(BR/EDR) | 低功耗蓝牙(BLE) |
UUID | 00001101-0000-1000-8000-00805F9B34FB |
自定义 GATT UUID |
连接方式 | 使用 RFCOMM 端口模拟串口 | 使用 GATT 读/写/通知 |
数据传输速度 | 更快(最大 3 Mbps) | 较慢(典型 1 Mbps) |
功耗 | 较高(适合持续通信) | 超低功耗(适合间歇通信) |
应用场景 | OBD、打印机、单片机无线通信 | 传感器、智能手环、健康设备 |
⚠ 注意:SPP 只能用于 经典蓝牙设备(Bluetooth BR/EDR),而不能用于 BLE(低功耗蓝牙)。
5. SPP 在 Android 代码示例
(1) 连接 SPP 设备
在 Android 上使用 BluetoothSocket
连接支持 SPP 的设备:
BluetoothDevice device = bluetoothAdapter.getRemoteDevice("AA:BB:CC:DD:EE:FF");// SPP 标准 UUID
UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");BluetoothSocket socket = device.createRfcommSocketToServiceRecord(SPP_UUID);
socket.connect(); // 连接蓝牙设备
(2) 发送 & 接收数据
连接成功后,可以使用 InputStream
和 OutputStream
进行串口通信:
// 获取输入输出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();// 发送数据
String message = "Hello SPP";
outputStream.write(message.getBytes());// 读取数据
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String received = new String(buffer, 0, bytesRead);
Log.d("SPP", "收到数据:" + received);
6. SPP 在单片机(MCU)上的应用
常见的 SPP 蓝牙串口模块
模块型号 | 协议 | 特点 |
---|---|---|
HC-05 | SPP(经典蓝牙) | 可配置主/从模式 |
HC-06 | SPP(经典蓝牙) | 仅支持从机模式 |
JDY-08 | SPP & BLE | 兼容 BLE,支持 GATT |
单片机(如 Arduino、ESP32)可以通过 UART 串口 连接 HC-05 模块,并与 Android 进行 SPP 通信:
void setup() {Serial.begin(9600); // 电脑串口Serial1.begin(9600); // 蓝牙 HC-05 串口
}void loop() {if (Serial1.available()) {char c = Serial1.read();Serial.write(c); // 发送到电脑串口}
}
7. 总结
- SPP_UUID (
00001101-0000-1000-8000-00805F9B34FB
) 是 蓝牙串行端口协议(SPP) 的标准 UUID。 - SPP 适用于经典蓝牙(Bluetooth BR/EDR),用于模拟串口(UART、RS232)通信。
- 常见应用场景:
- 蓝牙串口模块(HC-05、HC-06)
- 车载 OBD 蓝牙设备
- 蓝牙打印机
- 工业自动化设备
- SPP vs BLE:
- SPP(经典蓝牙) 速度快、功耗高,适合大数据传输。
- BLE(低功耗蓝牙) 低功耗,但数据速率较低,适用于传感器数据采集。
如果你的设备是 SPP 蓝牙串口设备,那么你应该使用 SPP_UUID 进行连接,而不是 BLE 的 GATT 方式!💡