Bluetooth SDP

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字节。
 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章