第02节-BLE协议各层的形象化理解
本篇博客根据韦大仙视频,整理所得。
先上框图:
ATT层
从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义。类比的在BLE
协议栈里面,ATT定义了各种属性、属性的操作方法,但是这些属性有什么作用,能给用户提供什么服务,它并不知道。举例如下:
假设有两个蓝牙设备,一个是手机,一个是手环,此手环戴在手上可以监测心跳。
在ATT这一层,手环提供数据,它是一个服务器。另一边的手机从手环获取数据,它是一个client.
在手环服务器这边,它定义了属性、属性的格式以及属性的方法,还有一些机制通知、指示、确认。
在手机客户端这边,它肯定定义了方法,可以去查询、获得、读、写属性。还有一些机制:请求、响应、命令
从这可以看出,ATT层利用这6中机制来查询、读写那些属性。
GATT层
前面已经说过,在ATT层中定义了很多属性,但是它不知道这些属性组合起来是什么含义。这需要更上一层来确定那些属性能提供什么服务。
GATT这一层的关键词是服务,来看一个例子。
https://blog.csdn.net/caodaxia/article/details/78567996,描述了一个真实的蓝牙设备,里面有24个属性,这24个属性如何组合起来提供服务呢?
由GATT这一层来定义的。在这一层,它定义了服务的格式(即这个服务里面应该包含哪些属性,这些属性应该如何排列)。有了服务之后,客户端手机这边如何使用这些服务呢?
在客户端手机这边需要定义如何发现服务,如何发现服务里面的特性,读写服务里面的特性。比如说心跳服务,如何去获得那个心跳值。
在服务器这边还可以定义如何主动去通知客户端我这边的值发生了变化。简单的说,GATT的作用就是定义服务,实现服务,提供访问服务的方法。
在上篇博客中,那位张三医生需要通过检验室获得眼科中心的检验结果。他综合判断这些结果,才能提供服务。
同样GATT层也是这样的,GATT想去获得某个服务,它需要ATT来读写那些属性,才能实现那些服务。GATT里面的那些方法,比如说发现服务、发现特性、读写特性,这些动作都要使用ATT 的request、response、command等机制来操作那些属性。GATT严重依赖于ATT,它只不过是在ATT的基础上综合了那些属性,提供了一个服务的概念。
L2CAP层
再来看一下L2CAP层,类比于医院的结构,它是收发室。收发室里面的人是医院的内部员工,它可以在医院内部来传动包裹。
客户端手机想去读取某个属性,它需要利用ATT这一层来发起请求,请求的数据需要经过L2CAP层以及下面的几层到达服务端的L2CAP层。
服务端L2CAP这一层,需要把请求的数据发给ATT层。
数据的来源有那么多,L2CAP层如何标识数据的来源呢?
在L2CAP层引入了一个channel的概念。它使用channel这个概念来标识数据的来源或目的地。
HCI层
之前提到对于蓝牙芯片,一般来说它和arm板通过串口或usb口等等接口相连。L2CAP层需要把数据通过串口或usb口传给蓝牙芯片。
在这个地方又引入了一层HCI层,HCI层用来描述从L2CAP传过来的数据如何通过串口或usb口传给蓝牙芯片。
在这里还要引入一个概念,从L2CAP传过来的数据包可能很大,此时就需要分段,把经过分段的数据传给LL层。
同样的道理,这些分段的数据由LL层传到L2CAP层时,还需要将数据合并。分段与合并有可能是在L2CAP中做的,也有可能是在HCI中做的,这并不重要。
LL层
现在来看一下LL层,在L2CAP那里由channel ID来表示这个数据在内部里面分发给谁。此时假设数据到达了芯片这里,问题来了,这个芯片要把数据发给哪个设备。
在我们的示意图中只有两个蓝牙设备,在真正的系统里面可能有许多蓝牙设备,那么LL层要把数据发给谁?
在LL层这里重要的概念就是访问地址。这些数据是作为一个广播包发送给所有的设备呢?还是作为一个数据包只发送给某一个设备。此时就需要在数据包前面加上一个访问地址。就相当于快递公司帖上那个快递单号一样,以表明数据要发给哪一栋大楼。此处的大楼就相当于设备,在设备里面再次将数据分发传达。
PHY层
LL层将数据加上了访问地址,这些数据要通过无线发送器(PHY)发送出去,另一端的无线接收器(PHY)接收数据,解码之后再将数据上传。
PHY层就相当于一个司机,司机的开车技术要好,这条路不通要换另外一条路。对于蓝牙设备来说,在物理层这里它使用了跳频技术。
举个例子:深圳有两个比较出名的电台,105.7 106.2
在听广播时,如果频率为105.7的电台被干扰了,就要换到106.2频率的电台。这就是所谓的跳频。
GAP层:
对比医院的结构,病人到达医院之后会进入大堂,在大堂里面按流程确定科室、挂号。同样在GAP层这里,定义了一些流程,必须根据流程来发现设备、连接设备才可以使用后续的服务。如何去发现设备、连接设备呢?一般来说,会直接使用LL层提供的功能去发出广播包来发现设备、连接设备。
总结如下:
Host(纯软件的概念) (跟医院的功能简单类比)
GAP: Generic Access Profile, 通用访问规范 (大堂: 按指定流程确定科室、挂号 <==> 发现设备、连接设备)
GATT: Generic Attribute Profile, 通用属性规范 (医务室: 为病人提供服务 <==> 也是提供服务, 有哪些服务, 服务由哪些属性组成)
ATT: Attribute Protocol, 属性协议 (检验室: 提供检查结果, 给医生综合后由医生判断 <==> 提供属性及访问方法, GATT把这些属性组合起来构成服务)
L2CAP: Logical Link Control And Adaptation Protocol, (收发室: 收发包裹(包裹来自各科室) <==> 标记/识别数据来自哪个channel, 转发)
-----------------------------HCI(Host Controller Interface, 主机/控制器接口)-----------------------------
Controller(一般来说是一个芯片):
LL: Link Layer, 链路层 (快递驻点: 贴快递单 <==> 确定是广播包还是数据包(发给谁),加上Access Address)
PHY: Physical Layer, 物理层 (快递员: 运输, 此路不通就另换一条 <==> 无线收发器,传输, 跳频)
第02节-BLE协议各层的形象化理解的更多相关文章
- 第13节-BLE协议L2CAP层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...
- 第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这一块,它运 ...
- 第15节_BLE协议GATT层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part G: Generic Attribute Profile (GATT) 这篇文章格式比较 ...
- 第16节_BLE协议GAP层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part C: Generic Access Profile 下面这个图是BLE协议各层跟医院的各 ...
- 第14节_BLE协议ATT层
下面这个图是BLE协议各层跟医院的各个科室的类比图: 跟医院类比,ATT层就是化验室,通过它可以得到各种检查结果──属性.这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由 ...
- 第04节-BLE协议抓包演示
在上几篇博客中,形象的讲解了BLE各个层的作用,各个层的数据结构.本篇博客将研究BLE协议抓包.在实际开发中,有一个中央设备(central)和一个外设(Peripheral).所谓中央设备就是指它可 ...
随机推荐
- 【转】jsp 页面 按回车键 触发事件
转载: https://blog.csdn.net/ludongshun2016/article/details/59536779. 第一种: <script type="text/J ...
- C语言实现五子棋
可以称得上史上最简单的五子棋版本了. 可以使用curses库来改进页面和下棋方式. 并且对于输入的坐标没有进行鉴别,如果输入的坐标超过棋盘大小,就会段错误退出. 我改进了一点,但是还是没有完全避免这个 ...
- 这些个适合oier的网站丫太有趣了吧(不定期更新中)(update.2019年11月1日)
//部分来源于:Sophon 的博客 .Smoggy 的博客.lahlah 的空间. //大佬大佬%%%↗↗↗ oier必备!!!(你值得拥有d=====( ̄▽ ̄*)b) 骗分导论 - Vijos V ...
- 如何编写一个Systemd Service(转)
转自 https://segmentfault.com/a/1190000014740871 0x01 什么是Systemd Service Systemd 服务是一种以 .service 结尾的单元 ...
- python之函数filter、reduce
---恢复内容开始--- 一.filter函数 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 该接收两个参数,第一个为函数,第二个为序列,对序列中每个元 ...
- 干货最新版 Spring Boot2.1.5 教程+案例合集
最近发了一系列的 Spring Boot 教程,但是发的时候没有顺序,有小伙伴反映不知道该从哪篇文章开始看起,刚好最近工作告一个小小段落,松哥就把这些资料按照学习顺序重新整理了一遍,给大家做一个索引, ...
- Redis-2-五种基本类型及相关命令
目录 1.字符串类型:string 1.1 命令 1.2 实践 2.散列类型:hash 2.1命令 2.2 实践 3.列表类型:list 3.1 命令 3.2 实践 4.集合类型:set 4.1 命令 ...
- Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理
Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理 本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 ...
- jQuery.form 上传文件
今年大部分是都在完善产品,这几天遇到了一个问题,原来的flash组件不支持苹果浏览器,需要改.在网上搜了下,看到一个jQuery.form插件可以上传文件,并且兼容性很好,主要浏览器大部分都兼容,插件 ...
- QQ互联,填写回调时注意事项
今天在做QQ登录接口的时候,填写回调地址的时候,竟然出现了诡异的事情. 我的回调地址我直接填的域名,也申请通过了.但是在做开发地时候,一直提示这蛋疼的 redirect uri is illegal ...