蓝牙学习笔记之SDP协议(四)

目录

SDP协议简述

SDP简介

服务记录

服务属性

协议数据单元陈述

协议描述

一次完整的客户端访问举例

SDP协议数据分析


SDP协议简述

SDP简介

服务发现协议为应用程序提供了发现服务以及确定哪些服务属性是可以利用的能力。

其client-server架构如下图:

蓝牙学习笔记之SDP协议(四)_第1张图片

由上图可以看出,客户端访问服务器遵循请求-回复原则,即client向server请求服务及属性列表,server予以回复,且请求和回复一一对应。

SDP协议的重点与难点,在于理解服务、服务记录和属性的概念。为了辅助理解,可以用数据库做类比,服务为某个数据库(如MySQL),服务记录则是某类的数据,属性这是这类数据中具体的数据表格。SDP协议的作用则是发现对端所有的服务,以及该服务提供了哪些功能。

  • 服务记录

一个服务可能是任何能为另一个实体提供信息,采取行动或控制资源的实体。

SDP服务器维护的所有的服务信息都是包含在一个单一的服务记录中。这个服务记录可以是一个服务属性的列表,如下图所示:

蓝牙学习笔记之SDP协议(四)_第2张图片

其中record handle(记录句柄)由一个32bits的无符号整形代表,在一个服务器中该句柄是唯一的。SDP不提供通知客户端服务器的服务有改变的机制,客户端只能通过句柄是否有效的来判断服务是否移除了。

  • 服务属性

服务属性由两部分组成,attribute ID和attribute value组成。Attribute ID是一个16bits的无符号整形,attribute value是根据attribute ID的数据序列。其结构如下图所示:

蓝牙学习笔记之SDP协议(四)_第3张图片

 

协议数据单元陈述

sdp协议数据包是数据单元的集合,一个数据包中可能包含一个或多个数据单元。每个数据包的头部都是一个type descriptor(类型描述符),占一个字节,由两部分组成:type descriptor(high 5-bits) 和size descriptor(low 3-bits)。

1)、type descriptor描述如下:

蓝牙学习笔记之SDP协议(四)_第4张图片

2)、size descriptor描述如下:

蓝牙学习笔记之SDP协议(四)_第5张图片

实际运用可以参考如下的例子:

蓝牙学习笔记之SDP协议(四)_第6张图片

 

协议描述

SDP协议的数据使用网络字节序,即大端字节序,与底层HCI、L2cap协议有所区别,需要特别注意!

其协议头部由三部分组成:PDU ID、Transaction ID和Parameter Length组成,Parameter则是上一章所述的一个个数据单元。其具体的描述如下:

蓝牙学习笔记之SDP协议(四)_第7张图片

其中PDU表示协议包的类型,类型种类如下图所示:

蓝牙学习笔记之SDP协议(四)_第8张图片

一次完整的客户端访问举例

这里我们对ServiceSearch的request和response做简要说明,其他有兴趣的可以自行参考核心规范。

ServiceSearch Transaction一次服务发现交互事务逻辑如下图所示:

蓝牙学习笔记之SDP协议(四)_第9张图片

 

1)、SDP_ServiceSearchRequest PDU

首先由client发起请求Service Search Request,描述如下:

蓝牙学习笔记之SDP协议(四)_第10张图片

其参数中ServiceSearchPattern是一系列的data element,MaximumService- RecordCount是一个16bits的整形数,ContinuationState 是一个8bits的整形数。

2)、SDP_ServiceSearchResponse PDU

当服务器收到请求之后,给出对应的Service Search Reponse描述如下:

蓝牙学习笔记之SDP协议(四)_第11张图片

其参数中TotalServiceRecordCount和CurrentServiceRecordCount占两个字节,ServiceRecordHandleList是一系列的data element,ContinuationState占一个字节。

SDP协议数据分析

下面我们将对sdp完整的一次通讯过程进行数据分析。

以下蓝色为hci部分、绿色为l2cap部分、红色为sdp协议部分,这里我只针对sdp进行解析,想看其他协议的数据分析,可以去看我相关的学习笔记。

1)、Master,请求Pnp information服务的属性列表

00000010 00000011 00100000 00011000 00000000 00010100 00000000 01000000 00000000 00000110 00000000 00000000 00000000 00001111 00110101 00000011 00011001 00010010 00000000 00000010 10010000 00110101 00000101 00001010 00000000 00000000 11111111 11111111 00000000

PDU ID:00000110SDP_ServiceSearchAttributeRequest

Transaction ID:00000000 000000000x0000,本次交互的id

Parameter Length:00000000 000011110x000f,数据长度为15

Data element header:00110101type=0x06Data element sequencesize index=0x05,有一个额外的字节描述后续字节长度)

Additional size:000000110x03,后续3个字节)

Data element header:00011001 type=0x03UUIDsize index=0x01UUID长度为2个字节)

UUID:00010010 000000000x1200PnP Information

Max Amount of Attribute Data to Return: 00000010 100100000x0290=656

Data element header:00110101type=0x06Data element sequencesize index=0x05,有一个额外的字节描述后续字节长度)

Additional size:00000101 0x05,后续5个字节)

Data element header:00001010 type=0x02,以补码表示的有符号数;size index=0x02,四个字节)

Attribute Range: 00000000 00000000 11111111 111111110x0000-0xffffattribute的范围为0-65535

Bytes for continuation length:000000000x00,后续没有数据了)

2)、Slave,返回Pnp information服务的属性列表

00000010 00000011 00100000 00001110 00000000 00001010 00000000 01000000 00000000 00000111 00000000 00000000 00000000 00000101 00000000 00000010 00110101 00000000 00000000

PDU ID00000111SDP_ServiceSearchAttributeResponse

Transaction ID:00000000 000000000x0000,本次交互的id

Parameter Length:00000000 000001010x0005,数据长度为5

Attribute List Byte Count:00000000 000000100x0002,属性列表字节数为2

Data element header:00110101type=0x06Data element sequencesize index=0x05,有一个额外的字节描述后续字节长度)

Additional size:000000000x00,后续无数据)

Bytes for continuation length000000000x00,后续没有数据了)

3)、Master,请求L2cap服务的属性列表

00000010 00000011 00100000 00011000 00000000 00010100 00000000 01000001 00000000 00000110 00000000 00000000 00000000 00001111 00110101 00000011 00011001 00000001 00000000 00000010 10010000 00110101 00000101 00001010 00000000 00000000 11111111 11111111 00000000

PDU ID:00000110SDP_ServiceSearchAttributeRequest

Transaction ID:00000000 000000000x0000,本次交互的id

Parameter Length:00000000 000011110x000f,数据长度为15

Data element header:00110101type=0x06Data element sequencesize index=0x05,有一个额外的字节描述后续字节长度)

Additional size:000000110x03,后续3个字节)

Data element header:00011001 type=0x03UUIDsize index=0x01UUID长度为2个字节)

UUID:00000001 000000000x0100L2CAP

Max Amount of Attribute Data to Return: 00000010 100100000x0290=656

Data element header:00110101type=0x06Data element sequencesize index=0x05,有一个额外的字节描述后续字节长度)

Additional size:00000101 0x05,后续5个字节)

Data element header:00001010type=0x02,以补码表示的有符号数;size index=0x02,四个字节)

Attribute Range: 00000000 00000000 11111111 111111110x0000-0xffffattribute的范围为0-65535

Bytes for continuation length:000000000x00,后续没有数据了)

 

上面我只举了四个协议交互例子进行分析,具体的协议的log以及数据分析,以及相关资料,请到我的博客<蓝牙学习笔记(序)>最下面的网盘链接中下载!

 

你可能感兴趣的:(蓝牙协议栈)