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整個過程>