蓝牙SDP协议概述
服务发现协议(SDP)
整个 SDP 是基于 C/S 架构,如下图:
总结起来,整个服务器应该包含如下结构(0 条或者多条记录):
服务类定义了这个服务记录中包含的属性;包括属性的id以及属性值的用法和格式
每个服务类都有个UUID
例如:
数据表示方法
SDP 定义了一种简单的机制来描述包含在属性 ID、属性 ID 范围和属性值中的数据,采用数据元(data element)表示,下面我们来看下数据元格式数据元包括两个部分:1)数据头(header field) 2)数据值(data field)
其中数据头又包括两个部分:1)数据类型描述符(type descriptor) 2)数据长度描述符(size descriptor)。
数据类型描述符占5位,含义如下:
数据长度描述符占3位:
协议说明
SDP 是大端数据模式
Transaction ID:传输消息的 ID,request 放可以在 0x0000~0xffff 之间取任意值,但是 response要跟 request 一致,根据 TID 来区分是回应哪个 request
特殊参数说明:CONTINUATION STATE
它用于一次 response 不够把所有的 Data 传回去的情况。这时候需要将 response 分多次传输,
如果一次 response 足够了,Continuation State 为 1 个字节=0。
如果要分多次 response,需要重新 request,采用新的 transaction ID 和上一次 resposne 的
Continuation State,用以下流程说明。
情况一:不需要 Continuation State
A—>B 发送 SDP request,transaction ID 为 C
B—>A 发送 SDP respose,transaction ID 为 C。假设一次 resposne 可以返回所有数据,则
Continuation State 为 1 个字节=0。
情况二:需要 Continuation State
A—>B 发送 SDP request,transaction ID 为 C
B—>A 发送 SDP respose,transaction ID 为 C。假设一次 resposne 不够返回所有数据,这时
response 携带 Continuation State M
A—>B 发送 SDP request,transaction ID 为 D(必须与 C 不同),携带 Continuation State M
B—>A 发送 SDP respose,transaction ID 为 D。假设这次 resposne 还不够返回所有数据,这
时 response 携带 Continuation State N
A—>B 发送 SDP request,transaction ID 为 E,携带 Continuation State N
B—>A 发送 SDP respose,transaction ID 为 E。假设一次 resposne 返回的是最后的一部分数
据,则 Continuation State 为 1 个字节=0。
整个 request-response 的流程结束。
SERVICE SEARCH TRANSACTION
REQ:
ServiceSearchPattern:一般就是需要一个数据元代表 UUID,最多一次携带12个uuid
MaximumServiceRecordCount 是一个16位计数,指定响应此请求时要返回的最大服务记录句柄数。
SDP服务器不会返回超过指定值的句柄。如果匹配请求的服务记录超过N条,SDP服务器将决定在响应中返回哪些匹配的服务记录句柄。
范围:Ox0001-0xFFFF
RSP:
TotalServiceRecordCount是一个整数,包含与请求的服务搜索模式匹配的服务记录的数量。如果没有服务记录匹配请求的服务搜索模式,则该参数设置为0。N不应该大于SDP_SERVICE_SEARCH_REQ中指定的MaximumServiceRecordCount值。
当使用多个部分响应时,每个部分响应包含TotalServiceRecordCount的相同值。
范围:0 x0000-0xffff
CurrentServiceRecordCount是一个整数,表示下一个参数中包含的服务记录句柄的数量。如果没有与请求的服务搜索模式匹配的服务记录,则该参数设置为0。N不应该大于当前响应中指定的TotalServiceRecordCount值。
范围:Ox0000-0xFFFF
ServiceRecordHandleList,这个就是符合req中的uuid的服务句柄
SERVICE ATTR TRANSACTION
REQ:
ServiceRecordHandle:是service search获取到到句柄
MaximumAttributeByteCount:这个就是属性值数据的最大值,相当于规定了rsp中payload长度的最大值
AttributeIDList:是一个数据元素序列,其中列表中的每个元素要么是一个属性ID,要么是一个属性ID范围。每个属性ID被编码为一个16位无符号整数数据元素。每个属性ID范围被编码为32位无符号整数数据元素,其中高16位被解释为范围的开始属性ID,低16位被解释为范围的结束属性ID。AttributelDList中包含的属性ID应按升序排列,不允许任何属性ID值重复。注意:所有属性都可以通过指定范围0x0000到0xFFFF来请求。
RSP:
AttributeListByteCount:这个值代表rsp里AttributeList中参数的长度,它不能超过req中的MaximumAttributeByteCount
AttributeList:AttributeList是一个包含属性id和属性值的数据元素序列。序列中的第一个元素包含要返回的第一个属性的属性ID。序列中的第二个元素包含相应的属性值。列表中连续的元素对包含附加的属性ID和值对。只有在服务记录中具有非空值且其属性id在SDP_SERVICE_ATTR_REQ中指定的属性才包含在AttributeList中。服务记录中没有值的属性的AttributeList中既没有属性ID,也没有属性值。属性按照属性ID值的升序排列。
SERVICE SEARCH ATTRIBUTE TRANSACTION
REQ:
RSP: