基本概念
藍牙串口是基於 SPP 協議(Serial Port Profile),能在藍牙設備之間創建串口進行數據傳輸的一種設備。 藍牙串口的目的是針對如何在兩個不同設備(通信的兩端)上的應用之間保證一條完整的通信路徑。具體的基本流程如下:
設備A:這個設備會發起一個連接另外設備的請求。
設備B:這個設備等待另外一個設備發起連接請求。
協議棧分層
這個應用兩邊都是典型的傳統應用,能夠通過一個虛擬串口通道和對方通信。通過下圖可以看出,SPP的協議棧使用的還是rfcomm通道,這個是藍牙中比較古老的通道了。

基本流程
連接流程一般分成三個部分,如下所示:
1 創建虛擬連接:
A 使用SDP提交一個請求來查找RFCOMM服務信道號碼。
B 請求對遠端設備進行認證。
C 向遠端的RFCOMM通道發起一個新的L2CAP請求。
D 在L2CAP通道上初始化一個RFCOMM連接。
E f在RFCOMM連接上創建一個新的數據連接。
2 接受虛擬串口連接:
A 接受發起設備端的認證請求並做處理.
B 在L2CAP層接收一個新的連接。
C 接受RFCOMM連接請求在RFCOMM通道上
D 在RFCOMM通道上接收數據連接請求。
3 在本地SDP數據上注冊服務
SPP的API參數
/** A connection has been established with a remote device.
- When this callback is received, the “spp_callback_parms.p.remDev” field
- contains a pointer to the remote device context.
*/
#define BTIF_SPP_EVENT_REMDEV_CONNECTED 0
/** A connection has been terminated for a remote device.
- When this callback is received, the “spp_callback_parms.p.other” field
- contains a 0.
*/
#define BTIF_SPP_EVENT_REMDEV_DISCONNECTED 1
/** The data has been sent out. At this time the tx buffer can be released.
- When this callback is received, the “spp_callback_parms.p.other” field
- is from data structure SppTxDone_t.
*/
#define BTIF_SPP_EVENT_DATA_SENT 2
/** A request to close a channel was received.
- When this callback is received, the “spp_callback_parms.p.other” field
- contains a 0.
*/
#define BTIF_SPP_EVENT_REMDEV_DISCONNECTED_IND 3
/** A request to open a channel was received.
- When this callback is received, the “spp_callback_parms.p.remDev” field
- contains a pointer to the remote device context.
- This is an opportunitity for the server to reject the incoming request. To
- reject the request modify spp_callback_parms.status to be BT_STATUS_CANCELLED.
*/
#define BTIF_SPP_EVENT_REMDEV_CONNECTED_IND 4
