蓝牙核心规范(V5.2)7.2-深入详解之SDP(五星推荐☆☆☆☆☆)

举报
心跳包 发表于 2021/11/12 23:34:26 2021/11/12
【摘要】 蓝牙篇之蓝牙核心规范(V5.2)深入详解汇总 目录  1. SDP(The Service Discovery protocol )作用        2.SDP客户端和服务器架构  3.服务记录  4.服务属性  5.服务...


蓝牙篇之蓝牙核心规范(V5.2)深入详解汇总


目录

 1. SDP(The Service Discovery protocol )作用      

 2.SDP客户端和服务器架构

 3.服务记录

 4.服务属性

 5.服务类别

 7.搜索服务

8.浏览服务 

 9.数据表示

 10.协议描述

10.服务属性定义

11.SERVICEDISCOVERYSERVER服务类属性定义

 12.BROWSEGROUPDESCRIPTOR服务类属性定义


 1. SDP(The Service Discovery protocol )作用      

 为应用程序提供了一种发现哪些服务可用并确定这些可用服务的方法。解决蓝牙环境的独特特性。

SDP提供了一种发现服务及其属性的机制(包括相关的服务访问协议),但它没有提供利用这些服务的机制(例如提供服务访问协议)。

 2.SDP客户端和服务器架构

SDP客户端-服务器交互

 服务发现机制为客户端应用程序提供了发现服务器应用程序提供的服务的存在以及这些服务的属性的手段。服务的属性包括所提供的服务的类型或类别,以及利用该服务所需的机制或协议信息。

   SDP服务器作用

维护由服务记录列表组成的SDP数据库描述与服务器关联的服务的特征的。每个服务记录包含有关单个服务的信息。客户端可以检索SDP服务器通过发出SDP请求。

 SDP客户端如何使用服务器

如果客户端或与客户端相关联的应用程序决定使用服务,则它将打开与服务提供商的单独连接,以利用该服务.

 多个应用程序提供服务如何处理?

如果一个设备上的多个应用程序提供服务,则SDP服务器可以代表这些服务提供者来处理有关他们所提供的服务信息的请求

 多个客户端应用程序如何处理?

 多个客户端应用程序可以利用一个SDP客户端代表该客户端应用程序查询服务器。

 潜在客户端如何访问可用服务器?

必须通过SDP以外的方式通知潜在客户端,以便客户端可以使用SDP查询服务器关于其服务。

服务器不可用时,客户端如何知道?

 当服务器保持接近或由于任何原因不可用时,就不会通过服务发现协议发出显式通知。但是,客户端可以使用SDP来轮询服务器,如果服务器不再响应请求,则可能会推断该服务器不可用。

 3.服务记录

 什么是服务?

服务是指可以代表另一个实体提供信息、执行操作或控制资源的任何实体。一种服务可以作为软件、硬件或硬件和软件的组合来实现。

 服务记录是记录的什么?

可服务的所有信息,服务器记录本质就是服务属性的列表。

 服务记录句柄

 一个32位的数字,它应唯一地标识SDP服务器内的每个服务记录。每个句柄只在每个SDP服务器中是唯一的。

服务记录句柄应在连续的L2CAP连接中保持有效,而服务数据库状态属性值应保持不变。

服务记录句柄应保持有效,直到相应的服务被永久删除或以不兼容的方式更改

 4.服务属性

 服务属性由两个组件组成:一个属性ID和一个属性值。

 Attribute ID

属性ID是一个16位的无符号整数,它可以区分每个服务属性和服务记录中的其他服务属性。属性ID还标识关联的属性值的语义。

 Attribute value

属性值是一个变量长度的字段,其含义由与之相关联的属性ID和包含该属性的服务记录的服务类决定。在服务发现协议中,一个属性值被表示为一个数据元素。通常,任何类型的数据元素都允许作为属性值,受服务类定义中指定的约束,为该属性分配一个属性ID,并为该属性值分配一个含义。

 5.服务类别

 服务类别定义

 提供了表示该类实例的服务记录中包含的所有属性的定义(每个属性定义都指定属性ID的数值、属性值的预期用途以及属性值的格式)

UUID

 每个服务类唯一的标识符,服务类标识符包含在服务器ClassIDList属性的属性值。

如果在产品的SDP数据库中暴露了服务类UUID,则包含SDP记录的产品应符合定义与UUID对应的服务的规范。

新服务类别 

当定义现有服务类的新服务类时,新服务类保留其超类中定义的所有属性。可以定义特定于新服务类的其他属性。换句话说,向现有服务类的某些实例添加新属性的机制是创建一个新的服务类,该服务类是现有服务类的子类。

 7.搜索服务

        服务搜索事务允许客户端根据这些服务记录中包含的属性的值来检索特定服务记录的服务记录句柄。一旦SDP客户端有了一个服务记录句柄,它就可以请求特定属性的值。

UUID(Universally Unique Identifiers)

可用于搜索服务的服务的重要属性被表示为uuid。

UUID是一个通用的唯一标识符,保证在不同的应用程序中是唯一的所有的空间和时间。

UUID是128位的值

蓝牙基础UUID

 Bluetooth_Base_UUID:00000000000000000-8000-00805F9B34FB

为什么我们看到了有16位和32位的UUID?

为了减少存储和传输128位UUID值的负担,已经预先分配了一系列UUID值,以分配给常用的、已注册的目的。

预先分配范围内的UUID值有用16位或32位值表示的别名。这些别名通常被称为16位和32位的uuid,但每个都实际上代表一个128位的UUID值。

128BIT uuid计算公式

 128_bit_value = 16_bit_value * 2^96 + Bluetooth_Base_UUID

128_bit_value = 32_bit_value * 2^ 96 + Bluetooth_Base_UUID

注意:可以直接比较两个16位UUid,比如两个32位UUid或两个128位UUid。如果要比较两个不同大小的uuid,则在进行比较前必须将较短的UUID转换为较长的UUID格式。 

 服务搜索模式

 用于定位匹配的服务记录的uuid的列表。

如果该服务搜索模式中的每个UUID都包含在该服务记录的任何属性值中,则该服务搜索模式将与该服务记录相匹配。

uuid不需要包含在任何特定属性中,或包含在服务记录中的任何特定顺序中。

如果服务所包含的UUId构成服务记录属性值中UUId的子集,则服务搜索模式匹配。

有效的服务搜索模式必须至少包含一个UUID。

8.浏览服务 

 什么是浏览服务?

客户端根据服务的某些期望特征(由UUID表示)搜索服务。但是,有时希望发现SDP服务器的服务记录描述了哪些类型的服务,而不需要任何关于这些服务的先验信息。这个寻找任何所提供的服务的过程

 客户端浏览SDP服务器的过程

1.它将创建一个包含表示根浏览组的UUID的服务搜索模式

2.通过将根浏览组的UUID在浏览组列表属性中作为一个值,所有可以在顶层浏览的服务都成为根浏览组的成员

 9.数据表示

SDP定义了一种简单的机制来描述属性ID、属性ID范围和属性值中包含的数据。所使用的原语构造是数据元素。

数据元素类型用5位类型描述符表示。类型描述符包含在数据元素头的第一个字节的最重要的(高阶)5位中。已经定义了以下类型。

 数据元素大小描述符

 数据元素大小描述符表示为3位大小索引,后面跟着0、8、16或32位。大小索引包含在数据元素头的第一个字节的最小重要的(行字器)3位中。大小索引的编码如下。

 数据元素示例

 

 10.协议描述

         SDP是一个简单的协议,对底层传输的要求最小。它可以通过可靠的数据包传输进行工作(甚至不可靠,如果客户端执行超时并在必要时重复请求)

        SDP使用一个请求/响应模型,其中每个事务由一个请求协议数据单元(PDU)和一个响应PDU组成。在SDP与蓝牙L2CAP传输协议一起使用的情况下,每次连接到给定SDP服务器的SDP瞬间不超过一个SDP请求PDU。换句话说,客户端应等待对其当前请求的响应,然后再发出对同一L2CAP连接的另一个请求。将SDP限制为发送一个未确认的请求PDU提供了一种简单的流控制形式。

传输字节顺序

服务发现协议应按标准网络字节顺序(大中位数)传输多字节字段,在不重要(低阶)字节之前传输更重要(高阶)字节。

 协议数据单元格式

 每个SDP PDU由一个PDU头和PDU特定的参数组成。标头包含三个字段:一个PDUID、一个事务处理ID和一个参数长度。这里描述了每个标题字段。参数可以包括延续状态参数,如下所述;每种PDU类型的PDU特定参数稍后将在单独的PDU描述中描述。

 PDU ID:

 TransactionID:

 ParameterLength:

部分响应与连续态 

当SDP请求超出单个响应PDU的响应时应该怎么做?

SDP服务器应生成部分响应和延续状态参数。继续状态参数可以由客户端在后续请求中提供,以检索完整响应的下一部分。延续状态参数是一个可变长度字段,其第一个字节包含字段中延续信息的附加字节数(info字长)

 客户端接收到部分响应和连续状态参数后的操作:

它可以重新发出原始请求(使用新的事务ID),并在新请求中包含继续状态,向服务器指示需要原始响应的剩余部分。“信息长度”字段的最大允许值为16(0x10)。

  错误处理

如果服务器确定请求的格式不正确,或由于任何原因,服务器无法使用适当的PDU类型进行响应,则应使用SDP_ERROR_RSP PDU进行响应 

SDP_ERROR_RSP PDU

 PDU parameters:

 服务搜索事务

 

 SDP_SERVICE_SEARCH_REQ PDU

 SDP客户端生成一个SDP_SERVICE_SEARCH_REQ,以定位与作为PDU的第一个参数给 出的服务搜索模式相匹配的服务记录。在收到此请求后,SDP服务器应检查其服务记录数据库,并返回包含其SDP数据库中匹配给定服务搜索模式的服务记录句柄或适当的错误响应的SDP_SERVICE_SEARCH_RSP。

PDU参数:

ServiceSearchPattern:

MaximumServiceRecordCount:

Continue status:

 SDP_SERVICE_SEARCH_RSP PDU

 SDP服务器在收到有效的SDP_SERVICE_SEARCH_REQ时生成一个SDP_SERVICE_SEARCH_RSP。

该响应包含与请求中给出的服务搜索模式相匹配的服务记录的服务记录句柄的列表。如果生成部分响应,则应只包含完整的服务记录句柄;服务记录句柄值不得在多个pdu之间进行分割.

PDU参数:

TotalServiceRecordCount:

CurrentServiceRecordCount:

ServiceRecordHandleList:

ServiceRecordHandleList:

服务属性事务

 SDP_SERVICE_ATTR_REQ PDU

 SDP客户端生成一个SDP_SERVICE_ATTR_REQ,以从特定的服务记录中检索指定的属性值。所需服务记录的服务记录句柄和要从该服务记录中检索到的所需属性id的列表作为参数提供。


SDP_SERVICE_ATTR_RSP PDU

 SDP服务器在收到有效的SDP_SERVICE_ATTR_REQ时生成一个SDP_SERVICE_ATTR_RSP。响应包含请求服务记录的属性列表(属性ID和属性值)。

服务指定的属性事务处理

 SDP_SERVICE_SEARCH_ATTR_REQ PDU

 SDP_SERVICE_SEARCH_ATTR_REQ事务将SDP_SERVICE_SEARCH_REQ和SDP_SERVICE_ATTR_-REQ的功能组合为单个请求。作为参数,它同时包含服务搜索模式和要从与服务搜索模式相匹配的服务记录中检索到的属性列表。SDP_SERVICE_SEARCH_ATTR_REQ及其响应更为复杂,可能比单独的SDP_-服务搜索和SDP_ServiceAttribute事务需要更多的字节。但是,使用SDP_-SERVICE_SEARCH_ATTR_REQ可以减少SDP事务的总数,特别是在检索多个服务记录时。

每个服务记录的服务记录句柄包含在该服务的服务记录句柄属性中,可以与其他属性一起被请求。


SDP_SERVICE_SEARCH_ATTR_RSP PDU

 SDP服务器在收到有效的SDP_SERVICE_SEARCH_ATTR_REQ时生成一个SDP_SERVICE_SEARCH_ATTR_RSP。响应包含与请求的服务搜索模式匹配的服务记录中的属性列表(包括属性ID和属性值)。

10.服务属性定义

什么是通用属性定义?

通用属性是那些定义与所有服务记录通用的服务属性。这并不意味着每个服务记录都包含所有这些服务属性的值。但是,如果服务记录具有属性标识为通用属性的通用属性,则该属性值应符合通用属性的定义。

在每个服务记录实例中只需要存在两个属性。它们是服务器记录句柄(属性ID0x0000)和服务ClassIDList(属性ID0x0001)。服务记录中的所有其他服务属性都是可选的。

ServiceRecordHandle属性

 

 服务记录句柄是一个唯一标识SDP服务器内的32位服务记录。一般来说,每个句柄只在每个SDP服务器中是唯一的。如果SDP服务器S1和SDP服务器S2都包含相同的服务记录(代表相同的服务),则用于引用这些相同的服务记录的服务记录句柄是完全独立的。一般来说,用于引用S1上的服务的句柄如果呈现给S2将毫无意义。保留服务记录处理柄值0x000000001-0x0000FFFF以供将来使用。

 ServiceClassIDList属性

 

 服务ClassIDList属性由一个数据元素序列组成,其中每个数据元素都是一个表示给定服务记录所符合的服务类的UUID。除非定义服务类的配置文件规范另有规定,否则应该从最特定的类到最一般的类列出。当配置文件被增强时,应该在服务ClassID列表的末尾(在任何现有的UUID之后)添加任何新的UUID,以尽量减少与遗留实现的互操作性问题。服务类标识列表应至少包含一个服务类UUID。

ServiceRecordState 属性

 服务记录状态是一个32位的整数,用于方便缓存服务属性。如果该属性包含在服务记录中,则在服务记录中添加、删除或更改任何其他属性值时,应更改其值。这允许客户端检查此单个属性的值。如果自上次检查以来其值没有更改,则客户端知道服务记录中的其他属性值没有更改。

 ServiceID属性

 服务标识是一个UUIDID,它普遍且唯一地标识服务记录所描述的服务实例。如果由多个SDP服务器中的服务记录描述了相同的服务,则此服务属性特别有用。

ProtocolDescriptorList属性

 “协议描述符列表”属性描述了可用于访问服务记录所描述的服务的一个或多个协议堆栈。

如果协议描述符列表描述了单个堆栈,则它采用了数据元素序列的形式,其中序列中的每个元素都是一个协议描述符。每个协议描述符依次是一个数据元素序列,其第一个元素是标识协议的UUID,其连续元素是特定于协议的参数。潜在的特定于协议的参数是协议版本号和连接端口号。协议描述符按从最底层协议到用于访问该服务的最高层协议的顺序列出。

如果可以使用一种以上的协议堆栈来访问该服务,则协议描述符列表采用数据元素替代方案的形式,其中每个成员都是如前一段所述的数据元素序列。

 协议描述符

协议描述符标识通信协议并提供协议的参数。协议描述符用数据元素序列表示。序列中的第一个数据元素应是标识协议的UUID。附加的数据元件可选地提供特定于协议的信息,例如L2CAP协议/服务多路复用器(PSM)和RFCOMM服务器信道号(CN)。

AdditionalProtocolDescriptorList属性

 附加协议描述符列表属性包含协议描述符列表元素序列。每个元素都具有与第5.1.5节中描述的协议描述器列表相同的格式。元素的顺序很重要,应该在使用此属性的配置文件中指定和修复。

 BrowseGroupList属性

 浏览组列表属性由一个数据元素序列组成,其中每个元素都是一个UUID,它表示服务记录所属的浏览组。顶级浏览组ID称为PuricBrowseRoot,表示浏览层次结构的根,来自分配数字的值为00001002-0000-1000-8000-00805F9B34FB(UUID16:0x1002)。

 LanguageBaseAttributeIDList属性 

 ServiceInfoTimeToLive属性

 ServiceTimeToLive属性是一个32位整数,包含服务记录中的信息预计保留的秒数有效且不变。此时间间隔从从SDP服务器检索属性值。此值并不意味着保证服务记录保持可用或不变。它是这只是一个提示,客户端可以使用它来确定适当的轮询间隔,以重新验证服务记录内容。

 ServiceAvailability属性

 服务可用性属性是一个8位无符号整数,它表示服务接受其他客户端的相对能力。值为0xFF表示该服务当前未在使用中,因此已完全可用,而值为0x00表示该服务不接受新客户端。对于支持多个同时使用的客户端的服务,中间值表示在线性规模上的服务的相对可用性。

例如,当0、1、2和3个客户端使用该服务时,可以接受多达3个客户端的服务应该分别提供0xFF、0xAA、0x55和0x00的服务可用性值。值0xAA约为(2/3)*0xFF,表示2/3的可用性,而值0x55约为(1/3)*0xFF,并表示1/3的可用性。可用性值近似为

( 1 - ( current_number_of_clients / maximum_number_of_clients ) ) * 0xFF
当最大客户端数量较大时,必须修改此公式,以确保0x00和0xFF的服务可用性值分别保留为其定义的不可用性和完全可用性含义。
注意:服务可以支持的最大客户端数量可能会根据服务的当前客户端所使用的资源而有所不同。
服务可用性的非零值并不能保证该服务将可供使用。它应被视为可用性状态的提示或近似值。

BluetoothProfileDescriptorList属性 

 BluetoothProfileDescriptorList属性由一个数据元素序列组成,其中每个元素都是一个配置文件描述符,其中包含关于此服务记录所表示的服务符合的蓝牙配置文件的信息。每个配置文件描述符都是一个数据元素序列,其第一个元素是分配给该配置文件的UUID,其第二个元素是一个16位的配置文件版本号。

配置文件的每个版本都被分配了一个16位无符号整数配置文件版本号,该版本号由两个8位字段组成。高阶8位包含主要版本号字段,低阶8位包含次要版本号字段。每个配置文件的初始版本都有一个主要版本为1,另一个次要版本为0。当对配置文件进行向上兼容的更改时,次要版本号将会增加。如果对配置文件进行了不兼容的更改,主要版本号。

 DocumentationURL属性

 此属性是一个指向服务记录所描述的服务上的文档的URL。

 ClientExecutableURL属性

 此属性包含一个URL,该应用程序引用了可用于利用服务记录所描述的服务的应用程序的位置。由于不同的操作环境需要不同的可执行格式,因此已经定义了一种机制,允许此单个属性用于定位适合于客户端设备的操作环境的可执行文件。在属性值URL中,第一个值为0x2A(ASCII字符“*”)的字节将用字符串表示所需操作环境的字符串替换。

表示操作环境的标准化字符串的列表包含在“已分配的数字”中。

例如,假定客户端执行表URL属性的值为http://my.fake/public/*/client.exe。在能够执行SH3WindowsCE文件的设备上,此URL将被更改为http://my.fake/public/sh3-microsoft-wince/client.exe。在能够执行Windows98二进制文件的设备上,此URL将被更改为http://my.fake/public/i86-microsoftwin98/client.exe.

 IconURL属性

 此属性包含一个URL,该图标引用了可用于表示服务记录所描述的服务的图标的位置。由于不同的硬件设备需要不同的图标格式,因此已经定义了一种机制,允许使用此单一属性来定位适合于客户端设备的图标。在属性值URL中,第一个值为0x2A(ASCII字符“*”)的字节将被一个表示所需图符格式的字符串替换

表示图标格式的标准化字符串列表包含在“已分配的数字”中。

例如,假设IconURL属性的值为http://my.fake/公共/图标/*。在一个更喜欢使用256种颜色的24x24个图标的设备上,这个URL将被更改为http://my.fake/public/icons/24x24x8.png。在一个更喜欢10x10个单色图标的设备上,这个URL将被更改为http://my.fake/public/icons/10x10x1.png。

 ServiceName 属性

服务名称属性是一个包含由服务记录所代表的服务名称的字符串。它应该简短,适合显示有代表服务的图标。偏移量0x0000被添加到属性ID基础(包含在语言基础属性ID列表属性中),以计算该属性的属性ID。

 ServiceDescription属性

 此属性是一个包含对该服务的简要描述的字符串。其长度应小于200个字符。该偏移量0x0001被添加到属性ID基础(包含在语言基础属性ID列表属性中),以计算该属性的属性ID。

 ProviderName属性

 此属性是一个包含提供该服务的人员或组织的名称的字符串。该偏移量0x0002被添加到属性ID基础(包含在语言基础属性ID列表属性中),以计算该属性的属性ID。

保留通用属性ID

 保留0x000E到0x0x00FF范围内的属性id供将来使用。

11.SERVICEDISCOVERYSERVER服务类属性定义

 ServiceRecordHandle属性

在服务记录句柄的通用属性定义中描述。

值为0x00000000的32位整数

 ServiceClassID列表属性

 一种表示服务发现服务器服务类ID的UUID。

 VersionNumberList属性

 版本数字列表是一个数据元素序列,其中序列中的每个元素都是一个由SDP服务器支持的版本号。

版本号是一个由两个字段组成的16位无符号整数。高阶8位包含主要版本号字段,低阶8位包含次要版本号字段。SDP的初始版本的主要版本为1,次要版本为0。当对协议进行向上兼容的更改时,次要版本号将会增加。如果对SDP进行了不兼容的更改,则将增加主要版本号。这保证了如果客户端和服务器支持一个通用的主要版本号,那么如果每个版本号只使用一个客户端和服务器都支持的次要版本号的规范特性,它们就可以进行通信。

 ServiceDatabaseState属性

 服务数据库状态是一个32位的整数,用于方便服务记录的缓存。如果存在此属性,则当将任何其他服务记录添加或删除到服务器的SDP数据库时,应更改其值。如果自上次客户端查询其值以来,该值没有更改,则客户端知道a)没有添加或删除SDP服务器维护的其他服务记录;b)从服务器获取的任何服务记录句柄仍然有效。在使用在之前的连接期间获得的任何服务记录句柄之前,在建立到服务器的连接时,客户端应查询此属性的值。

当修改现有的服务记录时,包括服务属性的添加、删除或修改时,服务数据库状态属性不会更改。服务记录的服务记录状态属性指示修改该服务记录的时间。

保留属性id 

保留在0x0202到0x02FF范围内的属性id以供将来使用。

 12.BROWSEGROUPDESCRIPTOR服务类属性定义

         此服务类描述了为蓝牙设备上提供的每个浏览组描述符服务提供的服务记录。本节中列出的属性只有在服务CrassIDList属性包含BrowseGroupDescriptorServiceClassID.时才有效注意:所有的通用属性都可以包含在浏览组描述器类的服务记录中。

注意:所有的通用属性都可以包含在浏览组描述器类的服务记录中。

ServiceClassIDList属性 

在服务类id列表的通用属性定义中描述。

表示BrowseGroupDescriptorServiceClassID的UUID。

 GroupID属性

 此属性包含一个UUID,可用于定位此服务记录所描述的浏览组成员的服务。

文章来源: xintiaobao.blog.csdn.net,作者:心跳包,版权归原作者所有,如需转载,请联系作者。

原文链接:xintiaobao.blog.csdn.net/article/details/120267117

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。