本文的翻译内容是基于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. LoadRunner中web_custom_request 和 web_submit_data的差别

  2. c++ string 结束符‘\000’

    昨天输出string类型时总是出错,发现输出到文件的一行里多了^@,输出到console却看不到,debug发现,string类型中多了\000,这主要由于我想要用\0截掉字符串最后一位,所以把字符串 ...

  3. 有关g++编译调试的问题

    打了个指针版的treap,想用gdb调试,用gcc -g ×××.cpp -o a 时却报错了——直接用gcc编译却不会报错,提示:对‘operator new(unsigned int)’未定义的引 ...

  4. Java多线程初学者指南系列教程

    转自:http://developer.51cto.com/art/200911/162925.htm 51cto 本系列来自NokiaGuy的“真的有外星人吗”博客,系列名称为<Java多线程 ...

  5. 【wikioi】1116 四色问题

    题目链接 算法:DFS 刚开始卡了一下,但后面想了想,于是 放上代码: #include <iostream> using namespace std; bool map[9][9]; i ...

  6. linux rootfs制作

    http://blog.sina.com.cn/s/blog_6795385f01011ifg.html 作一个嵌入式Linux rootfs,并且实现 web 服务 1. 文件系统简介 •理论上说一 ...

  7. QT基本使用

    安装方法: ubuntu12.04下安装QT方法:http://blog.csdn.net/xsl1990/article/details/8299756 输入以下命令: sudo apt-get i ...

  8. httpclient爬取性感美图

    依赖httpclient4.2,Jsop SemeiziCrawler.java package kidbei.learn.crawler; import java.io.File; import j ...

  9. CSS中zoom:1的作用 ,小标签大作用

    CSS中zoom:1的作用兼容IE6.IE7.IE8浏览器,经常会遇到一些问题,可以使用zoom:1来解决,有如下作用:触发IE浏览器的haslayout解决ie下的浮动,margin重叠等一些问题. ...

  10. CSS实现样式布局

    使用CSS建站时,您肯定遇到过形形色色的布局问题,最后可能被搞得焦头烂额.本文的目的是让您的设计过程更为容易,当您遇到困难时为您提供快速参考. 1.有疑问,先验证 在调试时,先对您的代码进行验证往往能 ...