蓝牙的SDP协议总结

Posted senior-engineer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝牙的SDP协议总结相关的知识,希望对你有一定的参考价值。

1.概念

    SDP协议让客户机的应用程序发现存在的服务器应用程序提供的服务以及这些服务的属性。SDP只提供发现服务的机制,不提供使用这些服务的方法。每个蓝牙设备都需要一个SDP Service,只做Client的蓝牙设备除外。

2.ServiceRecord
    每一个Service利用ServiceRecord来表示(具有唯一的32bit的Handle),每一个ServiceRecord由若干ServiceAttribute组成,由下图表示:
技术分享图片

每一个ServiceAttribute的结构由下图所示:
    技术分享图片
Attribute ID是由Assigned Value定义好的,例如Record Handle Attribute的ID为0x0000。
正因为SDP Record由许多Attribute组成,所以,可以把Record看成AtributeList,这在后面的SDP resposne中会常用到。
设备通过SDP request来访问这些record的相关信息。这里有个很好的SDP实例,如下:
技术分享图片
Service Class ID List描述了Service的类型,如0x00000000代表SDP service
Protocol Descriptior List 列出了可能使用这种Service的protocol
 
3.Data Element
Data Element是在SDP中定义的一种数据结构,用来表示ServiceAttribute的Value域。每一个data element由Type+Size两部分组成。
Type的定义如下图:
技术分享图片
Size的定义如下图:
技术分享图片

几个Data Element的例子:
技术分享图片

4.Service Class
    每一个Service都是ServiceClass的一个实例,一个Service Record就是一个Service Class的实例,Service Class可以表示一个Record里的所有Attribute。每一个Service Class有一个ID,包含在ServiceClassIDList这个Attribute的value里,称之为UUID。
 
5.UUID
   一个全局惟一的标识符,128bit。为了节省存储和传输开销,UUID的一些位已经固定,出现了16bit和32bit的两种UUID。这些不同bit的UUID可以相互转化,如下式:
技术分享图片

6.SDP的数据单元格式(SDU)
    传输时都是以Big-Endian的形式,数据格式如下:
技术分享图片
PUD ID有如下几种定义:
技术分享图片
Transaction ID和Length定义如下:
技术分享图片
7.SDP中的PDU
(1)Error PDU
技术分享图片

(2)SDP_ServiceSearchRequest PDU
技术分享图片
 ServiceSearchPattern由UUID组成,每个UUID由data lement组成。MaximumServiceRecordCount用来指定返回的Service Records Handles的最大个数,由于该参数为2字节,所以其取值区间就是0x0001~0xffff。由于一个ServiceSearchPattern相匹配的Service Records Handles可能有多个,所以指定该参数非常的有必要。
 
(3)SDP_ServiceSearchResponse PDU
技术分享图片

TotalServiceRecordCount用来表示匹配的Service Record个数,最大为65535(而且不能够大于MaximumServiceRecordCount),如果没有配置的Service Record,则其值为0。

CurrentServiceRecordCount用来表示当前PDU中返回的Service Record Handle的个数。

ServiceRecordHandleList包含了当前PDU中返回的所有Service Record 的Handles,每一个Handle用一个32bit的数据来表示,所以该参数的长度就是4×CurrentServiceRecordCount字节。

(4)SDP_ServiceAttributeRequest PDU
技术分享图片

ServiceREcordHandle是通过SDP_ServiceSearchResponse获取到的特定的Service的Service Record Handle。

参数MaximumAttributeByCount用来指定返回Attribute Value的最大总长度,以字节为单位。

第三个参数AttributeIDList用来指定一组AttributeIDList,可以是几个AttributeID,以可以是一个ID Range,如果是前者,则长度为16位,如果为后者,则长度为32位。

 

(5) SDP_ServiceAttributeResponse PDU

技术分享图片

AttributeListByteCount用来表示Package中包含的数据的总长度,该值应该是小于SDP_ServiceSearchRequest中的MaxmumAttributeByteCount的一个值。

 

第二个参数AttributeLists是Service Record Attribute 的列表项,每一项包含了Attribute ID和Attribute Value两部分。

(6)SDP_ServiceSearchAttributeRequest PDU
技术分享图片

ServiceSearchPattern和SDP_ServiceSearchRequest中完全一样。

第二个参数MaxmumAttributeByteCount用来指定返回Attribute Value的最大总长度,以字节为单位。

第三个参数AttributeIDList用来指定一组AttributeIDList,可以是几个AttributeID,以可以是一个ID Range,如果是前者,则长度为16位,如果为后者,则长度为32位。

 

(7)SDP_ServiceSearchAttributeResponse PDU

技术分享图片

AttributeListByteCount用来表示Package中包含的数据的总长度,该值应该是小于SDP_ServiceSearchRequest中的MaxmumAttributeByteCount的一个值。

 

第二个参数AttributeLists是Service Record Attribute 的列表项,每一项包含了Attribute ID和Attribute Value两部分。

 

8.一些Attributes

两种attribute每个service record都有:1.ServiceRecordHandle (attribute ID 0x00002).ServiceClassIDList (attribute ID 0x00001)

(1)ServiceRecordHandle Attribute

技术分享图片

(2)ServiceClassIDList Attribute

技术分享图片

(3)ServiceRecordState Attribute

技术分享图片

(4)ServiceID Attribute

技术分享图片
其余很多Attribute参考SPEC。




























以上是关于蓝牙的SDP协议总结的主要内容,如果未能解决你的问题,请参考以下文章

手机通过蓝牙传文件用的啥协议?

蓝牙 SDP - sdpd 在哪里?

微信小程序使用蓝牙通信协议连接硬件整理总结(初始化蓝牙搜索设备展示设备)

微信小程序使用蓝牙通信协议连接硬件整理总结(蓝牙连接获取设备UUID开水器notify及关闭蓝牙)

蓝牙核心技术概述

Android 低功耗蓝牙(Ble) 开发总结