Bluetooth SDP介绍

时间:2023-03-09 09:04:50
Bluetooth SDP介绍

SDP, Service Discovery Protocol,服务发现协议

1. 概念

SDP提供了一种用于发现服务及这些可用服务属性的方法,但它不提供利用这些服务的机制。

其架构是Client-Server模式,如下图所示

Bluetooth SDP介绍

SDP Server维护了一个服务记录(Service Record)列表,每个条目包含了该服务的信息。 
SDP Client通过SDP request来向SDP Server获取服务记录信息

Client可以通过打开一条单独的连接来使用Server提供的某种服务

当Server的服务改变时,Client必须通过其他方式来了解这一信息,以便能够通过SDP来查询 
同时,当Server由于某种原因不可用时,Client可以使用SDP轮询Server 
当Server不再相应请求时,Client可以推断该Server不可用。

2. 服务记录(Service Record)

每一个Service用Service Record来表示 
每一个Service Record由若干Service Attribute组成,如下图所示

Bluetooth SDP介绍

在SDP Server中,用Service Record Handle来唯一标识一个Service Record 
而Service Record Handle则使用32-bit数字表示

ServiceRecordState and ServiceDatabaseState attributes

在Service Record List中,Server使用0x00000000来表示SDP本身

3. 服务属性(Service Attribute)

每个服务属性描述了一个服务的单个特征,实例如下

Bluetooth SDP介绍

一个服务属性包含了两个部分: 属性ID和属性值

Bluetooth SDP介绍

属性ID是16-bit无符号整型,用以区分Server中不同属性,属性ID还确定了相关的属性值的语义

属性值字段长度是可变的,由关联属性ID和服务记录类别决定

4. 服务类(Service Class)

每个服务是一个服务类的实例 
服务类定义了包含在该类服务记录的所有属性 
每个属性定义了指定的属性ID,及使用的属性值和属性值得格式 
服务记录包含了特定服务类及通用服务类的属性

每个服务类被分配了唯一的标识符 
这个服务类标识符包含了ServiceClassIDList属性的属性值,被称为UUID

5. 服务查找

服务查找允许Client基于包含服务记录的属性值,来获取特定服务记录的服务记录句柄(Service Record Handle)

当一个SDP Client有某个服务记录句柄时,它可以请求特定的属性值

SDP不提供基于任意属性值的服务记录查找,只提供基于UUID的查找 
可用于搜索服务的重要属性被表示为的UUID

5.1 UUID

UUID是一个128位的值,蓝牙Base UUID值为0x00000000-0000-1000-8000-00805F9B34FB 
其他已定义的UUID可参考<UUID>

为了简化实用,我们实用16-bit和32bit UUID来代表真实的UUID,

5.2 服务搜索模式(Service Search Patterns)

服务搜索模式使用UUID列表来定位匹配的服务记录

6. 服务浏览

SDP提供了基于服务类共享属性机制来浏览服务,这个属性被称为BrowseGroupList

Client通过创建一个包含代表根浏览组的UUID的服务搜索模式来浏览Server的服务

7. 数据表示

SDP的使用数据单元(Data Element)来表示数据(属性ID,属性ID范围,属性值)

数据单元是一种类型化的数据表示,它由两个字段组成:首部字段(Header Field)和数据字段(Data Field)

首部字段包含两个部分: 类型描述符(Type Descriptor)和大小描述符(Size Descriptor) 
数据字段是一个字节序列,其长度由大小描述符指定,其含义则由类型描述符指定

7.1 类型描述符

数据单元的类型使用5-bit的类型描述符用来表示,它包含在首部字段第一个字节的高五位。 
下面是已经定义的类型

Bluetooth SDP介绍

7.2 大小描述符

数据单元的大小描述符包含在首部字段第一个字节的低三位 
它表示为的大小指数,其后为0/8/16/32bits 
大小指数的编码如下

Bluetooth SDP介绍

7.3 数据单元实例

Bluetooth SDP介绍

8. 协议说明

SDP使用Request/Response模型 
其中每个事务(Transaction)包含一个请求协议数据单元(PDU)和一个响应PDU

SDP使用L2CAP作为传输协议,在建立连接并发出SDP Request后 
在给定的时间内,只有收到该Request的Response后,才能发出其他的Request

传输采用Big-Endian,高位先低位后的方式

8.1 PDU格式

SDP PDU包含一个Header和Parameters

Header包含三个字段: PDU ID, Transaction ID, ParameterLength

Bluetooth SDP介绍

其中,Header三个字段的含义分别如下

Bluetooth SDP介绍

8.2 Partial Responses And Continuation State

Bluetooth SDP介绍

8.3 错误处理

当一个Server认为Client的Request格式不正确或其他原因导致没有合适的Response时 
应该回应一个SDP_ErrorResponse PDU(PDU ID=0x01)

同时,其Parameters为ErrorCode,ErrorCode详细信息如下

Bluetooth SDP介绍

8.4 服务查找事务

ServiceSearch Transaction

8.4.1  SDP_ServiceSearchRequest PDU

SDP_ServiceSearchRequest PDU(PDU ID=0x02)的Parameters包括 
ServiceSearchPattern, MaximumServiceRecordCount, ContinuationState

ServiceSearchPattern(Size: Varies):

Value Parametr Description
Data Element Sequence ServiceSearchPattern是一个数据单元序列,每个单元是一个UUID,单元数为1~12

MaximumServiceRecordCount(Size: 2 Bytes):

Value Parametr Description
N MaximumServiceRecordCount是一个16-bit数,指定可返回的了最大的服务记录句柄,取值范围: 0x0001~0xFFFF

ContinuationState(Size: 1~17 Bytes):

Value Parametr Description
Continuation State ContinuationState是一个8-bit数N,随后的N Bytes是Continuation State信息,N的范围为0~16,0表示没有Continuation State

8.4.2  SDP_ServiceSearchResponse PDU

SDP_ServiceSearchResponse PDU(PDU ID=0x03)的Parameters包括 
TotalServiceRecordCount, CurrentServiceRecordCount, ServiceRecordHandleList, ContinuationState

8.5 服务属性事务

ServiceAttribute Transaction

8.6 服务属性查找事务

ServiceSearchAttribute Transaction

TIP: 8.4.2, 8.5及8.6均为详细定义,此处不累述,详情见规范

9. 服务属性定义

9.1 Universal Attribute Definition

9.2 ServiceDiscoveryServer Service Class Attribute Definitions

9.3 BrowseGroupDescriptor Service Class Attribute Definitions

TIP: 9主要描述了属性ID,属性值类型及属性相关说明,详情见规范

关于SDP,更多内容,可参考如下文章 
<蓝牙的SDP协议总结
<SDP协议译稿(Part 1)
<FTS抓包看蓝牙的SDP整个过程>