本文的翻译内容是基于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,如下图所示:

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,如下图所示:

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

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

4.5 ServiceSearch Transaction

4.5.1 SDP_ServiceSearchRequest PDU

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

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

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

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

举例如下:

4.5.2 SDP_ServiceSearchResponse PDU

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

格式定义如下:

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

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

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

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

举例如下:

4.6 ServiceAttribute Transaction

4.6.1 SDP_ServiceAttributeRequest PDU

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

格式定义如下:

其中,第一个参数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。

格式定义如下:

其中,第一个参数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的集合,可以用来完成两者的功能。

格式定义如下:

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

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

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

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

举例如下:

4.7.2 SDP_ServiceSearchAttributeResponse PDU

该Package作为SDP_ServiceSearchAttributeRequest的Response。

格式定义如下:

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

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

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

举例如下:

5 Service Attribute Definitions

5.1 Universal Attribute Definitions

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

5.1.1 ServiceRecordHandle

定义如下:

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

5.1.2 ServiceClassIDList Attribute

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

形如:

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的值。

定义如下:


[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

SDP协议译稿(Part 1)的更多相关文章

  1. 蓝牙的SDP协议总结

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

  2. SDP协议分析

    一.SDP协议介绍 SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP).实时流协议(RTSP).MIME 扩展协 ...

  3. SDP协议

    会话描述协议(SDP)为会话通知.会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述.它只是用来描述,而不是一种传输协议.举例,在SIP协议的Message Header的Content- ...

  4. [转] SDP协议

    [转] SDP协议 http://blog.csdn.net/dxpqxb/article/details/18706471 1.SDP协议概述 SDP(Session Description Pro ...

  5. 蓝牙SDP协议概述

    之前写了一篇 bluedroid对于sdp的实现的源码分析   ,他其实对于sdp 协议本身的分析并不多,而是侧重于 sdp 处于Android bluedroid 架构中的代码流程,这篇文章,是针对 ...

  6. SDP协议简述

    SDP协议也是文本协议,只需要按照协议本身的格式填充.SDP协议格式即详细信息如下: 会话描述 格式及举例 v=(protocol version) v=0 o=(owner/creator and ...

  7. (转)SDP协议概述

    1 简介 SDP 完全是一种会话描述格式, 它不属于传输协议. 它使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP). 实时流协议(RTSP).MIME 扩展协议的电子邮件以 ...

  8. SDP协议介绍

    一.SDP协议介绍 SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP).实时流协议(RTSP).MIME 扩展协 ...

  9. rtsp和sdp协议简介

    RTSP是由Real network 和Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层协议. 实时流协议(RTSP)建立并控制一个或几个时间同步的连续流媒体,如音频和视频.尽管 ...

随机推荐

  1. Hark的数据结构与算法练习之插入排序

    算法说明: 先是拿语言进行一下描述: 假如是做降序排序,那么从头开始扫描每个数字,使每个数字与它前面的若干数字进行比较,直接找到小于当前数字a(当前数字以a代替)的数字b(小于a的数字以b代替). 然 ...

  2. 编程第一个Apple Watch程序创建项目

    编程第一个Apple Watch程序创建项目 2.4  编程第一个程序 本节将通过编写第一个程序,为开发者讲解如何添加Watch应用对象.运行程序.界面设计.编写代码等内容本文选自Apple Watc ...

  3. B 倒不了的塔

    Time Limit:1000MS  Memory Limit:65535K 题型: 编程题   语言: 无限制 描述 Dota是Defense of the Ancients的简称,是一个dhk和y ...

  4. 不用写软件,纯JS 实现QQ空间自动点赞

    这里分享一个自己写的点赞JS,已实现了好友动态.右侧栏猜你喜欢 点赞,有兴趣的朋友可以加上去玩玩.打开浏览器的开发者模式运行就可以看到效果了 var count = 0; var total = 0; ...

  5. ural 1273. Tie

    1273. Tie Time limit: 1.0 secondMemory limit: 64 MB The subway constructors are not angels. The work ...

  6. 详细讲解css单位px,em和rem的含义以及它们之间的区别

    一.首先介绍一下px px就是css中最基本的长度单位了,用px做单位基本上没什么问题,可以做到让页面按套路精确的展现! 可但是!但可是!如果全篇用px布局会暗藏一个蛋疼的问题,就是当用户和Ctrl滚 ...

  7. Centos 中安装Java

    http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-41940 ...

  8. linux下查看一个进程的启动时间和运行时间

    使用 ps命令 :#ps -A -opid,stime,etime,args ps -A -opid,stime,etime,args 结果: root:src# ps -A -opid,stime, ...

  9. loadView、viewDidLoad及viewDidUnload的关系

      标题中所说的3个方法,都是UIViewController的方法,跟UIViewController的view属性的生命周期息息相关.接下来我会一一阐述它们的作用以及它们之间的联系. loadVi ...

  10. virt-manage图形界面键盘错位问题

    键盘错乱问题: 启动引导问题: