本篇博客根据韦大仙视频,整理所得。

先上框图:

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协议各层的形象化理解的更多相关文章

  1. 第13节-BLE协议L2CAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...

  2. 第10节-BLE协议链路层(LL)

    本篇博客的学些要结合书籍<低功耗蓝牙开发权威指南,Robin Heydon著>第7章,实际上这书只是对蓝牙原版协议的简化.摘要. 回顾以前学过的<BLE协议各层的形象化理解>和 ...

  3. 第12节-BLE协议HCI层的数据格式

    学习资料: 1. 蓝牙协议core_v5.0.pdf <Vol 2: Core System Package [BR/EDR Controller volume]>的“Part E: Ho ...

  4. 第11节-BLE协议HCI层的硬件接口

    本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...

  5. 第03节-BLE协议各层数据格式概述

    本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...

  6. 第15节_BLE协议GATT层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part G: Generic Attribute Profile (GATT) 这篇文章格式比较 ...

  7. 第16节_BLE协议GAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part C: Generic Access Profile 下面这个图是BLE协议各层跟医院的各 ...

  8. 第14节_BLE协议ATT层

    下面这个图是BLE协议各层跟医院的各个科室的类比图: 跟医院类比,ATT层就是化验室,通过它可以得到各种检查结果──属性.这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由 ...

  9. 第04节-BLE协议抓包演示

    在上几篇博客中,形象的讲解了BLE各个层的作用,各个层的数据结构.本篇博客将研究BLE协议抓包.在实际开发中,有一个中央设备(central)和一个外设(Peripheral).所谓中央设备就是指它可 ...

随机推荐

  1. [LeetCode] 222. Count Complete Tree Nodes 求完全二叉树的节点个数

    Given a complete binary tree, count the number of nodes. Note: Definition of a complete binary tree ...

  2. Metasploit 常用命令手册

    Installation curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/template ...

  3. curl 用法

    背景 linux上发起http请求 使用方法 # get请求 curl "http://jwen.me/" # 获取返回的信息头 curl -i "http://jwen ...

  4. .NET Core3.0 Autofac注入

    参考地址:https://docs.autofac.org/en/latest/examples/index.html 1. nuget :Autofac.Extensions.DependencyI ...

  5. 基于Redis实现分布式定时任务调度

    项目开发过程中,难免会有许多定时任务的需求进来.如果项目中还没有引入quarzt框架的情况下,我们通常会使用Spring的@Schedule(cron="* * * * *")注解 ...

  6. C#原型模式(深拷贝、浅拷贝)

    原型模式就是用于创建重复的对象,当想要创建一个新的对象但是开销比较大或者想将对象的当前状态保存下来的时候,我们就可以使用原型模式. 创建原型 public abstract class Base { ...

  7. 实战django(一)--(你也能看懂的)注册与登录(带前端模板)

    先是具体目录:(主要是注意templates和static的位置),其中person文件夹是上一期实战的,不用理会,login是本节实战app 项目urls.py from django.contri ...

  8. Vue官方文档笔记

    1.如何创建一个Vue实例对象? var vm = new Vue({ el: "#app", //标签id 或 标签类名 data:{ //双向绑定的数据 message: &q ...

  9. GitHUB帐号申请及相关操作

    GitHUB帐号申请及相关操作 GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub.GitHub 于 2008 年 4 月 10 ...

  10. .Net FrameWork获取配置文件信息

    今天在做项目的时候需要到配置文件中读取信息,之前自己并没有操作过,今天算是完成自己的一个心愿.读取配置文件中的信息并不难,大致思路是: 1.载入配置文件,获取配置文件的实例. 2.获取配置文件的节点 ...