本文作者的部落格地址:http://blog.sina.com.cn/samzhen1977
作者:Sam (甄峰) sam_code@hotmail.com
Service Discovery
Protocol(SDP)提供一種能力,讓應用程式有方法發現哪種服務可用以及這種服務的特性。
服務發現協議(SDP或Bluetooth
SDP)在藍芽協議棧中對藍芽環境中的應用程式有特殊的含意,發現哪個服務是可用的和確定這些可用服務的特徵。SDP定義了bluetooth
client發現可用bluetooth
server服務和它們的特徵的方法。這個協議定義了客戶如何能夠尋找基於特定屬性的服務而不讓客戶知道可用服務的任何知識。SDP提供發現新服務的方
法,在當客戶登入到正在操作的藍芽伺服器的一個地區時是可用的時。
Service
discovery機制提供client應用程式偵測server應用程式提供的服務的能力,並且能夠得到服務的特性。服務的品質包含服務type或服務
class.
SDP也提供SDP server與SDP client之間的通訊。SDP
server維護著一個服務條目(service
record)
列表.每個服務條目
描述一個單獨的服務屬性。 SDP
client可以通過發送SDP request來得到服務條目
。
如果一個client或者依附於client之上的應用程式決定使用某個service.
它建立一個單獨的串連到service提供者。 SDP
只提供偵測Service的機制,但不提供如何利用這些Service的機制。Sam覺得,這裡其實是說:SDP只提供偵測Service的辦法,但如何
用,SDP不管。
每個Bluetooth Device最多隻能擁有一個SDP Server。如果一個Bluetooth
Device只擔任Client,那它不需要SDP Server。但一個Bluetooth Device可以同時擔當SDP
Server和SDP client.
Service Record(Service 條目)
:
一個service是一個實體為另一個實體提供資訊,執行動作或控制資源。一個service可以由軟體,硬體或軟硬體結合提供。
所有的Service資訊都包含於一個Service Record內。一個Service
Record 包含一個Service attribute(Service屬性) list.
在一個SDP Server內,每個Service Record擁有一個32-bit的唯一性資料。通常,這個唯一性只是在每個SDP
Server內部。 如果SDP Server S1 和SDP Server S2擁有同樣的一個Service
Record。那他們在不同SDP Sever內的獨特數值並不一定相同。
SDP在SDP Server增加或減少Service Record時,並不會通知SDP client.
Service Attribute(Service
屬性):
每個Service屬性描述servcie的特性.一個Service Attribute由2部分:
Attribute ID + Attribute Value。
Attribute ID:16-bit不帶正負號的整數,用於區別一個Service Record內的其它屬性。
Attribute Value:Attribute值。
Service Class:
每個Service 都是某個Service Class的執行個體. Service Class定義了Service
Record中包含的Service 屬性。屬性ID,屬性值都被定義好了。
每個Service Class也有一個獨特ID。這個Service
Class標識符包含在屬性值ServiceClassIDList屬性中。並描繪為UUID
。自從Service
Record中的屬性格式以及含義依賴於Service Class後,ServiceClassIDList屬性變得非常重要。
Searching For Service:
Service Search transaction(事務?)允許client得到Service Record
Handle。一旦SDP Client得到Service Record
Handle,它就可以請求這個Record內具體屬性的值。
如果某個屬性值UUID,則可以通過尋找UUID查到這個屬性。
UUID: universally unique identifier.(唯一性標識符)
SDP協議棧使用request/response模式工作,每個傳輸過程包括一個request protocol data
unit(PDU)和一個response PDU. SDP使用L2CAP串連傳輸資料。在發送Request
PDU但未收到Response PDU之前,不能向同一個server再發送Request PDU。
PDU:protocol Data unit
PDU ID:用來識別PDU。
TransactionID:
用來識別Request PUD以及Response PUD。並用來對比某個Response PUD是否對應著Request
PUD。