之前写了一篇 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实际的 搜索的情况,和上面的规范是一致:


end

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

  1. (转)SDP协议概述

    1 简介 SDP 完全是一种会话描述格式, 它不属于传输协议. 它使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP). 实时流协议(RTSP).MIME 扩展协议的电子邮件以 ...

  2. [转] SDP协议

    [转] SDP协议 http://blog.csdn.net/dxpqxb/article/details/18706471 1.SDP协议概述 SDP(Session Description Pro ...

  3. 蓝牙的SDP协议总结

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

  4. 蓝牙HID协议笔记【转】

    蓝牙HID协议笔记 转自:http://blog.sina.com.cn/s/blog_69b5d2a50101emll.html 1.概述     The Human Interface Devic ...

  5. SDP协议介绍

    一.SDP协议介绍 SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP).实时流协议(RTSP).MIME 扩展协 ...

  6. 蓝牙 BLE 协议学习: 000-有关概念介绍

    背景 在学校内就用过蓝牙技术参加过比赛(并拿了奖):而蓝牙作为物联网中比较常见的协议,有必要进行深入的学习.此后的文章会以 ble(v4.0) 进行学习. 介绍 蓝牙技术最初由电信巨头爱立信公司于 1 ...

  7. SDP协议译稿(Part 1)

    本文的翻译内容是基于Bluetooth Core Spec 2.1+EDR 协议中对SDP的描述,很多都是个人的理解,难免有疏漏,有争议或者疑问的地方,欢迎在此留言进行探讨. 2. Overview ...

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

    一:http协议概述 1:http协议定义 2:使用telnet程序连接web服务器,获取资源 3:http协议:超文本传输协议,它是基于tcp/ip协议,就是建立在tcp/ip之上工作的, http ...

  9. SDP协议分析

    一.SDP协议介绍 SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP).实时流协议(RTSP).MIME 扩展协 ...

随机推荐

  1. OkHttp3源码详解(六) Okhttp任务队列工作原理

    1 概述 1.1 引言 android完成非阻塞式的异步请求的时候都是通过启动子线程的方式来解决,子线程执行完任务的之后通过handler的方式来和主线程来完成通信.无限制的创建线程,会给系统带来大量 ...

  2. (后端)spring的@Transactional注解详细用法(转)

    转自一人浅醉-博客园: 事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度.TransactionDefinition 接口中定义了五个表示隔离级别的常量: TransactionDefinit ...

  3. 这几天上海移动网络可以直接打开 Google Play 了

    这几天上海移动网络可以直接打开 Google Play (谷歌应用商店)了. 速度还不错.基本无延迟. 想当初,为了防止国内应用市场里的木马或恶意软件,想从 Google Play 应用市场下载,折腾 ...

  4. Scrapy 为每一个Spider设置自己的Pipeline

    settings中的ITEM_PIPELINES 通常我们需要把数据存在数据库中,一般通过scrapy的pipelines管道机制来实现.做法是,先在pipelines.py模块中编写Pipeline ...

  5. Git多人协作常用命令

    Git多人协作工作模式: 首先,可以试图用git push origin branch-name推送自己的修改. 如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并. 如果 ...

  6. MyBatis笔记----SSM框架mybatis3整合springmvc spring4

    上节 无springmvc框架 http://www.cnblogs.com/tk55/p/6661786.html 结构 jar包 web.xml 与index.jsp <?xml versi ...

  7. [20181220]使用提示OR_EXPAND优化.txt

    [20181220]使用提示OR_EXPAND优化.txt --//链接http://www.itpub.net/thread-2107240-2-1.html,http://www.itpub.ne ...

  8. 省市区三级联动(附j全国省市区json文件)

    效果如图所示: 首先提供全国所有省份的JS文件 下载地址:https://files.cnblogs.com/files/likui-bookHouse/address.rar 打开js内容如下: h ...

  9. mssql sqlserver 关键字 GROUPING用法简介及说明

    转自: http://www.maomao365.com/?p=6208  摘要: GROUPING 用于区分列是否由 ROLLUP.CUBE 或 GROUPING SETS 聚合而产生的行 如果是原 ...

  10. ELK 处理 Percona 审计日志(填坑)

    前提 1.有强烈的审计需求. 2.能允许10%-15%左右的性能损失. 3.有强烈的对数据库操作实时查看需求(一般都是为了领导要求). Logstash 比较坑的配置   1 2 3 4 5 6 7 ...