Bluetooth SDP介紹

SDP, Service Discovery Protocol,服務發現協議

1. 概念

SDP提供了一種用於發現服務及這些可用服務屬性的方法,但它不提供利用這些服務的機制。

其架構是Client-Server模式,如下圖所示


SDP Server維護了一個服務記錄(Service Record)列表,每個條目包含了該服務的信息。
SDP Client通過SDP request來向SDP Server獲取服務記錄信息

Client可以通過打開一條單獨的連接來使用Server提供的某種服務

當Server的服務改變時,Client必須通過其他方式來了解這一信息,以便能夠通過SDP來查詢
同時,當Server由於某種原因不可用時,Client可以使用SDP輪詢Server
當Server不再相應請求時,Client可以推斷該Server不可用。

2. 服務記錄(Service Record)

每一個Service用Service Record來表示
每一個Service Record由若干Service Attribute組成,如下圖所示


在SDP Server中,用Service Record Handle來唯一標識一個Service Record
而Service Record Handle則使用32-bit數字表示

ServiceRecordState and ServiceDatabaseState attributes

在Service Record List中,Server使用0x00000000來表示SDP本身

3. 服務屬性(Service Attribute)

每個服務屬性描述了一個服務的單個特徵,實例如下


一個服務屬性包含了兩個部分: 屬性ID和屬性值


屬性ID是16-bit無符號整型,用以區分Server中不同屬性,屬性ID還確定了相關的屬性值的語義

屬性值字段長度是可變的,由關聯屬性ID和服務記錄類別決定

4. 服務類(Service Class)

每個服務是一個服務類的實例
服務類定義了包含在該類服務記錄的所有屬性
每個屬性定義了指定的屬性ID,及使用的屬性值和屬性值得格式
服務記錄包含了特定服務類及通用服務類的屬性

每個服務類被分配了唯一的標識符
這個服務類標識符包含了ServiceClassIDList屬性的屬性值,被稱爲UUID

5. 服務查找

服務查找允許Client基於包含服務記錄的屬性值,來獲取特定服務記錄的服務記錄句柄(Service Record Handle)

當一個SDP Client有某個服務記錄句柄時,它可以請求特定的屬性值

SDP不提供基於任意屬性值的服務記錄查找,只提供基於UUID的查找
可用於搜索服務的重要屬性被表示爲的UUID

5.1 UUID

UUID是一個128位的值,藍牙Base UUID值爲0x00000000-0000-1000-8000-00805F9B34FB
其他已定義的UUID可參考<UUID>

爲了簡化實用,我們實用16-bit和32bit UUID來代表真實的UUID,

5.2 服務搜索模式(Service Search Patterns)

服務搜索模式使用UUID列表來定位匹配的服務記錄

6. 服務瀏覽

SDP提供了基於服務類共享屬性機制來瀏覽服務,這個屬性被稱爲BrowseGroupList

Client通過創建一個包含代表根瀏覽組的UUID的服務搜索模式來瀏覽Server的服務

7. 數據表示

SDP的使用數據單元(Data Element)來表示數據(屬性ID,屬性ID範圍,屬性值)

數據單元是一種類型化的數據表示,它由兩個字段組成:首部字段(Header Field)和數據字段(Data Field)

首部字段包含兩個部分: 類型描述符(Type Descriptor)和大小描述符(Size Descriptor)
數據字段是一個字節序列,其長度由大小描述符指定,其含義則由類型描述符指定

7.1 類型描述符

數據單元的類型使用5-bit的類型描述符用來表示,它包含在首部字段第一個字節的高五位。
下面是已經定義的類型


7.2 大小描述符

數據單元的大小描述符包含在首部字段第一個字節的低三位
它表示爲的大小指數,其後爲0/8/16/32bits
大小指數的編碼如下


7.3 數據單元實例


8. 協議說明

SDP使用Request/Response模型
其中每個事務(Transaction)包含一個請求協議數據單元(PDU)和一個響應PDU

SDP使用L2CAP作爲傳輸協議,在建立連接併發出SDP Request後
在給定的時間內,只有收到該Request的Response後,才能發出其他的Request

傳輸採用Big-Endian,高位先低位後的方式

8.1 PDU格式

SDP PDU包含一個Header和Parameters

Header包含三個字段: PDU ID, Transaction ID, ParameterLength

 

其中,Header三個字段的含義分別如下


8.2 Partial Responses And Continuation State


8.3 錯誤處理

當一個Server認爲Client的Request格式不正確或其他原因導致沒有合適的Response時
應該回應一個SDP_ErrorResponse PDU(PDU ID=0x01)

同時,其Parameters爲ErrorCode,ErrorCode詳細信息如下

 

8.4 服務查找事務

ServiceSearch Transaction

8.4.1  SDP_ServiceSearchRequest PDU

SDP_ServiceSearchRequest PDU(PDU ID=0x02)的Parameters包括
ServiceSearchPattern, MaximumServiceRecordCount, ContinuationState

ServiceSearchPattern(Size: Varies):

Value Parametr Description
Data Element Sequence ServiceSearchPattern是一個數據單元序列,每個單元是一個UUID,單元數爲1~12

MaximumServiceRecordCount(Size: 2 Bytes):

Value Parametr Description
N MaximumServiceRecordCount是一個16-bit數,指定可返回的了最大的服務記錄句柄,取值範圍: 0x0001~0xFFFF

ContinuationState(Size: 1~17 Bytes):

Value Parametr Description
Continuation State ContinuationState是一個8-bit數N,隨後的N Bytes是Continuation State信息,N的範圍爲0~16,0表示沒有Continuation State

8.4.2  SDP_ServiceSearchResponse PDU

SDP_ServiceSearchResponse PDU(PDU ID=0x03)的Parameters包括
TotalServiceRecordCount, CurrentServiceRecordCount, ServiceRecordHandleList, ContinuationState

8.5 服務屬性事務

ServiceAttribute Transaction

8.6 服務屬性查找事務

ServiceSearchAttribute Transaction

TIP: 8.4.2, 8.5及8.6均爲詳細定義,此處不累述,詳情見規範

9. 服務屬性定義

9.1 Universal Attribute Definition

9.2 ServiceDiscoveryServer Service Class Attribute Definitions

9.3 BrowseGroupDescriptor Service Class Attribute Definitions

TIP: 9主要描述了屬性ID,屬性值類型及屬性相關說明,詳情見規範

關於SDP,更多內容,可參考如下文章
<藍牙的SDP協議總結>
<SDP協議譯稿(Part 1)>
<FTS抓包看藍牙的SDP整個過程>

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