蓝牙 SDP服务查询协议

2.1 SDP CLIENT-SERVER ARCHITECTURE

SDP 客户端-服务端 架构
image

我们如何知道哪个设备是client哪个设备时server呢?
比如拿耳机和手机举例,如果耳机和手机都支持server和client,那么就要看L2CAP的CID了,比如耳机先发起SDP L2CAP连接,那么这个通道CID耳机设备作为client,被连的手机设备作为server。

image

4.2 PROTOCOL DATA UNIT FORMAT

协议数据包格式
image

PDU(protocol data unit)是指协议数据单元,也就是client往server发的包的类型,TID类似于每个包的一个标识id,比如client发起请求TID是0,那么client收到server的响应的TID也应该是0。

4.7.1 SDP_SERVICE_SEARCH_ATTR_REQ PDU

image

MaximumAttributeByteCount
这个是指响应该请求时返回属性数据最大字节数N,如果超过规定字节数N,则需要分包

比如下面N=0x0500(1280字节,大端字节序)
image

下面响应的AttributeLists数据包大小没有超过N,那么ContinuationState=0(无需分包)
image

译文:
MaximumAttributeByteCount 指定响应该请求时返回的属性数据的最大字节数。 SDP 服务器在响应 PDU 中返回的属性数据不得超过 N 个字节。 如果请求的属性需要多于N个字节,SDP 服务器决定如何对列表进行分段。 在这种情况下,客户端可以通过发出包含在先前响应 PDU 中返回的连续状态的请求来请求每个连续段。 在需要多个响应PDU来返回属性数据的情况下,MaximumAttributeByteCount指定每个响应PDU中包含的属性数据部分的最大大小。 范围:0x0007 至 0xFFFF
image

ContinuationState
指是否分包

译文:
ContinuationState 由 8 位计数 N 组成,表示字节数
连续状态信息,后面是 N 字节的连续信息。 如果当前响应已完成,则此参数由值为 0 的单个字节组成。如果给出部分响应,则可以在后续请求中提供 ContinuationState 参数以检索响应的其余部分。
如果生成部分响应,则响应可以任意分段为多个 PDU(受到 AttributeListByteCount 参数的允许值范围的约束)。 部分响应中的属性不需要完全位于单个 PDU 内。
image

4.7.2 SDP_SERVICE_SEARCH_ATTR_RSP PDU

image

AttributeListsByteCount
译文:
AttributeListsByteCount 包含 AttributeLists 参数中字节数的计数。 N 绝不能大于 SDP_SERVICE_SEARCH_ATTR_REQ 中指定的 MaximumAttributeByteCount 值。
范围:0x0002 至 0xFFFF
image

参考链接

Bluetooth Core Specification v5.3
https://www.bluetooth.com/specifications/specs/

Assigned_Numbers
https://www.bluetooth.com/specifications/specs/assigned-numbers/

posted @ 2023-09-11 15:31  eezhijun  阅读(63)  评论(0编辑  收藏  举报