蓝牙SDP协议概述

之前写了一篇 bluedroid对于sdp的实现的源码分析   ,他其实对于sdp 协议本身的分析并不多,而是侧重于 sdp 处于Android bluedroid 架构中的代码流程,这篇文章,是针对SDP 的规范来整理SDP 协议本身的一些要点。

概要:

我们想一想,两个陌生的设备(之前未有过交互)如何去发现对方支持什么服务呢?很容易想到,我们需要一种协议,这种协议规定了服务在服务器上面是如何存储的以及对方如何能够通过这个协议来获取到数据,以及双方共同遵守的一些规定等等。

SDP全称是Service Discovery Protocol,它是一种服务发现的协议,它可以达成我们上面提出的问题。这部分参考core_spec,Vol3-PartB。

这样的一个协议应该具体实现一些什么?

那肯定是会规定特定的数据格式,以及交互的流程。

下面就分如下的几部分来介绍SDP:

  1. 基本概念。
  2. 数据格式
  3. 交互流程
  4. 实例

基本概念:

Service Record:服务就是可以提供特定信息或者进行特定的行为,或者是能进行控制某些资源的一个实体。它的实现可以基于软件或者硬件,也可以是两者兼有。在服务器上面维护的关于一个servcie的所有信息的集合就是一个service record。它的所有信息往往都是用service attributes来表示的。

service attribute:它是对于service 各种属性的一种描述。比如service ID,service的name。一些常见的属性如下:

从上面的图中发现service attribute 由 attribute ID和attribute Value组成的。

Attribute ID:它是一个16位的无符号整数,它用来区分在同一个Service Record之中的不同attribute,同时它也往往暗含与它相关的     Attribute Value的语义。注意它的用data element 来表示的。

Attribute Value:它是一串不定长的数据,它的含义是由与它对应的Attribute ID以及它所在的service类别来决定的。注意它的数据格式的是data element。(后续介绍)

Service class:它就是一种service的类别,它提供了所有属于这个类别的attributes的定义,它类似面向对象编程里面的类,具体的service是类的实例,一个具体的service 它可能隶属多个类别。类似面向对象的里面的继承。当然每个class本身也是要和别的class来做以区分的,承担这项任务的变量叫service class identifier,在service里面总由一个attribute叫做ServiceClassIDList,这个service class identifier就存储在这个attribute的attribute value 里面,这个值是一个UUID。

UUID:A UUID is a universally unique identifier that is guaranteed to be unique across all space and all time。注意它具有全局的唯一性。 它是128bit的值。

Service Search Patterns:这个是一串UUID,是用来搜索用的。

Data element:它由header和data两部分组成。其中,header部分又由两部分组成:类型描述符和大小描述符,前者是来描述data的类别,后者是来描述data 的大小。此概念非常重要。类型描述符是用header部分的高5bits来表示的。大小描述符是用header部分的低3个字节来描述的。下面看看这两个描述符具体的类别以及大小:

下面举个例子来说明:

接下来 我们看看:

数据格式:

数据的格式如下图:

PDU ID 表示这个PDU是作用,是用以区别其他的PDU

TransactionID:用以区别其他的Transaction

另外还有一个概念Continuation State:当SDP 服务器返回client 结果的时候,如果数据太大,那么就会分包,下面额度变量就是分包的标志,如果部分包,其值为0

接下来 ,我们看看交互的基本的流程:

交互流程:

根据PUD id 的不同,交互的流程也不同,但是思路都是一样,都是CS的架构。

因为基本上面所有的交互流程都是一样的,下面只讲其中一个交互的流程。

下面来解析一下它的参数:

ServiceSearchPattern:这个匹配模式是由一串UUID组成的,一次最多包含12个UUID,UUID的表现形式是data element

MaximumAttributeByteCount:从response中返回的最大的PDU

AttributeIDList:这个参数包含的是一串attribute ID或者是attribute ID的范围,也可以是两者的组合。

ContinuationState: 这个参数的第一个字节代表长度,然后后面跟该长度个字节。这个state 是从reponse中返回的。然后再一次请求的时候放在参数里面。如何没有剩余的字节需要读取,那么设置为0

下面是对应的response 的PDU:

相应的参数解释如下:

AttributeListsByteCount:这里是count就是AttributeLists这里的字节数。

AttributeLists:这里的元素都是data element sequence,它是由attribute IDs和attribute values 来组成的pair

这里先结合btsnoop来分析一下,具体的SDP 流程是怎么样的?

相应的log:btsnoop_a2dp.cfa

从上面的log 可以看出,其PDU ID: SDP_ServiceSearchAttributeRequest ,这个命令是要先根据patterns来搜索特定的service,然后在搜索到service里面进行attribute的搜索。那么我们看看这条命名对应的具体参数。

我们应该还记得  pattern是第一个参数,其中包含的UUID是L2cap,那意味着只要包含L2cap的service都会match这个pattern,接下来的参数是说最多返回656 个字节。接下来的参数AttributeLists上面讲过,既可以是UUID,也可以是UUID的范围。这里参数是0x00 --0xFF

也就是说 返回match pattern的service的所有的attribute。

SDP里面是有专门的PDU来做browsing的,这里不作介绍。从上面的描述可以看出,虽然它没有做browsing,但是也相当于是browsing。

接下来,我们看看对应这个request的response:

我们按照数据格式,来分析一下,如果忘记了PDU的数据格式,可以回头看看上面写的。

07:PDU ID: SDP_ServiceSearchAttributeResponse

00 00 :Transaction ID: 0x0000

00 2b:Parameter Length: 43

根据 数据包格式,我们知道接下来是Parameters了,我们再次把这个parameter相关的PDU 放在这里:

00 26:Attribute List Byte Count: 38 代表这一包数据的AttributeLists 的byte的数量。

接下来就是AttributeLists的表达方式:

从上面的图可以知道其是Data Element Sequence

接着分析:

0x36  0x01 0xd7 = 0b00110 0b110 0x01 0xd7

其中0b00110 说明Type是 Data element sequence

0b110 说明参数的长度部分是由16个bits来表示的,也就是后面的0x01 0xd7,这个长度代表所有的返回的参数的长度,(后续的包是分包返回)并不是这个包的长度。这里还需要注意一点的是这里的type是Data element sequence ,意味着接下来parameter部分都是Data element的格式。

接着分析:

接下来肯定还是data element的header部分

36 00 3b :0b00110 0b110 0x00 0x3b 说明接下来的 AttributeList 里面的数据元素还是Data Element,并且 这个AttributeList的长度是的0x003b ,

接下来的数据是 :

09 00 00  = 0b00001 0b001 00 00 对应上面的data element说明Attribute ID的Type是Unsigned Integer,(注意根据上面的格式,第一个element是Attribute ID,接着是Attribute value),Attribute ID的SizeIndex是2 bytes,Attribute ID = 0x00 0x00

下面看下一个element 这个element 是对应上面的Attribute ID的Attribute value:

0a 00 01 00 00  = 0b00001 0b010 说明这个data element的Type是Unsigned Integer,用4个字节来表示 也即00 01 00 00

接下来的就是 下一个 attribute 了,其格式都是类似,只是代表的attribute不同。在此不再赘述。

最后再举个profile的例子,看看profile中是如何定义它的service的:

这里看A2dp 中关于其自身service的描述:这里只描述sink的情况:

从上面的service class ID 看出它是一个audio sink的service,涉及到protocol 有L2cap和AVDTP,与其相对应的profile 是A2dp

Supported Features是它有可能支持的feature,接下来还有provider name和Service name的描述。

下面看一下log实际的 搜索的情况,和上面的规范是一致:



ed

原文地址:https://www.cnblogs.com/libs-liu/p/9498952.html

时间: 2024-11-02 15:26:54

蓝牙SDP协议概述的相关文章

[转] SDP协议

http://blog.csdn.net/dxpqxb/article/details/18706471 1.SDP协议概述 SDP(Session Description Protocol)是一个用来描述多媒体会话的应用层控制协议,为会话通知.会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述:它是一个基于文本的协议,这样就能保证协议的可扩展性比较强,这样就使其具有广泛的应用范围:SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协

蓝牙HID协议笔记【转】

蓝牙HID协议笔记 转自:http://blog.sina.com.cn/s/blog_69b5d2a50101emll.html 1.概述 The Human Interface Device (HID)定义了蓝牙在人机接口设备中的协议.特征和使用规程.典型的应用包括蓝牙鼠标.蓝牙键盘.蓝牙游戏手柄等.该协议改编自USB HID Protocol. 2.一些概念 (1)HID Reports:Bluetooth HID devices支持三种Report:Input, Output, and

HTTP协议概述

HTTP协议概述 什么是HTTP协议 1.HTTP协议:hypertext transfer protocol(超文本传输协议) 规定客户端和服务器如何进行交互 基于TCP/IP协议的应用层协议 2.HTTP最基本的三个条件: 1.HTTP协议基于请求响应模型 2.一次请求对应一次响应 3.请求只能由客户端发出,服务器只能被动的等待请求做出响应 2.HTTP1.0和HTTP1.1的区别 1.HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源. 2.HTTP1.1协议,客

javaweb学习总结十九(http协议概述以及http请求信息分析)

一:http协议概述 1:http协议定义 2:使用telnet程序连接web服务器,获取资源 3:http协议:超文本传输协议,它是基于tcp/ip协议,就是建立在tcp/ip之上工作的, http协议前提是必须浏览器与服务器建立连接. 4:http/1.0与http/1.1的区别 telnet连接tomcat服务器演示: http1.0协议: 只与服务器交互了1次,然后就端口连接. http1.1协议: 5:浏览器请求服务器端次数问题 一个浏览器访问服务器,首先拿到html页面,然后发现有图

射频识别技术漫谈(6)——通讯协议概述

通讯协议是通讯的双方或多方在交流时遵守的规矩,包括谁先发起通讯,先交流什么,后交流什么,一方如何问,另一方如何答等.在这里通迅的双方指的是读写器和卡片. 首先是谁先发起通讯,很显然有两种,读写器先发言和卡片先发言.前一种叫Reader Talk First,简称为RTF;后一种叫Tag Talk First,简称为TTF. 我们知道,卡片从读写器产生的射频场获得工作时需要的能量,一般认为应该是读写器主动,卡片被动才对,这也是人之常情.所以多数功能稍复杂的卡片都是采用RTF模式,即读写器问,卡片回

学习笔记_SIP中的SDP协议

当INVITE OK, 两个UA终端之间开始音视频流传输时, SIP消息INVITE的"message body"里将携带SDP消息, 描述具体通信内容. 在Sipdroid中SDP消息的实现是SessionDescription类. 会话描述的功能: 类SessionDescription将根据SDP协议格式化(处理)SIP消息体. 会话描述的基本内容: 会话等级描述(描述可以应用于整个会话和所有媒体流); 0或者更多的媒体等级描述(描述仅只用于一种媒体流). 会话描述的详细内容:

网络协议概述:物理层、连接层、网络层、传输层、应用层详解(转载)

这篇文章主要介绍了网络协议概述:物理层.连接层.网络层.传输层.应用层详解,本文用生活中的邮差与邮局来帮助理解复杂的网络协议,通俗易懂,文风幽默,是少见的好文章,需要的朋友可以参考下 信号的传输总要符合一定的协议(protocol).比如说长城上放狼烟,是因为人们已经预先设定好狼烟这个物理信号代表了“敌人入侵”这一抽象信号.这样一个“狼烟=敌人入侵”就是一个简单的协议.协议可以更复杂,比如摩尔斯码(Morse Code),使用短信号和长信号的组合,来代表不同的英文字母.比如SOS(***---*

SDP协议简述

SDP协议也是文本协议,只需要按照协议本身的格式填充.SDP协议格式即详细信息如下: 会话描述 格式及举例 v=(protocol version) v=0 o=(owner/creator and session identifier) o=用户名 会话id版本网络类型地址类型地址 o=hua 253183  51827  IN  IP4 192.168.2.2 s=(session name) 会话名 i=*(session information) 会话信息 e=*(email addre

SDP 协议分析

转载地址(http://www.cnblogs.com/qingquan/archive/2011/08/02/2125585.html) 一.SDP协议介绍 SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP).实时流协议(RTSP).MIME 扩展协议的电子邮件以及超文本传输协议(HTTP).SDP协议是也是基于文本的协议,这样就能保证协议的可扩展性比较强,这样就使其具有广泛的应用范围.SDP 不支持会话内