SPP
BR/EDR SPP(Serial Port Profile)
学习目标
- 理解 SPP 工作原理——基于 RFCOMM 的串口仿真协议
- 掌握 Server 端
spp_server_create()→spp_server_accept()的完整流程 - 掌握 Client 端
spp_connect()连接指定设备 - 能够在 WS63 上实现经典蓝牙串口透传,与手机蓝牙串口 APP 互通
基本概念
SPP vs BLE 透传
| 对比项 | SPP(BR/EDR) | BLE 透传 |
|---|---|---|
| 底层协议 | RFCOMM(RS-232 仿真) | GATT Notify/Write |
| 吞吐量 | ~1Mbps(EDR) | ~50-800Kbps |
| 功耗 | 较高 | 低 |
| 兼容性 | 几乎所有手机 | BLE 4.2+ |
RFCOMM 通道模型
SPP 在 L2CAP 之上封装 RFCOMM——应用层看到的是一个"socket":spp_write() 写到对端,对端 receive_data_cb 收到数据。
涉及 API
| API | 谁调用 | 用途 |
|---|---|---|
enable_bt_stack() |
双方 | 使能经典蓝牙协议栈 |
bluetooth_set_local_name() |
双方 | 设置可见名称 |
spp_server_create(&socket_para, name, len) |
Server | 创建 SPP Server socket |
spp_server_accept(server_id) |
Server | 开始接受连接 |
spp_connect(&socket_para, &bd_addr) |
Client | 连接 Server |
spp_write(client_id, data, len) |
双方 | 发送数据 |
spp_register_callbacks(&func) |
双方 | 注册回调 |
案例说明
做什么
WS63 作为 SPP Server,等待手机蓝牙串口 APP 连接 → 双向透传数据。
关键配置
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Service UUID | 00001101-...-8000-00805F9B34FB |
SPP 标准 UUID |
| Service Name | WS63-SPP |
手机 APP 上显示 |
| Socket Type | SPP_SOCKET_RFCOMM |
|
| 安全等级 | Level 1(调试)/ Level 2(产品) |
代码详解
/* BT Stack 初始化 */
enable_bt_stack();
bluetooth_set_local_name("WS63-SPP", 8);
/* Server 端创建 socket */
spp_create_socket_para_t para = {
.uuid = "00001101-0000-1000-8000-00805F9B34FB",
.socket_type = SPP_SOCKET_RFCOMM
};
int server_id = spp_server_create(¶, "WS63-SPP", 8);
spp_server_accept(server_id);
/* Client 端连接 */
gap_connect_remote_device(&bd_addr); // 先建 ACL
spp_connect(¶, &bd_addr); // 再连 SPP
/* 数据收发 */
spp_write(client_id, "hello", 5);
/* 对端 receive_data_cb 收到 "hello" */