第13节-BLE协议L2CAP层
学习资料:官方手册
Vol 3: Core System Package [Host volume]
Part A: Logical Link Control and Adaptation Protocol Specification
建议先复习《BLE协议各层的形象化理解》,下面是我们之前用来类比的医院结构图:

下面这个图是BLE协议各层跟医院的各个科室的类比图:

Controller就是快递公司,它知道把数据发给对方哪一个设备,但是它不能进入对方内部。
L2CAP是“收发室”,它熟知Host的内部结构。
回顾上一节内容,Host和Controller之间的数据有命令(Command)、事件(Event)、ACL数据等等。这里的ACL数据就是想通过controller发给对方设备的数据,ACL数据就是要传送的包裹。那么ACL数据的格式是怎样的呢?

1. 发送数据时,它知道把数据的给对端Host的哪一层:填入CID
2. 接收数据时,它知道把Controller发来的数据转发给Host的哪一层:根据CID转发
既然说要传送的数据是由L2CAP层来构建的,那么就看一下L2CAP的数据格式。
一、L2CAP层数据格式:

在BLE中,可用的channel ID如下图:

上表中的channel,我们一般只需要关注4、5、6。
Channel 4用于传输ATT层的数据,Information payload的格式以后再说;
Channel 5被称为“信令信道”,用于传输一些控制信息,比如“更新连接参数”;
Channel 6用于传输SM层的数据,Information payload的格式以后再说。
注意:对于不同的channel ID,它的information payload是不一样的。本节着重看channel 5的information payload.
1.1 信令信道
Channel 5被称为“信令信道”,有3类数据:
a. 命令:Command
b. 命令拒绝:Command Reject
c. 响应:Response
设备A给设备B发送Command,设备B可以回复Command Reject表示拒绝,或是Response。
这3类数据的格式都是一样的:

Code表示是哪一个命令/响应;Identifier用来匹配一发一收的数据:设备A发送command时会设置Identifier,设备B响应时也要设置Identifier为同一个值。
二、L2CAP层数据传输过程(Fragmentation,分片):
应用程序通过L2CAP传送数据给对方,不应该限制数据包的大小,但是蓝牙控制器是使用单片机来实现的,它里面的内存是有限的,较大的数据包传进来,它的内存就不够用了。因此L2CAP传输数据时,如果数据包很大,应该把数据拆分成一个个小包,然后依次发给蓝牙控制器,再由蓝牙控制器发给对方,对方蓝牙控制器收到一个个小包后直接给host,再由host将小包组合起来。
注意:数据包的拆分和组装都是在host这一层做的,它不会放到controller中去做,毕竟controller里的资源有限。对于不同的蓝牙协议栈,有的是在L2CAP拆分和组装,有的是在HCI层进行的拆分和组装。反正都是在host这一端去做的。
1. 包很小,不同拆分,可以一次性传送出去。

1)channel ID表示要传送给对端设备的哪个channel(4,5,6中的哪一个?)
问题:它在哪里表示对端设备呢?在L2CAP这一层没有发现
2)在HCI这一层,会在包(黄色区域)的前面加上一个头部,头部中有个handle,就代表了对端的设备。头部中的PB表示起始包,length表示L2CAP整个数据包(即黄色区域部分,这里面有length、channel ID、以及数据本身)的大小。
3)HCI将数据构造好了之后,会通过串口或usb口把构造的新包传给控制器。
4)LL层在收到数据后,会将里面真正的数据抽取出来。这个数就是来自L2CAP层的数据。然后它也会构造一个头部,根据HCI层传入的handle得到access address(代表一个连接,也就是对端的设备), 它还会根据HCI中的PB构造一个header,header中的LLID设为10b,也就是代表了起始包,还会根据HCI中length构造header中的length。
5)整个LL层构造的数据包就会通过无线信号发送给对端设备。
以上就是对L2CAP层中一个小包的处理过程。
2. 包不可以一次性传送出去。

L2CAP的包很大,那么这个打包就会拆分成很多小包。在该例中将其拆分成两个小包,前面的那个小包和上面的过程是一样的,作为一个起始包发送出去的。后面的蓝色小包呢?它的发送过程也和前面类似,只不过它是作为延续包发送出去的
参考代码:
l2cap_send_le_signaling_packet (src\l2cap.c)
hci_send_acl_packet_buffer (src\hci.c)
hci_send_acl_packet_fragments (src\hci.c)
att_write_request (src\ble\gatt_client.c)
l2cap_send_prepared_connectionless (src\l2cap.c)
hci_send_acl_packet_buffer (src\hci.c)
hci_send_acl_packet_fragments (src\hci.c)
三、L2CAP层数据接收过程(Recombination,重组):
与上述Fragmentation过程相反,L2CAP通过HCI层得到起始包、延续包的,重组成一个L2CAP包。
Host通过HCI从Controller得到ACL数据后,从这里开始处理(btstack-master\src\hci.c):

Acl_handler函数负责重组L2CAP包。
1. 起始包的数据里含有length,总长度=length+4(length是infomation payload的长度,4表示头部(length 和channel ID))。注意这个length在起始包中会原原本本的传送给对方设备。
2. 对端设备接收到起始包后,可以计算出总长度
3. 对端设备累加起始包、延续包的长度,等于总长度时就表示收到了完整的包
第13节-BLE协议L2CAP层的更多相关文章
- 第10节-BLE协议链路层(LL)
本篇博客的学些要结合书籍<低功耗蓝牙开发权威指南,Robin Heydon著>第7章,实际上这书只是对蓝牙原版协议的简化.摘要. 回顾以前学过的<BLE协议各层的形象化理解>和 ...
- 第12节-BLE协议HCI层的数据格式
学习资料: 1. 蓝牙协议core_v5.0.pdf <Vol 2: Core System Package [BR/EDR Controller volume]>的“Part E: Ho ...
- 第11节-BLE协议HCI层的硬件接口
本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...
- 第03节-BLE协议各层数据格式概述
本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...
- 第02节-BLE协议各层的形象化理解
本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...
- 第16节_BLE协议GAP层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part C: Generic Access Profile 下面这个图是BLE协议各层跟医院的各 ...
- 第15节_BLE协议GATT层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part G: Generic Attribute Profile (GATT) 这篇文章格式比较 ...
- 第14节_BLE协议ATT层
下面这个图是BLE协议各层跟医院的各个科室的类比图: 跟医院类比,ATT层就是化验室,通过它可以得到各种检查结果──属性.这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由 ...
- 第04节-BLE协议抓包演示
在上几篇博客中,形象的讲解了BLE各个层的作用,各个层的数据结构.本篇博客将研究BLE协议抓包.在实际开发中,有一个中央设备(central)和一个外设(Peripheral).所谓中央设备就是指它可 ...
随机推荐
- Centos 7 LAMP+wordpress
一.简介 LAMP--->Linux(OS).Apache(http服务器),MySQL(有时也指MariaDB,数据库) 和PHP的第一个字母,一般用来建立web应用平台. 它是 ...
- arduino (2) 浊度传感器
z https://detail.tmall.com/item.htm?id=601391726801&spm=a1z09.2.0.0.60082e8dMiX0LM&_u=e1qf7b ...
- 2019 SDN上机第五次作业
1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解,包括但不限于: 描述官方教程实现了一个什么样的交换机功能? 实现将接收到的数据包发送到所有端口 控制器设定交换机 ...
- Paper | Model-blind video denoising via frame-to-frame training
目录 故事 本文方法 流程 训练 实验 发表在2019年CVPR. 核心内容:基于Noise2Noise思想,这篇文章致力于无监督的视频盲去噪:是的,连噪声样本都不需要了. 这篇文章写作和概括太棒了! ...
- hive中order by、distribute by、sort by和cluster by的区别和联系
hive中order by.distribute by.sort by和cluster by的区别和联系 order by order by 会对数据进行全局排序,和oracle和mysql等数据库中 ...
- 【Java语言特性学习之五】版本差异新特性
- Qt 编译配置相关总结
MinGW 与 MSVC 编译的区别 我们可以从 Qt 下载页面看到两种版本编译器,如下图: 我们来对比一下这两个编译器的区别: MSVC 是指微软的 VC 编译器. MinGW 是 Minimali ...
- JeeSite | 数据权限应用
中午吃饭时看了一下陆毅版的<三国>,刚好看的是蜀军缺粮,诸葛亮让王平去劫司马懿的粮.司马懿看蜀军用木牛流马运量很方便,就抢了蜀军的木牛流马仿制了一批,结果司马懿用它运粮时,被王平冒充司马懿 ...
- c# Equal函数 and 运算符'==' (原发布 csdn 2017年10月15日 20:39:26)
1.==.!=.<.>.<= 和>= 运算符为比较运算符(comparison operator).C#语言规范5.0中文版中比较运算符的描述如下: 2.通用类型系统 3.值类 ...
- WPF通过不透明蒙板切割显示子控件
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Backspace110/article/ ...