第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).所谓中央设备就是指它可 ...
随机推荐
- Apollo:微服务架构下的配置管理
问题背景 在实际工作中,我们的开发环境,测试环境,生产环境对应的 Mysql 数据库,Redis 这些信息都不一样,每个环境都有对应的一套配置,在 Spring Boot 中我们通常会编写多个配置文件 ...
- Mac:输出phpinfo的信息
输出phpinfo的信息1.echo '<?php phpinfo(); ?>' | php 2>&12.php -a 进入Interactive shell模式然后:pri ...
- nodejs调用cmd命令
使用 child_process.exec 实现 child_process即子进程可以创建一个系统子进程并执行shell命令,在与系统层面的交互上非常有用 NodeJS子进程提供了与系统交互的重要接 ...
- mysql的简介和使用
mysql简介 数据的所有存储,检索,管理和处理实际上是由数据库软件--DBMS(数据库管理系统)完成的 mysql是一种DBMS,即它是一种数据库软件 mysql工具 mysql是一个客户机-服务器 ...
- 准备环境 安装window10+ubuntu18双系统
记录一下这次双硬盘安装windows10和Ubuntu18的过程 1通过u启通制作pe,并将windows的镜像放入到u盘中 2电脑通过u盘启动,进入pe 3在pe中将两块固态硬盘制作为guid格式, ...
- Spring69道面试题
Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...
- 使用docker安装gitlab,两台电脑gitlab库相互迁移
原文来自合伙呀 https://hehuoya.com/2019/09/30/gitlab-docker/ Docker for gitlab brew cask install docker do ...
- springboot 获取到的inputStream为空的问题
springboot在接收http请求的时候读取的request的inputStream,造成我们想自己读取inputStream的时候发现inputStream已经无法读取了. 为了读取inputS ...
- HyperLogLog算法分析及其应用
HyperLogLog 算法的原理讲解以及 Redis 是如何应用它的 探索HyperLogLog算法(含Java实现) 神奇的HyperLogLog算法 Sketch of the Day: Hyp ...
- IScroll在某些win10版本下的奇怪问题
客户的电脑环境: win10版本 企业微信: useragent mozilla/5.0 (windows nt 6.2; wow64) applewebkit/537.36 (khtml, like ...