1.概述

  SDP是蓝牙的Service Discovery Protocol,用来发现远程设备能够提供的Service。它只负责发现对方支持的Service,不负责Service的具体实现。
 
2.背景概念
   SDP中的每一个Service用ServiceRecord来表示(具有唯一的32bit的Handle),每一个ServiceRecord由若干ServiceAttribute组成,ServiceAttribute由Attribute ID和Attribute Valuel两个部分。
   通过SDP request可以访问这些record,以此来获取设备的服务信息。
   Data Element是SDP中使用的一种数据结构,如下:

具体的Type和Size Index可以查询Spec p1580和p1581。Data element可以用来表示attribute ID,Attribute range,Attribute value。

  每一个Service record至少包含两种attribute:
1.ServiceRecordHandle (Attribute ID = 0x0000)
2.ServiceClassIDList (Attribute ID = 0x0001)
ServiceRecordHandle是一个32位整型,唯一标识某一SDP中的Service record
ServiceClassIDList表示该Service record所属的Service Classes
传输的request/resposne有如下的结构:
 
 
3.关于SDP的一些Frame---本地hsot进行request,远端slave进行resposne
   首先是本地的Host进行一系列的SDP_ServiceSearchAttributeRequest,远端Slave进行resposne。这个request的说明如下:

ServiceSearchPattern指定了要寻找的Service record
AttributeIDList表明了要寻找的Service record中的某些Attributes
下面我们可以通过一些Frame来具体看看这个request。
 
Frame91:SDP_ServiceSearchAttributeRequest
00001001 00000000 00010100 00000000 00010100 00000000 01000100 00000000 00000110 00000000 00000000 00000000 00001111 00110101 00000011 00011001 00000001 00000000 00000011 1111100000110101 00000101 00001010 00000000 00000000 11111111 11111111 00000000
最前面四个字节是HCI层的包装
Connection Handle: 00001001 00000000 = 0x9 = 9
Total Length: 00010100 00000000 = 0x0014 = 20
下面两个字节是L2CAP层的包装
PDU Length: 00010100 00000000 = 0x0014 = 20
Channel ID: 01000100 00000000 = 0x0044
下面是SDP的部分:
PDU ID: 是SDP_ServiceSearchAttributeRequest
Transaction ID: 0x0000
Parameter Length: 0x000f = 15  //这里需要注意的是,SDP是MSB!!!
后面是SDP request的parameter部分
ServiceSearchPattern:这部分是一系列的Data Element,参考Data element解释如下:
00110101:00110 = 6 表示数据部分是Data element sequence  101 = 5表示下面的一个字节表示该Data Element的大小
00000011 = 3表示该Data Element大小为3个字节
00011001(Data element sequence中的第一个Data element): 00011 = 3 表示是UUID  001 = 1表示2 bytes
00000001 00000000 = 0x0100 表示实际的UUID:查询UUDI值,表示L2CAP
Max Amount of Attribute Data to Return:0x03f8 =  1016
List of Requested Attributes: 这又是一个Data element sequence,分析如下:
00110101: 00110 = 6表示数据部分是Data element sequence 101 = 5表示下面的一个字节表示该Data Element的大小
00000101 = 5表示该Data Element大小为5个字节
00001010: 00001 = 1表示Unsigned Integer 010 = 2表示4 bytes 
这样表示的就是一个attribute ID range
00000000 00000000 11111111 11111111:表示的就是从0x0000到0xffff的attribute ID
Bytes for continuation length: 0 
注:这个request的目的应该是搜索L2CAP Service的所有Attributes。PS:不知道哪个2B搞的协议,需要弄得这么复杂吗??
 
Frame92:SDP_ServiceSearchAttributeResponse 
远端slave的resposne,携带参数如下:
AttributeListsByteCount,
AttributeLists,
ContinuationState
L2CAP显示的PDU的长度是256,数据茫茫。。。还是挑一些重点看看吧。
PDU ID: 00000111 = 0x07 SDP_ServiceSearchAttributeResponse
Transaction ID: 0x0000
Attribute List Byte Count: 246  //PS:靠,attributeLists有这么多字节
AttributeListsByteCount = 00000000 11110110 = 0x00f6 = 246
看一下AttributeLists的开头3个字节:00110110 00000011 00111101
00110110:00110表示是Data element sequence 110 = 6表示下面两个字节表示该Data Element的大小
00000011 00111101 = 0x33d = 829 //这么多字节是必须用到ContinuationState了
随便看几个Attribute吧:
第一个AttributeList:
前三个字节是00110110 00000000 01001110 解析如下(PS:写解析软件的公司真牛逼):
00110110: 00110表示是Data element sequence 110 = 6表示下面两个字节表示该Data Element的大小
00000000 01001110 = 0x004e = 78  //第一个AttributeList有78个字节
第一个Attribute:00001001 00000000 00000000
00001表示Unsigned Integer 001表示2个字节 (Attribute ID是16位的)
Attribute ID为00000000 00000000,表示ServiceRecordHandle
Attribute value为0x00010000
再看一个Attribute:
 00010001 00010010 00011001 00010010 00000011 
00001001:无符号整数,2个字节
00000000 00000001 = 0x01:Attribute ID = 0x01:是ServiceClassIDList属性
00110101 00000110:UUID,6个字节
 00010001 00010010:UUID,2个字节,Attribute value为0x1112
00011001 00010010 00000011:UUID,2个字节,Atribute value为0x1203
其余的attribute不看了,太多了,哪个Sb制定的协议!!
最后的ContinuationState:00000000 11110110 = 0x00f6  //这次response不足以把所有的attribute传回,0x00f6会用在下一次的SDP_ServiceSearchAttributerequest中。如果足以传回所有的attribute,则ContinuationState为1个字节=0.
注:以上是一个SDP_ServiceSearchAttributeRequest和一个SDP_ServiceSearchAttributeResponse。下面又是一组request和resposne。
 
Frame100:SDP_ServiceSearchAttributeRequest
相比于上一个SDP_ServiceSearchAttributeRequest不同的是,transaction ID为0x0001, Continuation length bytes为0x00f6,是上次的resposne返回的,说明这次的request是要求对方继续发送上次没有发送完的response。
直到frame128才完成所有的response,在这个过程中,远端的slave也开始向本地的Host发送SDP request。
 
3.远端slave向本地的Host发送requsst,本地的Host进行resposne
Frame110:SDP_ServiceSearchAttributeRequest
远端的slave在Frame110时就已经向本地Host发送SDP request,可以看出,双方的SDP request和resposne是穿插的,并不是一定要等一方完成后另一方才能进行SDP request。
Frame110是关于pnp Information的requset,本地的Host也在Frame121向远端slave发送了这个SDP requset。
 
4.总结:
    SDP用于发现对方能够提供的服务,通信方式为SDP requset和SDP resposne。从抓取的包来看,两端的SDP Service 都会向对方发送SDP requset。需要注意在SDP中是MSB的字节顺序,与L2CAP和HCI不同,另外,需要注意Data Element,每个Attribute的ID和Value都是由它来表示的。
PS:我只想说,制定这种协议的人可以去死了。
分享:

 
 

FTS抓包看蓝牙的SDP整个过程的更多相关文章

  1. 【转】FTS抓包看蓝牙的SDP整个过程

    原文网址:http://blog.sina.com.cn/s/blog_69b5d2a50101f23c.html 1.概述   SDP是蓝牙的Service Discovery Protocol,用 ...

  2. FTS抓包看蓝牙验证的过程

    1.概述    在进行蓝牙设备的连接时,为了保护个人隐私和数据保密的需要,需要进行验证.   2.一些Frame Frame74:本地发送Authentication requset command ...

  3. FTS抓包看AVDTP

    1.概述   测试过程为打开Audio连接,没有听音乐,人后断开Audio连接,主要目的是为了测试AVDTP的工作流程.   2.Frame分析    首先贴出抓取的关于AVDTP的包: 在L2CAP ...

  4. FTS抓包看L2CAP Connection的建立(二)

    1.概述     前面一篇博文已经介绍到远端设备对本地的Connection request进行了response,目前L2CAP的连接处于pending状态.这篇将继续抓取下面的一些packets, ...

  5. FTS抓包看L2CAP Connection的建立(一)

    一.概述     在前面的文章中介绍了inquiry和ACL connection的建立过程.这个连接建立后,L2CAP signaling channel(CID = 0x0001)就已经存在,可以 ...

  6. charles抓包看性能数据

    1.优化某个接口或加载速度(H5加载速度慢) 抓包看Overview ①看Duration,就是接口的加载时间 ②看Latency,就是延时一端传播到另一端所花费的时间:一般和网络有关:可以综合Dur ...

  7. wireshark抓包看ECN

    由于实验需要,要统计ECN信息.为了验证拓扑中是否真的有ECN信息,用了wireshark进行抓包查看. 网上找到的相关有用资料有:http://blog.csdn.net/u011414200/ar ...

  8. ip头、tcp头、udp头详解及定义,结合Wireshark抓包看实际情况

    公司的同事们在分析网页加载慢的问题,忽然使用到了Wireshark工具,我就像发现新大陆一样好奇,赶紧看了看,顺便复习了一下相关协议.上学时学的忘的差不多了,汗颜啊! 报文封装整体结构 mac帧头定义 ...

  9. WinpCap 使用线程发数,明明发了,返回值0是OK的啊,怎么抓包看不到,难道不支持多线程。。。

    if (!m_adapterHandle){    return false;}int rst = pcap_sendpacket((pcap_t*)m_adapterHandle,data ,dat ...

随机推荐

  1. 解决Fiddler无法抓到手机的会话包

    解决Fiddler无法抓到手机的会话包   使用Fiddler抓手机的会话包涉及多个方面,所以容易出现无法抓取包的情况.遇到这类问题,需要按照以下顺序进行检查和排除.   (1)在Fiddler中设置 ...

  2. mysql之对表的操作

    1. 表的基本概念 在数据库中,表是一种非常重要的数据库对象,是组成数据库的基本对象,由若干个字段组成,主要用来储存数据记录. 表中的数据库对象包含列,索引和触发器. 列:也称属性列,在具体创建表时必 ...

  3. jQuery检查某个元素在网页上是否存在

    jQuery选择器有比较完善的处理机制,用jQuery获取网页中不存在的元素也不会报错,值得注意的是,利用$('#tt')获取的永远是对象,即使网页上没有此元素.当使用jQuery检查某个元素在网页上 ...

  4. ZOJ 3157 Weapon

    题目传送门 题意:就是CF round# 329 B 的升级版,要求出相交点的个数 分析:逆序数用树状数组维护,求出非逆序数,然后所有情况(n * (n - 1)) / 2减之就是逆序数个数. #in ...

  5. POJ1947 Rebuilding Roads(树形DP)

    题目大概是给一棵树,问最少删几条边可以出现一个包含点数为p的连通块. 任何一个连通块都是某棵根属于连通块的子树的上面一部分,所以容易想到用树形DP解决: dp[u][k]表示以u为根的子树中,包含根的 ...

  6. 【BZOJ】1090: [SCOI2003]字符串折叠(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1090 随便yy一下.. 设f[i,j]表示i-j的最小长度 f[i, j]=min{j-i+1, f ...

  7. COJ975 WZJ的数据结构(负二十五)

    试题描述 输入一个字符串S,回答Q次问题,给你l,r,输出子序列[l,r]的最长连续回文串长度. 输入 第一行为一个字符串S. 第二行为一个正整数Q. 接下来Q行每行为l,r. 输出 对于每个询问,输 ...

  8. Uiautomator打包使用第三方库,报错的解决方案

    问题引源: 在做自动化过程中,想在用例执行完毕后,自动生成该用例测试报告: 报告定义为Excel格式文件,且在用例执行过程中生成. 所以我在Uiautomator工程中引用了jxl.jar,用以处理E ...

  9. Linux(Redhat)下redis安装

    原文:http://www.javaweb1024.com/data/NoSQL/2015/06/29/785.html redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系 ...

  10. Web前端开发规范文档你需要知道的事--HTML、css、js、文档等需要规范内容

          规范目的 为提高团队协作效率,便于后台人员添加功能及前端后期优化维护,输出高质量的文档,特制订此文档.本规范文档一经确认,前端开发人员必须按本文档规范进行前台页面开发.本文档如有不对或者不 ...