一.概述
在前面的文章中介绍了inquiry和ACL connection的建立过程。这个连接建立后,L2CAP signaling channel(CID = 0x0001)就已经存在,可以进行L2CAP连接
二.基本概念
HCI ACL Data Format:
L2CAP Basic information frame (B-frame):
L2CAP的C-Frame,在signaling channel上使用,结构如下:
L2CAP是request-response的通信形式,signaling channel上发送一些控制信息,它的information payload是comamnd的形式,格式如下:
总结下来,就是一些控制信息在signaling channel上发送,采用的C-Frame,information域是上图request packet的形式。定义的commnand code可以查询Spec:page1415-1416。
三.一些步骤的分析
Frame29:L2CAP发出Information request,HCI收到ACL Data
HCI层看到的Data如下:
00001001 00100000 00001010 00000000 00000110 00000000 00000001 00000000 00001010 00011111 00000010 00000000 00000010 00000000
Connection Handle: 00001001 = 0x09 = 9 //占据12个bit
PB:0x10(First automatically flushable packet)
BC:0x00(No broadcast, point-to-point)
Total Length: 00001010 00000000 = 0x000A = 10
绿色部分是L2CAP的Data,前面是HCI层所做的包装.
PDU Length: 00000110 00000000 = 0x0006 = 6
Channel ID:00000001 00000000 = 0x0001(signaling channel)
Information payload:00001010 00011111 00000010 00000000 00000010 00000000
其中command code:00001010 = 0x0a = 10 (Information request)
Identifier:00011111 = 0x1f = 31(response与request保持相同,ps:貌似与opcode类似的样子!!)
Length:00000010 00000000 = 0x02 = 2
Data:00000010 00000000 = 0x02 (Extended features supported)
Frame30:相应的,HCI层发出HCI_Read_Remote_Extended_Features
该command的参数为
Connection_Handle
Page Number
00011100 00000100 00000011 00001001 00000000 00000001
opCode:00011100 = 0x041C
TotalLength = 00000011 =3
Connection handle:00001001 = 9
page Number = 00000000 00000001 = 0x0100(0x0000代表normal LMP features,其余根据page Number确定对应的feature)
Frame31:HCI收到ACL Data,是对方发来的发来的Information request。
这其实是一个互相交换information的过程。
Frame32:收到Max Slots Change event
该Event有两个参数:
Connection_Handle,
LMP_Max_Slots
00011011 00000011 00001001 00000000 00000101
EventCode:0x1b
Total Length: 3
Connection Handle: 9
LMP Max Slots: 5
////这个应该是返回的extended feature吧
Frame33: Read_Remote_Extended_Supported_Features----Command Status
00001111 00000100 00000000 00000010 00011100 00000100
OpCode:0x0f
Total Length: 4
Status: Success 0x00
Number HCI Command Packets: 2
Opcode: 0x041c
Frame34:Read_Remote_Extended_Features_Complete event
该Event参数如下:
Status, Connection_Handle,
Page_Number,
Maximum page number,
Extended_LMP_Features
00100011 00001101 00000000 00001001 00000000 00000001 00000001 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000
EventCode:0x23
Total Length: 00001101 = 13
Status: Request for remote extended features succeeded
Connection Handle: 0x00001001 = 9
Page Number = 00000000 00000001 = 0x01
Maximum Page Number: 0x01
Extended_LMP_Features: 0x0000000000000001 //根据FEATURE MASK来表示,支持就置为1,这里表示支持3 slot packets
以上完成了一个L2CAp的information request的过程,这个request要求的是Extended features supported,相应的HCI发送HCI_Read_Remote_Extended_Features,page Number为0x00000001,左后返回的
Read_Remote_Extended_Features_Complete event返回了需要读取的Feature,和相同的Page Number0x0000001。
Frame35-37发出Read_RSSI的Command,返回Number Of Completed Packets和command complete event。这个是在L2CAP发出Connection request之前必须的吗??
Frame38:L2CAP发出Connection request,HCI收到相应的ACL Data
00001001 00000000 00001100 00000000 00001000 00000000 00000001 00000000 00000010 00000100 00000100 00000000 00000001 00000000 01000000 00000000
Connection Handle: 00001001 000000 = 9
Broadcast Flag: No broadcast, point-to-point
Packet Boundary Flag: First non-automatically-flushable L2CAP packet
Total Length: 00001100 00000000 = 0x0c = 12
L2CAP部分:
PDU Length: 00001000 00000000 = 8
CID:00000001 000000000 = 0x0001(signaling Channel)
Command Code: 00000010 = 0x02(Connection request)
ID:00000100 = 4
length = 00000000 000000100 = 4
PSM: 00000001 00000000 = 0x0001 (SDP)
Source CID:01000000 00000000 = 0x0040 //定义了request发出和接收的CID
这个request发出,开始建立L2CAP的连接
Frame39:发出Write_Link_Policy_Settings command
Frame40:L2CAP对对方的information request进行response,ID是2
Frame41:对本地发送的information request的response,ID是31。
Frame42:本地L2CAP再次发送information request,ID为32,
Frame43:收到Write_Link_Policy_Settings command的command complete event
Frame44-47是Role discovery command和对应的event
Frame48:HCI收到ACL Data,远端L2CAP发出的对本地的connection request的response
00001001 00100000 00010000 00000000 00001100 00000000 00000001 00000000 00000011 00000100 00001000 00000000 01000100 00000000 01000000 00000000 00000001 00000000 00000000 00000000
Connection Handle: 9
Broadcast Flag: No broadcast, point-to-point
Packet Boundary Flag: First automatically-flushable L2CAP packet
Total Length: 16
L2CAP部分:
PDU Length: 12
Channel ID: 0x0001
Command Code: 00000000 00000011 =0x03 Connection response
Identifier: 4
Command Length: 8
Destination Channel ID: 01000100 00000000 = 0x0044 //发送这个response的CID
Source Channel ID:01000000 00000000 0x0040 //这个CID在request中确定下来
Result: 00000001 00000000 (Connection pending)
Status: No further information available
四.总结
至此,本地L2CAP发送的Connection request已经被远端response,下面将会进行configure的过程,在下一篇中继续介绍。L2CAP connection的建立过程繁琐,涉及的HCI交互的command、event以及ACL Data很多,一些细节容易遗忘。这里还是需要把L2CAP连接的建立过程弄清楚,在整体的框架上进一步深化了解细节,这样对于蓝牙的相关协议会深刻些吧,以上。
- FTS抓包看L2CAP Connection的建立(二)
1.概述 前面一篇博文已经介绍到远端设备对本地的Connection request进行了response,目前L2CAP的连接处于pending状态.这篇将继续抓取下面的一些packets, ...
- FTS抓包看AVDTP
1.概述 测试过程为打开Audio连接,没有听音乐,人后断开Audio连接,主要目的是为了测试AVDTP的工作流程. 2.Frame分析 首先贴出抓取的关于AVDTP的包: 在L2CAP ...
- FTS抓包看蓝牙的SDP整个过程
1.概述 SDP是蓝牙的Service Discovery Protocol,用来发现远程设备能够提供的Service.它只负责发现对方支持的Service,不负责Service的具体实现. ...
- 【转】FTS抓包看蓝牙的SDP整个过程
原文网址:http://blog.sina.com.cn/s/blog_69b5d2a50101f23c.html 1.概述 SDP是蓝牙的Service Discovery Protocol,用 ...
- FTS抓包看蓝牙验证的过程
1.概述 在进行蓝牙设备的连接时,为了保护个人隐私和数据保密的需要,需要进行验证. 2.一些Frame Frame74:本地发送Authentication requset command ...
- charles抓包看性能数据
1.优化某个接口或加载速度(H5加载速度慢) 抓包看Overview ①看Duration,就是接口的加载时间 ②看Latency,就是延时一端传播到另一端所花费的时间:一般和网络有关:可以综合Dur ...
- wireshark抓包看ECN
由于实验需要,要统计ECN信息.为了验证拓扑中是否真的有ECN信息,用了wireshark进行抓包查看. 网上找到的相关有用资料有:http://blog.csdn.net/u011414200/ar ...
- ip头、tcp头、udp头详解及定义,结合Wireshark抓包看实际情况
公司的同事们在分析网页加载慢的问题,忽然使用到了Wireshark工具,我就像发现新大陆一样好奇,赶紧看了看,顺便复习了一下相关协议.上学时学的忘的差不多了,汗颜啊! 报文封装整体结构 mac帧头定义 ...
- WinpCap 使用线程发数,明明发了,返回值0是OK的啊,怎么抓包看不到,难道不支持多线程。。。
if (!m_adapterHandle){ return false;}int rst = pcap_sendpacket((pcap_t*)m_adapterHandle,data ,dat ...
随机推荐
- Linux磁盘分区与格式化
磁盘分区格式说明 linux分区不同于windows linux下分区标示: 例如:hda1 hd这两个字母表示分区所在的设备类型,hd标示IDE类型硬盘,sd表示SCSI类型硬盘 第三字母a标示硬盘 ...
- python 返回函数
返回函数 Python的函数不但可以返回int.str.list.dict等数据类型,还可以返回函数! 例如,定义一个函数 f(),我们让它返回一个函数 g,可以这样写: def f(): print ...
- Open Xml SDK Word模板开发最佳实践(Best Practice)
1.概述 由于前面的引文已经对Open Xml SDK做了一个简要的介绍. 这次来点实际的——Word模板操作. 从本质上来讲,本文的操作都是基于模板替换思想的,即,我们通过替换Word模板中指定元素 ...
- Lazy Acquisition
为什么要延迟? 延迟加载模式是用于快速启动.保证初始化时不必浪费时间去加载和运算,而在需要的时候再去调用. 框架中有实现吗? .NET典型的使用在4.0中已经有了,Lazy<T> 特性:线 ...
- 2015ACM/ICPC亚洲区长春站 E hdu 5531 Rebuild
Rebuild Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- 骨牌铺方格[HDU2046]
骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- java.lang.RuntimeException: Invalid action class configuration that references an unknown class named [xxxAction]。
java.lang.RuntimeException: Invalid action class configuration that references an unknown class name ...
- linux网络配置相关命令、虚拟网络接口eth0:0
网络接口(interface)是网络硬件设备在操作系统中的表示方法,比如网卡在Linux操作系统中用ethX,是由0开始的正整数,比如eth0.eth1...... ethX.而普通猫和ADSL的接口 ...
- tomcat配置虚拟目录映射
本文主要介绍web虚拟目录映射的两种常用方法及配置默认web应用的方法 一.在Server.xml中进行配置 在<Host>元素中添加子元素<Context path=" ...
- lightning mdb 源代码分析(1)
lighting mdb(lmdb) 是一个高性能mmap kv数据库,基本介绍和文档参见symas官网,本文将尝试分析其源代码结构以理解数据库设计的关键技术. 本系列文章将尝试从以下几个方面进行分析 ...