1. 概念
SDP, Service Discovery Protocol,服務發現協議
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用Service Record來表示;每一個Service Record由若干Service Attribute組成,如下圖所示
在SDP Server中,用Service Record Handle來唯一標識一個Service Record
而Service Record Handle則使用32-bit數字表示
在Service Record List中,Server使用0x00000000來表示SDP本身
3. 服務屬性
每個服務屬性(Service Attribute)描述了一個服務的單個特征,實例如下
一個服務屬性包含了兩個部分: Attribute ID和Attribute Value
Attribute ID是16-bit無符號整型,用以區分Server中不同屬性,屬性ID還確定了相關的屬性值的語義
Attribute Value字段長度是可變的,由關聯屬性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(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(PDU ID=0x03)的Parameters包括
TotalServiceRecordCount, CurrentServiceRecordCount, ServiceRecordHandleList, ContinuationState
8.5 服務屬性事務
ServiceAttribute Transaction
8.6 服務屬性查找事務
ServiceSearchAttribute Transaction
TIP: 8.4.2, 8.5及8.6均為詳細定義,此處不累述,詳情見規范
參考:
<藍牙的SDP協議總結>
<SDP協議譯稿(Part 1)>
<FTS抓包看藍牙的SDP整個過程>