本文的翻译内容是基于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. web应用配置

    tomcat 的 server.html 配置文件 加在</Host>之上 <Context path=”/itcast” docBase=”c:\news” /> path虚 ...

  2. Android之SurfaceView学习(一)

    对应的中文翻译SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface.你可以控制这个Surface的格式和尺寸.Surfaceview控制这个Surface ...

  3. Hark的数据结构与算法练习之若领图排序ProxymapSort

    算法说明 若领图排序是分布排序的一种. 个人理解,若领图排序算是桶排序+计数排序的变异版,桶排序计数排序理解了,那么若领图排序理解起来就会比较容易.区别其实就是存储中间值的方式做了调整…… 话说,这个 ...

  4. BZOJ4296 : [PA2015]Mistrzostwa

    先不断将度数小于D的点都删去,再找到剩下的图里最大的连通块即可. #include<cstdio> #include<algorithm> #define N 200010 i ...

  5. BZOJ3672 : [Noi2014]购票

    设d[i]表示i到1的距离 f[i]=w[i]+min(f[j]+(d[i]-d[j])*v[i])=w[i]+d[i]*v[i]+min(-d[j]*v[i]+f[j]) 对这棵树进行点分治,每次递 ...

  6. 【BZOJ】1603: [Usaco2008 Oct]打谷机(水题+dfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1603 这种水题... dfs没话说.. #include <cstdio> #inclu ...

  7. dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算(终结版)

    首先,说下概念(网上很多帖子几个地方都搞混了,理一下):   dip : device independent pixels ,设备无关像素. 我看很多帖子写的五花八门的,关于d的,什么display ...

  8. 六、saltstack的module组件

    Module是saltstack日常使用中用的最多的一个组件.用于管理操作对象. 查看系统module: [root@super65 ~]# salt 'super66' sys.list_modul ...

  9. web app

    *********Modernizr作为开发HTML5必要的js工具************ Modernizr作为开发HTML5必要的js工具 *********字体大小设 rem********* ...

  10. html5文章 -- 使用 jQuery Mobile 与 HTML5 开发 Web App ——开发原则 | Kayo's Melody

    最近专注研究 jQuery Mobile —— 一款很方便就可以把 Web App 包装成适合 Android 与 iPhone 等触屏移动设备的 Javascript 库,结合 jQuery Mob ...