服务器发现协议为应用程序提供了发现服务以及确定哪些服务属性是可以利用的能力。
其client-server架构如下图:
由上图可以看出,客户端访问服务器遵循请求-回复原则,即client向server请求服务及属性列表,server予以回复,且请求和回复一一对应。
SDP协议的重点与难点,在于理解服务、服务记录和属性的概念。为了辅助理解,可以用数据库做类比,服务为某个数据库(如MySQL),服务记录则是某类的数据,属性这是这类数据中具体的数据表格。SDP协议的作用则是发现对端所有的服务,以及该服务提供了哪些功能。
一个服务可能是任何能为另一个实体提供信息,采取行动或控制资源的实体。
SDP服务器维护的所有的服务信息都是包含在一个单一的服务记录中。这个服务记录可以是一个服务属性的列表,如下图所示:
其中record handle(记录句柄)由一个32bits的无符号整形代表,在一个服务器中该句柄是唯一的。SDP不提供通知客户端服务器的服务有改变的机制,客户端只能通过句柄是否有效的来判断服务是否移除了。
服务属性由两部分组成,attribute ID和attribute value组成。Attribute ID是一个16bits的无符号整形,attribute value是根据attribute ID的数据序列。其结构如下图所示:
sdp协议数据包是数据单元的集合,一个数据包中可能包含一个或多个数据单元。每个数据包的头部都是一个type descriptor(类型描述符),占一个字节,由两部分组成:type descriptor(high 5-bits) 和size descriptor(low 3-bits)。
1)、type descriptor描述如下:
2)、size descriptor描述如下:
实际运用可以参考如下的例子:
协议描述
SDP协议的数据使用网络字节序,即大端字节序,与底层HCI、L2cap协议有所区别,需要特别注意!
其协议头部由三部分组成:PDU ID、Transaction ID和Parameter Length组成,Parameter则是上一章所述的一个个数据单元。其具体的描述如下:
其中PDU表示协议包的类型,类型种类如下图所示:
这里我们对ServiceSearch的request和response做简要说明,其他有兴趣的可以自行参考核心规范。
ServiceSearch Transaction一次服务发现交互事务逻辑如下图所示:
1)、SDP_ServiceSearchRequest PDU
首先由client发起请求Service Search Request,描述如下:
2)、SDP_ServiceSearchResponse PDU
当服务器收到请求之后,给出对应的Service Search Reponse描述如下:
其参数中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:00000110(SDP_ServiceSearchAttributeRequest)
Transaction ID:00000000 00000000(0x0000,本次交互的id)
Parameter Length:00000000 00001111(0x000f,数据长度为15)
Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一个额外的字节描述后续字节长度)
Additional size:00000011(0x03,后续3个字节)
Data element header:00011001 (type=0x03,UUID;size index=0x01,UUID长度为2个字节)
UUID:00010010 00000000(0x1200,PnP Information)
Max Amount of Attribute Data to Return: 00000010 10010000(0x0290=656)
Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一个额外的字节描述后续字节长度)
Additional size:00000101 (0x05,后续5个字节)
Data element header:00001010 (type=0x02,以补码表示的有符号数;size index=0x02,四个字节)
Attribute Range: 00000000 00000000 11111111 11111111(0x0000-0xffff,attribute的范围为0-65535)
Bytes for continuation length:00000000(0x00,后续没有数据了)
2)、Slave,返回Pnp information服务的属性列表
00000010 00000011 00100000 00001110 00000000 00001010 00000000 01000000 00000000 00000111 00000000 00000000 00000000 00000101 00000000 00000010 00110101 00000000 00000000
PDU ID:00000111(SDP_ServiceSearchAttributeResponse)
Transaction ID:00000000 00000000(0x0000,本次交互的id)
Parameter Length:00000000 00000101(0x0005,数据长度为5)
Attribute List Byte Count:00000000 00000010(0x0002,属性列表字节数为2)
Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一个额外的字节描述后续字节长度)
Additional size:00000000(0x00,后续无数据)
Bytes for continuation length:00000000(0x00,后续没有数据了)
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:00000110(SDP_ServiceSearchAttributeRequest)
Transaction ID:00000000 00000000(0x0000,本次交互的id)
Parameter Length:00000000 00001111(0x000f,数据长度为15)
Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一个额外的字节描述后续字节长度)
Additional size:00000011(0x03,后续3个字节)
Data element header:00011001 (type=0x03,UUID;size index=0x01,UUID长度为2个字节)
UUID:00000001 00000000(0x0100,L2CAP)
Max Amount of Attribute Data to Return: 00000010 10010000(0x0290=656)
Data element header:00110101(type=0x06,Data element sequence;size index=0x05,有一个额外的字节描述后续字节长度)
Additional size:00000101 (0x05,后续5个字节)
Data element header:00001010(type=0x02,以补码表示的有符号数;size index=0x02,四个字节)
Attribute Range: 00000000 00000000 11111111 11111111(0x0000-0xffff,attribute的范围为0-65535)
Bytes for continuation length:00000000(0x00,后续没有数据了)