1、 what is SDP?
SDP(service discovery protocol:服務發現協議)。SDP協議讓客戶機的應用程序發現存在的服務器應用程序提供的服務以及這些服務的屬性。
SDP提供了一套SDP server和SDP client之間的通訊方法。 SDP server維護着一個服務條目列表,這個列表存放着SDP server對應的服務以及服務特性。每個服務條目對應一個單獨的服務。SDP client可以通過發送請求得到SDP server維護的這個服務條目list。
如果SDP client或者聯繫於client之上的應用程序決定使用某個service,則打開一個針對此服務的連接到服務提供者去使用此服務。SDP只是提供偵測service以及特性的方法,但不提供如何使用這些service的方法。
每個bluetooth device最多有一個SDP server。 如果某個device只作爲client.則不需要擁有SDP server。而一個bluetooth device可以同時爲SDP client和SDP server。
2、 SDP record
SDP server維護的service條目包含在service record中,即每一個Service利用ServiceRecord來表示(具有唯一的32bit的Handle),每一個ServiceRecord由若干ServiceAttribute組成,如下圖表示:
而每一個ServiceAttribute的結構由下圖所示:
其中,Attribute ID是由Assigned Value定義好的,例如Record Handle Attribute的ID爲0x0000。
所以,我們可以把Service Record看成一個Attribute List。當Client來讀取SDP server時,實際上就是獲取這個Attribute List中的信息。
這裏有個很好的SDP實例,如下:
Service Class ID List描述了Service的類型,如0x00000000代表SDP service。
Protocol Descriptior List 列出了可能使用這種Service的protocol。
注意:當SDP server添加或刪除某個service時,不會主動提供給client.
3、 Data Element
Data Element是在SDP中定義的一種數據結構,用來表示Service Attribute的Attribute Value域。每一個data element由Type+Size兩部分組成。
1) Type的定義如下圖:
2) Size的定義如下圖:
3)舉例:
4、 Service Class
每一個Service都是Service Class的一個實例,即一個Service Record就是一個Service Class的實例,Service Class可以表示一個Record裏的所有Attribute。每一個Service Class有一個ID,包含在ServiceClassIDList這個Attribute的value裏,稱之爲UUID。
5、 UUID
一個全局惟一的標識符,128bit。爲了節省存儲和傳輸開銷,UUID的一些位已經固定,出現了16bit和32bit的兩種UUID。這些不同bit的UUID可以相互轉化,如下式:
6、 SDP Data Format(大端)
1)PDU ID格式:
2)Transaction ID and ParameterLength:
7、 SDP的PDUs舉例
1)Error PDU:
2)SDP_ServiceSearchRequest PDU
ServiceSearchPattern由UUID組成,每個UUID由data lement組成。
MaximumServiceRecordCount用來指定返回的Service Records Handles的最大個數,由於該參數爲2字節,所以其取值區間就是0x0001~0xffff。由於一個ServiceSearchPattern相匹配的Service Records Handles可能有多個,所以指定該參數非常的有必要。
3)SDP_ServiceSearchResponse PDU
TotalServiceRecordCount用來表示匹配的Service Record個數,最大爲65535(而且不能夠大於MaximumServiceRecordCount),如果沒有配置的Service Record,則其值爲0。
CurrentServiceRecordCount用來表示當前PDU中返回的Service Record Handle的個數。
ServiceRecordHandleList包含了當前PDU中返回的所有Service Record 的Handles,每一個Handle用一個32bit的數據來表示,所以該參數的長度就是4×CurrentServiceRecordCount字節。