关于蓝牙SPP配置的详细过程,之前的有所缺少细节
注意:SPP(Serial Port Profile)是建立在RFCOMM之上的,而RFCOMM又依赖于L2CAP和ACL链路。同时,服务发现(SDP)用于获取RFCOMM的服务器通道号。
完整步骤:
ACL链路建立(物理连接)
L2CAP信令通道建立(CID 0x0001)
SDP服务发现(使用UUID 0x1101查找SPP服务,获取RFCOMM服务器通道号)
为RFCOMM建立L2CAP通道(使用PSM 0x0003,并分配一个动态CID)
L2CAP通道配置协商(包括MTU、刷新超时等参数)
RFCOMM多路复用器建立(使用DLCI 0,即RFCOMM控制通道)
RFCOMM参数协商(通过DLCI 0交换参数,包括优先级、最大帧大小、信用值等)
目标RFCOMM数据通道建立(使用DLCI = 2 * 服务器通道号,并可能进行参数协商)
SPP数据通信开始
整体时序图
客户端 (Initiator) 服务端 (SPP Server)| || --- HCI_Create_Connection --------> | // 1. ACL物理连接| <--- HCI_Connection_Complete ------ | // Handle分配| || --- L2CAP_Connection_Request(信令) > | // 2. L2CAP信令通道| <--- L2CAP_Connection_Response ---- | // CID 0x0001建立| || --- SDP_ServiceSearchRequest ------> | // 3. SDP服务发现| <--- SDP_ServiceSearchResponse ---- | // UUID=0x1101| --- SDP_ServiceAttributeRequest ---> | // 获取服务属性| <--- SDP_ServiceAttributeResponse - | // RFCOMM通道号| || --- L2CAP_Connection_Request(PSM=3)> | // 4. RFCOMM L2CAP通道| <--- L2CAP_Connection_Response ---- | // 动态CID分配| || --- L2CAP_Configure_Request ------> | // 5. L2CAP参数协商| <--- L2CAP_Configure_Response ----- | // MTU, Flush Timeout| --- L2CAP_Configure_Request ------> | // 可能双向配置| <--- L2CAP_Configure_Response ----- | | || --- RFCOMM_SABM(DLCI=0) ----------> | // 6. RFCOMM多路复用器| <--- RFCOMM_UA(DLCI=0) ------------ | // 控制通道建立| || --- RFCOMM_PN_CMD(DLCI=0) --------> | // 7. 多路复用器参数协商| <--- RFCOMM_PN_RSP(DLCI=0) -------- | // 流控参数| || --- RFCOMM_PN_CMD(目标DLCI) ------> | // 8. 数据通道参数协商| <--- RFCOMM_PN_RSP(目标DLCI) ------ | // 串口参数| || --- RFCOMM_SABM(目标DLCI) --------> | // 9. 目标数据通道建立| <--- RFCOMM_UA(目标DLCI) ---------- | // 数据通道确认| || === SPP数据通信开始 ===============> | // 10. 应用数据传输
关键标识符总结
| 协议层 | 标识符类型 | 值/范围 | 说明 |
|---|---|---|---|
| HCI | Connection Handle | 0x0400-0x0EFF | 物理连接标识 |
| L2CAP | 信令CID | 0x0001 | 固定信令通道 |
| L2CAP | 数据CID | 0x0040-0xFFFF | 动态分配逻辑通道 |
| L2CAP | PSM | 0x0003 | RFCOMM固定协议ID |
| SDP | UUID | 0x1101 | SPP服务标识 |
| SDP | Server Channel | 1-30 | RFCOMM服务通道号 |
| RFCOMM | 多路复用器DLCI | 0 | 控制通道 |
| RFCOMM | 数据DLCI | 2×Server Channel | 数据通道计算 |
