蓝牙的SDP协议总结

蓝牙的SDP协议总结    http://blog.sina.com.cn/s/blog_69b5d2a50101egbb.html


1.概念
    SDP协议让客户机的应用程序发现存在的服务器应用程序提供的服务以及这些服务的属性。SDP只提供发现服务的机制,不提供使用这些服务的方法。每个蓝牙设备都需要一个SDPService,只做Client的蓝牙设备除外。

2.ServiceRecord
    每一个Service利用ServiceRecord来表示(具有唯一的32bit的Handle),每一个ServiceRecord由若干ServiceAttribute组成,由下图表示:
蓝牙的SDP协议总结_第1张图片

每一个ServiceAttribute的结构由下图所示:
      蓝牙的SDP协议总结_第2张图片
Attribute ID是由AssignedValue定义好的,例如Record Handle Attribute的ID为0x0000。
正因为SDPRecord由许多Attribute组成,所以,可以把Record看成AtributeList,这在后面的SDPresposne中会常用到。
设备通过SDP request来访问这些record的相关信息。这里有个很好的SDP实例,如下:
蓝牙的SDP协议总结_第3张图片
Service Class ID List描述了Service的类型,如0x00000000代表SDPservice
Protocol Descriptior List 列出了可能使用这种Service的protocol

3.Data Element
DataElement是在SDP中定义的一种数据结构,用来表示ServiceAttribute的Value域。每一个dataelement由Type+Size两部分组成。
Type的定义如下图:
蓝牙的SDP协议总结_第4张图片
Size的定义如下图:


几个Data Element的例子:
蓝牙的SDP协议总结_第5张图片

4.Service Class
    每一个Service都是ServiceClass的一个实例,一个Service Record就是一个ServiceClass的实例,Service Class可以表示一个Record里的所有Attribute。每一个ServiceClass有一个ID,包含在ServiceClassIDList这个Attribute的value里,称之为UUID。

5.UUID
   一个全局惟一的标识符,128bit。为了节省存储和传输开销,UUID的一些位已经固定,出现了16bit和32bit的两种UUID。这些不同bit的UUID可以相互转化,如下式:
蓝牙的SDP协议总结_第6张图片

6.SDP的数据单元格式(SDU)
    传输时都是以Big-Endian的形式,数据格式如下:
蓝牙的SDP协议总结_第7张图片
PUD ID有如下几种定义:
蓝牙的SDP协议总结_第8张图片
Transaction ID和Length定义如下:
蓝牙的SDP协议总结_第9张图片
7.SDP中的PDU
(1)Error PDU
蓝牙的SDP协议总结_第10张图片

(2)SDP_ServiceSearchRequest PDU

  ServiceSearchPattern由UUID组成,每个UUID由datalement组成。 MaximumServiceRecordCount用来指定返回的Service RecordsHandles的最大个数,由于该参数为2字节,所以其取值区间就是0x0001~0xffff。由于一个ServiceSearchPattern相匹配的ServiceRecords Handles可能有多个,所以指定该参数非常的有必要。

(3)SDP_ServiceSearchResponsePDU

TotalServiceRecordCount用来表示匹配的ServiceRecord个数,最大为65535(而且不能够大于MaximumServiceRecordCount),如果没有配置的ServiceRecord,则其值为0。

CurrentServiceRecordCount用来表示当前PDU中返回的ServiceRecord Handle的个数。

ServiceRecordHandleList包含了当前PDU中返回的所有ServiceRecord的Handles,每一个Handle用一个32bit的数据来表示,所以该参数的长度就是4×CurrentServiceRecordCount字节。

(4)SDP_ServiceAttributeRequestPDU
蓝牙的SDP协议总结_第11张图片

ServiceREcordHandle是通过SDP_ServiceSearchResponse获取到的特定的Service的ServiceRecord Handle。

参数MaximumAttributeByCount用来指定返回AttributeValue的最大总长度,以字节为单位。

第三个参数AttributeIDList用来指定一组AttributeIDList,可以是几个AttributeID,以可以是一个IDRange,如果是前者,则长度为16位,如果为后者,则长度为32位。


(5) SDP_ServiceAttributeResponsePDU

蓝牙的SDP协议总结_第12张图片

AttributeListByteCount用来表示Package中包含的数据的总长度,该值应该是小于SDP_ServiceSearchRequest中的MaxmumAttributeByteCount的一个值。

 

第二个参数AttributeLists是Service RecordAttribute 的列表项,每一项包含了Attribute ID和Attribute Value两部分。

(6)SDP_ServiceSearchAttributeRe quest PDU

ServiceSearchPattern和SDP_ServiceSearchRequest中完全一样。

第二个参数MaxmumAttributeByteCount用来指定返回AttributeValue的最大总长度,以字节为单位。

第三个参数AttributeIDList用来指定一组AttributeIDList,可以是几个AttributeID,以可以是一个IDRange,如果是前者,则长度为16位,如果为后者,则长度为32位。


(7)SDP_ServiceSearchAttributeResponse PDU

蓝牙的SDP协议总结_第13张图片

AttributeListByteCount用来表示Package中包含的数据的总长度,该值应该是小于SDP_ServiceSearchRequest中的MaxmumAttributeByteCount的一个值。

 

第二个参数AttributeLists是Service RecordAttribute 的列表项,每一项包含了Attribute ID和Attribute Value两部分。


8.一些Attributes

两种attribute每个servicerecord都有:1.ServiceRecordHandle (attribute ID0x00002).ServiceClassIDList (attribute ID0x00001)

(1)ServiceRecordHandle Attribute

蓝牙的SDP协议总结_第14张图片

(2)ServiceClassIDList Attribute



(3)ServiceRecordStateAttribute

蓝牙的SDP协议总结

(4)ServiceID Attribute


其余很多Attribute参考SPEC。


你可能感兴趣的:(蓝牙的SDP协议总结)