藍牙SDP協議

SDP協議簡介

服務器發現協議爲應用程序提供了發現服務以及確定哪些服務屬性是可以利用的能力。

其client-server架構如下圖:

由上圖可以看出,客戶端訪問服務器遵循請求-回覆原則,即client向server請求服務及屬性列表,server予以回覆,且請求和回覆一一對應。

SDP協議的重點與難點,在於理解服務、服務記錄和屬性的概念。爲了輔助理解,可以用數據庫做類比,服務爲某個數據庫(如MySQL),服務記錄則是某類的數據,屬性這是這類數據中具體的數據表格。SDP協議的作用則是發現對端所有的服務,以及該服務提供了哪些功能。

  • 服務記錄

一個服務可能是任何能爲另一個實體提供信息,採取行動或控制資源的實體。

SDP服務器維護的所有的服務信息都是包含在一個單一的服務記錄中。這個服務記錄可以是一個服務屬性的列表,如下圖所示:

其中record handle(記錄句柄)由一個32bits的無符號整形代表,在一個服務器中該句柄是唯一的。SDP不提供通知客戶端服務器的服務有改變的機制,客戶端只能通過句柄是否有效的來判斷服務是否移除了。

  • 服務屬性

服務屬性由兩部分組成,attribute ID和attribute value組成。Attribute ID是一個16bits的無符號整形,attribute value是根據attribute ID的數據序列。其結構如下圖所示:

 

協議數據單元陳述

sdp協議數據包是數據單元的集合,一個數據包中可能包含一個或多個數據單元。每個數據包的頭部都是一個type descriptor(類型描述符),佔一個字節,由兩部分組成:type descriptor(high 5-bits) 和size descriptor(low 3-bits)。

1)、type descriptor描述如下:

 

2)、size descriptor描述如下:

實際運用可以參考如下的例子:

 

協議描述

SDP協議的數據使用網絡字節序,即大端字節序,與底層HCI、L2cap協議有所區別,需要特別注意!

其協議頭部由三部分組成:PDU ID、Transaction ID和Parameter Length組成,Parameter則是上一章所述的一個個數據單元。其具體的描述如下:

其中PDU表示協議包的類型,類型種類如下圖所示:

一次完整的客戶端訪問舉例

這裏我們對ServiceSearch的request和response做簡要說明,其他有興趣的可以自行參考核心規範。

ServiceSearch Transaction一次服務發現交互事務邏輯如下圖所示:

1)、SDP_ServiceSearchRequest PDU

首先由client發起請求Service Search Request,描述如下:

2)、SDP_ServiceSearchResponse PDU

當服務器收到請求之後,給出對應的Service Search Reponse描述如下:

其參數中TotalServiceRecordCount和CurrentServiceRecordCount佔兩個字節,ServiceRecordHandleList是一系列的data element,ContinuationState佔一個字節。

SDP協議數據分析

下面我們將對sdp完整的一次通訊過程進行數據分析。

以下藍色爲hci部分、綠色爲l2cap部分、紅色爲sdp協議部分,這裏我只針對sdp進行解析,想看其他協議的數據分析,可以去看我相關的學習筆記。

1)、Master,請求Pnp information服務的屬性列表

00000010 00000011 00100000 00011000 00000000 00010100 00000000 01000000 00000000 00000110 00000000 00000000 00000000 00001111 00110101 00000011 00011001 00010010 00000000 00000010 10010000 00110101 00000101 00001010 00000000 00000000 11111111 11111111 00000000

PDU ID:00000110(SDP_ServiceSearchAttributeRequest)

Transaction ID:00000000 00000000(0x0000,本次交互的id)

Parameter Length:00000000 00001111(0x000f,數據長度爲15)

Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一個額外的字節描述後續字節長度)

Additional size:00000011(0x03,後續3個字節)

Data element header:00011001 (type=0x03,UUID;size index=0x01,UUID長度爲2個字節)

UUID:00010010 00000000(0x1200,PnP Information)

Max Amount of Attribute Data to Return: 00000010 10010000(0x0290=656)

Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一個額外的字節描述後續字節長度)

Additional size:00000101 (0x05,後續5個字節)

Data element header:00001010 (type=0x02,以補碼錶示的有符號數;size index=0x02,四個字節)

Attribute Range: 00000000 00000000 11111111 11111111(0x0000-0xffff,attribute的範圍爲0-65535)

Bytes for continuation length:00000000(0x00,後續沒有數據了)

2)、Slave,返回Pnp information服務的屬性列表

00000010 00000011 00100000 00001110 00000000 00001010 00000000 01000000 00000000 00000111 00000000 00000000 00000000 00000101 00000000 00000010 00110101 00000000 00000000

PDU ID:00000111(SDP_ServiceSearchAttributeResponse)

Transaction ID:00000000 00000000(0x0000,本次交互的id)

Parameter Length:00000000 00000101(0x0005,數據長度爲5)

Attribute List Byte Count:00000000 00000010(0x0002,屬性列表字節數爲2)

Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一個額外的字節描述後續字節長度)

Additional size:00000000(0x00,後續無數據)

Bytes for continuation length:00000000(0x00,後續沒有數據了)

3)、Master,請求L2cap服務的屬性列表

00000010 00000011 00100000 00011000 00000000 00010100 00000000 01000001 00000000 00000110 00000000 00000000 00000000 00001111 00110101 00000011 00011001 00000001 00000000 00000010 10010000 00110101 00000101 00001010 00000000 00000000 11111111 11111111 00000000

PDU ID:00000110(SDP_ServiceSearchAttributeRequest)

Transaction ID:00000000 00000000(0x0000,本次交互的id)

Parameter Length:00000000 00001111(0x000f,數據長度爲15)

Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一個額外的字節描述後續字節長度)

Additional size:00000011(0x03,後續3個字節)

Data element header:00011001 (type=0x03,UUID;size index=0x01,UUID長度爲2個字節)

UUID:00000001 00000000(0x0100,L2CAP)

Max Amount of Attribute Data to Return: 00000010 10010000(0x0290=656)

Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一個額外的字節描述後續字節長度)

Additional size:00000101 (0x05,後續5個字節)

Data element header:00001010(type=0x02,以補碼錶示的有符號數;size index=0x02,四個字節)

Attribute Range: 00000000 00000000 11111111 11111111(0x0000-0xffff,attribute的範圍爲0-65535)

Bytes for continuation length:00000000(0x00,後續沒有數據了)
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章