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

1. 概念

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

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

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

在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)

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

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

属性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的类型描述符用来表示,它包含在首部字段第一个字节的高五位。 
下面是已经定义的类型

7.2 大小描述符

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

7.3 数据单元实例

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

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

8.2 Partial Responses And Continuation State

8.3 错误处理

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

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

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整个过程>

Bluetooth SDP介绍的更多相关文章

  1. Bluetooth GATT介绍

    目录 1. 介绍 2 内容 2.1 Configured Broadcast 2.2 GATT Profile Hierarchy 3 Service Interoperability Require ...

  2. Bluetooth ATT介绍

    目录 1 介绍 2 详细内容 2.1 Attribute Type 2.2 Attribute Handle 2.3 Attribute Handle Grouping 2.4 Attribute V ...

  3. Bluetooth GAP介绍

    目录 1 GAP协议栈 2 Profile Role 3 用户接口 4 模式 5 安全 5.1 认证(Authentication) 5.2 安全模式 6 Idle Mode Procedures 7 ...

  4. Bluetooth LMP介绍

    目录 1. 介绍 2. 数据包格式(Packet Format) 3. Procedure Rules 4. 通用回应消息(General Response Messages) 5. 设备特性(Dev ...

  5. Bluetooth Baseband介绍

    目录 1. 概述 1.1 Clock(时钟) 1.2 寻址方式 2. 物理信道(Physical Channels) 3. 物理链路(Physical Links) 4. 逻辑传输层(Logical ...

  6. Bluetooth HFP介绍

    目录 1. 介绍 1.1 目的 1.2 使用场景 1.3 依赖关系 1.4 协议栈 1.5 角色 2. 应用层 3. 空白章节 4. 互操作性要求 4.1 介绍 4.2 Service Level C ...

  7. Bluetooth RFCOMM介绍

    目录 1. 介绍 2. 服务概述 2.1 RS-232控制信号 2.2 Null Modem Emulation 2.3 多串口仿真 3. 服务接口描述 4. RFCOMM帧类型 5. RFCOMM帧 ...

  8. Bluetooth HCI介绍

    目录 1. HCI功能 2. HCI Packet 1. HCI Command 2. HCI Event 3. HCI Data 3. HCI传输层 HCI, 主机控制接口(Host Control ...

  9. Bluetooth L2CAP介绍

    目录 1. 通用操作 1. L2CAP Channel 2. 设备间操作 3. 层间操作 4. 操作模式 2. 数据包格式(Data Packet Format) 1. B-Frame 2. G-Fr ...

随机推荐

  1. JVM的回收实现

    通过一系列的称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用 ...

  2. Xamarin.iOS调试提示需要iOS SDK

    Xamarin.iOS调试提示需要iOS SDK   错误信息:The version of Xamarin.iOS requires th iOS 9.3 SDK (shipped with Xco ...

  3. 空函数有参函数调用参数的注意事项Swift 1.1语言

    空函数有参函数调用参数的注意事项Swift 1.1语言 7.2.3  空函数 空函数有参函数调用参数的注意事项Swift 1.1语言空函数是函数中最简单的形式.在空函数中,函数只有一个空壳,里面是没有 ...

  4. 移动开单软件 手持PDA开单扫描打印系统开发介绍

    具体功能预览--(图示) PDA开单打印扫描采集器主程序: ▲门店使用:接单员销售开单.销售退货或查询相关资料. ▲仓库使用:PDA仓库验收货.发货.仓库盘点 ▲在外业务开单:业务在外面开销售单.销售 ...

  5. POJ3177 Redundant Paths(边双连通分量+缩点)

    题目大概是给一个无向连通图,问最少加几条边,使图的任意两点都至少有两条边不重复路径. 如果一个图是边双连通图,即不存在割边,那么任何两个点都满足至少有两条边不重复路径,因为假设有重复边那这条边一定就是 ...

  6. WPF之DataContext

    1. 继承属性: DataContext is a property on FrameworkElement (base class for all WPF Controls) and is impl ...

  7. extjs tips

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  8. sprintf() in c

    Declaration Following is the declaration for sprintf() function. int sprintf(char *str, const char * ...

  9. Android下载文件到SD卡

    HttpURLConnection 上传方式: 尝试理解这两种流的区别: InputStreamReader 的读取方式: //创建一个URL对象 URL url = new URL(urlStrin ...

  10. winform学习之----打开文件对话框并将文件内容放入文本框

    OpenFileDialog ofg = new OpenFileDialog(); ofg.Title = "ddd";//设置对话框标题 ofg.Multiselect = t ...