SDP协议译稿(Part 1)

时间:2024-03-26 18:02:56

本文的翻译内容是基于Bluetooth Core Spec 2.1+EDR 协议中对SDP的描述,很多都是个人的理解,难免有疏漏,有争议或者疑问的地方,欢迎在此留言进行探讨。

2. Overview

2.2 Service Record

Service是一个可以提供信息,完成一些动作以及控制资源的实体,英文描述如下:“A service is any entity that can provide information, perform an action, or con-

trol a resource on behalf of another entity. A service may be implemented as

software, hardware, or a combination of hardware and software.”

Service的信息以Service Record的形式存在于Server端,通过service record handle可以对service record进行访问。在每一个SDP Server中,service record handle以一个唯一的32位长的数据存在。

2.3 Service Attribute

Service Attribute用来对Service的特性进行描述,每一个Service Attribute包括Attribute ID和Attribute Value两部分。

Attribute ID在每一个Service Record中是唯一的,为16位长,在SDP协议中,一个Attribute ID对应一个Data Element。

Attribute Value长度不固定,其含义由对应的Attribute ID和Service Class决定。

2.4 Service Class

每一个Service就是Service Class的一个实例,并且对应一个128位唯一的UUID。

从Service Attribute Service Class ID List的Attribute Value可以找到该UUID,如下图所示:

SDP协议译稿(Part 1)

2.5 Searching for services

Search Service transaction允许client去获取server record handle并进一步通过server record handle来获取指定service attribute的value信息。

2.5.2 Service Search Patterns

一个Service Search Patterns由一个或者多个UUIDs组成,用来定位对应的Service Records。Service Search Patterns中的UUID包含在Service Records中的任何一个Service Attribute Value中[p1] 。

只有当Service Search Pattern中的UUIDs是Service Attribute的子集的时候,两者才称的上匹配。如果有一个UUID不在Service Attribute中的话,两者就算不上匹配。

由此可见,两者匹配的条件是Service Search Pattern中的UUIDs是Service Attribute的子集。

原文描述如下:

“The service search pattern matches if the UUIDs it contains constitute a subset of the UUIDs in the service record’s attribute values. The only time a service search pattern does not match a service record is if the service search pattern con-tains at least one UUID that is not contained within the service record’s attribute values. Note also that a valid service search pattern must contain at least one UUID.”

在协议中,Service Search Pattern至少要包含一个UUID,最多包含的UUID个数为12个(详细可以参照vol3 SDP PDU Parameters ServiceSearchPattern的描述),在CE中同样规定了最多包含的UUID个数为12个(参照MAX_UUIDS_IN_QUERY的定义)。

定义如下:

// Restrictions on searching for a particular service
typedef struct _BTHNS_RESTRICTIONBLOB {
    ULONG type[p2] ;
    ULONG serviceHandle;
    SdpQueryUuid uuids[MAX_UUIDS_IN_QUERY];
    ULONG numRange;
    SdpAttributeRange pRange[];
    } BTHNS_RESTRICTIONBLOB, *PBTHNS_RESTRICTIONBLOB;

typedef /* [switch_type] */ union SdpQueryUuidUnion
{
    /* [case()] */ GUID uuid128;
    /* [case()] */ ULONG uuid32;
    /* [case()] */ USHORT uuid16;
} SdpQueryUuidUnion;

typedef struct _SdpQueryUuid
{
    /* [switch_is] */ SdpQueryUuidUnion u;
    USHORT uuidType;[p3]
} SdpQueryUuid;

4. Protocol description

4.2 Protocol Data Unit Format

SDP PDU包括Header和Parameter两部分,其中Header又包括了PDU ID,Transaction ID和Parameter Length,如下图所示:

SDP协议译稿(Part 1)

其中PDU ID是比较熟悉的内容,常见的值如下:

SDP协议译稿(Part 1)

PDU ID是一个通用的内容,用来在不同的PDU中插入一个编号,有效值为0~0xffff。

4.5 ServiceSearch Transaction

4.5.1 SDP_ServiceSearchRequest PDU

该包包含了三个参数,PDU格式定义如下:

SDP协议译稿(Part 1)

其中,ServiceSearchPattern如前面2.5.2所描述,包含了一组UUIDs,用来获取对应的Service Records Handle。

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

第三个参数contiunationState,在此不作解释。

举例如下:

SDP协议译稿(Part 1)

4.5.2 SDP_ServiceSearchResponse PDU

该Package包含四个参数,长度取决于返回的CurrentServiceRecordCount的个数,由于TotalServiceRecordCount可能最大0xffff,所以该Package有可能被分割为多个PDUs。

格式定义如下:

SDP协议译稿(Part 1)

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

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

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

最后一个参数ContinuationState,在此不作解释。

举例如下:

SDP协议译稿(Part 1)

4.6 ServiceAttribute Transaction

4.6.1 SDP_ServiceAttributeRequest PDU

该Package用来由SDP Client发出,作用是通过Service Record Handle获取SDP Server指定的Service的Attribute Value。

格式定义如下:

SDP协议译稿(Part 1)

其中,第一个参数ServiceREcordHandle是通过SDP_ServiceSearchResponse获取到的特定的Service的Service Record Handle。

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

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

最后一个参数ContinuationState,在此不作解释。

4.6.2 SDP_ServiceAttributeResponse PDU

该Package返回SDP Client查询的Attribute ID对应的Attribute Value。

格式定义如下:

SDP协议译稿(Part 1)

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

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

最后一个参数ContinuationState,在此不作解释。

4.7 ServiceSearchAttribute Transaction

4.7.1 SDP_ServiceSearchAttributeRequest PDU

该Package是SDP_ServiceSearchRequest和SDP_ServiceAttributeRequest的集合,可以用来完成两者的功能。

格式定义如下:

SDP协议译稿(Part 1)

其中参数ServiceSearchPattern和SDP_ServiceSearchRequest中完全一样。

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

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

最后一个参数ContinuationState,在此不作解释。

举例如下:

SDP协议译稿(Part 1)

4.7.2 SDP_ServiceSearchAttributeResponse PDU

该Package作为SDP_ServiceSearchAttributeRequest的Response。

格式定义如下:

SDP协议译稿(Part 1)

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

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

最后一个参数ContinuationState,在此不作解释。

举例如下:

SDP协议译稿(Part 1)

5 Service Attribute Definitions

5.1 Universal Attribute Definitions

这里用来定义一些标注的Attribute ID。

5.1.1 ServiceRecordHandle

定义如下:

SDP协议译稿(Part 1)

含义就不必说了吧,形如:

SDP协议译稿(Part 1)

5.1.2 ServiceClassIDList Attribute

由一组UUID组成,每一个UUDI表示一个Service Class,定义如下:

SDP协议译稿(Part 1)

形如:

SDP协议译稿(Part 1)

5.1.3 ServiceRecordState Attribute

用来表示Service Record中的Attribute Value的缓存状态,如果Attribute Value产生了变化,包括Delete,Add或者Changed,则该值就会发生变化。

原文描述如下“The attribute is used to facilitate caching of ServiceAttributes[p4] ”。

如果前后两次获取该值的时候,其值没有产生变化的话,说明Service Record的Attribute没有产生任何变化。

该值的意义在于SDP Client可以通过其来检测Attribute是否产生了变化,以决定是否要重新获取Service Attribute的值。

定义如下:

SDP协议译稿(Part 1)


[p1]

Q:我的疑问是这些UUID要全部包含在Attribute Value么,还是只需要部分包含在Attribute Value中呢?

A:必须全部包含。

[p2]

Q:什么意思

A:用来指定PDU的类型,也即Element的类型,可供选择的值有:

#define SDP_ERROR_RESPONSE                        0x01
#define SDP_SERVICE_SEARCH_REQUEST                0x02
#define SDP_SERVICE_SEARCH_RESPONSE               0x03
#define SDP_SERVICE_ATTRIBUTE_REQUEST             0x04
#define SDP_SERVICE_ATTRIBUTE_RESPONSE            0x05
#define SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST      0x06
#define SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE     0x07

[p3]

Q:uuidType含义

A:在通过参数u指定了uuid12/32/128的值后,需要通过uuidType来告诉系统uuid的类型,可选择的值有如下三个:

SDP_ST_UUID16 = 0x0130,

SDP_ST_UUID32 = 0x0230,

SDP_ST_UUID128 = 0x0430

[p4]

Q:从该值可以判断出来是哪些Service Attribute 产生了变化么?

A: I don’t know