Bluetooth SDP介紹


1. 概念

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

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

image

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組成,如下圖所示

image

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

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

3. 服務屬性

每個服務屬性(Service Attribute)描述了一個服務的單個特征,實例如下

image

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

image

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的類型描述符用來表示,它包含在首部字段第一個字節的高五位
下面是已經定義的類型

image

7.2 大小描述符

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

image

7.3 數據單元實例

image

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

 image

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

image

8.2 Partial Responses And Continuation State

image

8.3 錯誤處理

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

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

 image

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM