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

对于BLE系统,它分为上下两块。上面那一块,我们称为host主机。下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片。

对于host这一块,它运行于linux android 单片机 ,它是纯软件的概念。它和蓝牙芯片之间通过usb口或串口来传输数据。那么对于host和controller中的各个层,它们是如何表示数据的呢?本篇博客就来讨论这个问题。

例子1:

打包:

甲公司A1想给乙公司A2'发送一封信,于是甲公司A1就构造了一个数据包:for A2',然后它将数据包传给下面的部门B,下面的部门B会将这个数据包发给乙公司。注意部门B中的人并不认识乙公司A部门的人,它只知道乙公司有这样的一个部门。那怎么办呢?

它给传下的数据包 for A2'加上一个头部,于是变为了 A for A2'。对于甲公司B部门中的人它不知道数据包是给乙公司A2'的,它只知道数据包要给乙公司的A部门。

解包:

A for A2'这样的一个数据包通过某种方式就传到了乙公司的B部门。这个B部门的人一看到数据包有A这个头部,就知道数据包是发给A
部门的,于是就将for A2'的数据包取出来,由A部门的派件员根据里面的信息发给A2',这样A2'就收到了甲公司中A1发给它的数据包了。

在整个过程中,B部门的人根本没有分析数据包中的内容 即:for A2'。

甲公司B部门的人与乙公司B部门的人也有交流啊,比如说甲公司的B3想发一个数据包给乙公司的B2',该怎么发呢?
首先甲公司的B3构造出一个数据包 for B2',然后再给它加上一个头部B,由快递员发给乙公司的B部门。B部门一看这个数据包就是发给本部门的人,于是它就直接看了看这个数据包,哦是发给B2’,于是就发给了B2'
通过对公司中上下部门传送数据包的流程大概能知道A、B部门数据包的格式。看下面的图:

打包:

有上下三层,每层数据包的格式有什么特点呢?
A层:数据的格式最简单,它不需要帮别人去干活,只需要表明自己的数据是什么类型以及数据本身就可以了。
比如说A层中有两类数据:typeA1和typeA2。只需要在头部中表明这个数据是A1还是A2即可。然后后面紧跟数据本身就可以了。最终数据的格式为A1/A2 data for A1/A2。然后将委托B层帮它进行传输,意味着B层的数据来源有两种可能:从A层传下来的数据和它自己这一层的数据。它既要帮A层传输数据,也要传输自己的数据。那么在B层的数据格式里面肯定有A/B这样的一个结构体来分辨这个数据是来自于A层的还是自己这一层的。如果来自于A层,那么在类型的后面直接跟着上层传来的数据data for A即可。如果是自己这一层的,首先后面先跟数据的类型是B1还是B2,然后再跟上要发送的数据data for B1 or B2。

B层将要发送的数据包再委托给C层,因此对于C层来说,数据来源有两种可能:从B层传下来的数据和它自己这一层的数据。它既要帮B层传输数据,也要传自己的数据。那么在C层的数据格式里面肯定有B/C这样的一个结构体来分辨这个数据是来自于B层的还是自己这一层的。如果来自于B层,那么在类型的后面直接跟着上层传来的数据data for B即可。如果是自己这一层的,首先后面先跟数据的类型是C1还是C2,然后再跟上要发送的数据data for C1 or C2 。

解包:

对方在收到数据包的时候,首先根据头部信息进行解析,它是发给哪一层的,确定了哪一层之后,它再去确定数据的格式。比如说数据是发给B层的,然后再去解析数据的类型是B1还是B2。

看一下传输线路上数据的格式:

这三种数据格式就是在传输线路上实际传输的数据,这些数据首先要传给C层,由C层进行处理,它是如何进行处理的呢?
首先分辨头部,这头部有两种可能:C层和B层。如果发现这个头部是C层本身的,它就可以解析后续的数据。
如果它发现这个数据是要发给B层的,那么它就将数据直接交给上一层B。交到B层之后,它也会分辨头部,这头部也有两种可能:B层和A层。如果它发现这个头部是B层本身的,那么它就可以解析后续的数据。如果它发现这个数据是要发给A层的,那么它就将数据直接交给A层,数据到达A层之后,由它自己再去解析。

在解包的过程中,首先由C层进行解析,然后再由B层进行解析,最后由A层进行解析。
对于BLE协议里面,各个层次的数据结构与上图是非常类似的。下面这张图描述了BLE各个层次数据的格式:

在上面这张图中,只列出了ATT层、L2CAP、LL层这三层。对于上面的GAP、GATT层,它们是依赖于下面的层来实现的,它们本身并没有什么数据格式。对于最底下的物理层,它是与无线电相关的,我们并不关心。

首先看一下,LL层。对于LL层,它要发出两种类型的数据:一种是advertising数据,一种是data channel数据。
所谓data channel数据就是两个设备建立连接之后发送的数据。那么怎么分辨是广播数据,还是连接之后的数据呢?
它利用访问地址进行区分,就是图中的Random和0x8E89BED6。对于广播数据,它的值永远是0x8E89BED6。当对端的链路层在收到一个数据包时,它首先去分辨头部,如果发现等于0x8E89BED6的话,就知道了这是一个广播包。

对于广播包,它有很多种,那我如何分辨它是哪一种广播包呢?这里面又有一个头部type,用来分辨是哪一个广播包。然后跟着是广播数据。
对于Data channel ,它如何表示某个设备呢?用一个随机数来表示某一个设备,那这个随机数是怎么确定的呢?

在BLE系统里面,一个设备A和设备B一旦建立了连接,就会分配一个Access Address,这是一个随机数。注意,这个连接一旦断开,再次建立连接,它会分配另外一个随机数。

这个随机数各不相同,可以认为该随机数代表一个连接。那么就可以利用随机数来表示已经建立连接的对端设备。因此就可以用Random来表示对端已连接的设备。

后面跟着就是发给对端设备的数据了,这个数据的来源有两种可能:LL层自己本身或上层的L2CAP层。那么它是如何区分这个数据是LL层的还是上层的L2CAP层的?

在数据包中使用LLID来分辨数据来源(对于打包是来源,对于解包就是目的地了)。如果来自于本层LL层,那么LLID=11b,本层的数据有很多类型,比如说REQ、RSP、IND。那么如何分辨是哪种类型呢?在数据本身里面有一个opcode,根据opcode来分辨数据的类型。
如果数据来自于L2CAP层,LLID=10b或01b,后面跟着的就是来自于上层的数据。

对于L2CAP层,数据来源有两种可能:本层的数据或ATT层的数据。它如何去区分是本层的数据还是上层传递给它的数呢?在该层引入了一个channel ID,使用channel ID来分辨是本层的数据还是上层的数据。当channel ID=04时,传输的是ATT层的数据;当channel ID=05/06时,传输的是本层的数据。本层的数据又有非常多的类型,它如何分辨传递的是哪一些呢?它是利用code来进行分辨是哪些L2CAP层数据。
对于ATT层,这一层本身也有很多种数据,它是如何分辨的呢?它引入了一个opcode。注意在这一层中它不需要再传递上层的数据了,因此就不需要加区分哪一层的头部了。

将上图中各层数据的格式组合起来,就得到了在空中传输的数据的格式了,如下图所示:

这些数据通过无线电传到对端的LL层,就开始了解包的过程。如果LL层能处理的话,它就进行处理,否则它会转交给上一层。
首先分辨Access Address,如果发现Access Address =0x8E89BED6,这是一个广播包,它是可以处理的,可以看看里面的数据是什么东西。如果发现Access Address为某个随机数,此时就需要区分哪一层了。
当LLID=11b时,由LL层进行处理;当LLID=10b/01b时,LL层无权处理,需要转交到L2CAP层进行处理。

L2CAP层如何进行处理呢?

首先取出Channel ID,如果Channel ID =05/06,它就需要处理后续的数据了。如果Channel ID=04,它无权处理,需要交给ATT层进行处理。

第03节-BLE协议各层数据格式概述的更多相关文章

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

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

  2. 第13节-BLE协议L2CAP层

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

  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. 第02节-BLE协议各层的形象化理解

    本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...

  6. 第15节_BLE协议GATT层

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

  7. 第14节_BLE协议ATT层

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

  8. 第16节_BLE协议GAP层

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

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

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

随机推荐

  1. Linux性能优化实战学习笔记:第三十九讲

    一.上节回顾 上一节,我带你学习了 tcpdump 和 Wireshark 的使用方法,并通过几个案例,带你用这两个工具实际分析了网络的收发过程.碰到网络性能问题,不要忘记可以用 tcpdump 和W ...

  2. 从Java官网下载最新的文档(包含API文档)

    Java学习资料(适合c转java的同学): Java中带包(创建及引用)的类的编译 - 小明快点跑 JAVA 对象引用,以及对象赋值 - 飘来荡去. Java官网下载页:https://www.or ...

  3. LOJ 6240. 仙人掌

    我尽力写一篇比较详细的题解.... LOJ 6240. 仙人掌 我先来给你安利一个题 [BZOJ3451]Tyvj1953 Normal (DSU/点分治+NTT/FFT) 同样的,我们计算每一个点对 ...

  4. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  5. linux 修改oracle的字符集

    select   userenv('language')   from   dual; 命令可以查看服务端的使用的字符集. ssh登录,切换到oracle用户 切换用户命令:su -oracle 之后 ...

  6. PyQt5笔记之菜单栏

    目录 菜单栏 创建单层菜单 创建多层菜单 右键打开菜单 官方菜单实例 菜单常用方法 菜单栏 创建单层菜单 import sys from PyQt5.QtWidgets import QApplica ...

  7. 用Java编程能给物联网(IoT)带来什么优势与不同?

    用Java编程能给物联网(IoT)带来什么优势与不同? 这是一个不太容易回答的问题,也是一个适合拿出来与大家讨论的一个话题~首先需要聊聊物联网硬件与嵌入式设备有什么不同.嵌入式设备通常是一个软件一体的 ...

  8. python笔记 利用python 自动生成条形码 二维码

    1. ean13标准条形码 from pystrich.ean13 import EAN13Encoder encode = EAN13Encoder(') encode.save('d:/barco ...

  9. 安卓 apk 嵌入H5页面只显示部分

    安卓 apk 嵌入H5页面只显示部分(有空白页出现) 解决方案 没有加载的是js部分,需要在安卓那边加上一串代码 webView.getSetting().setDomStorageEnabled(t ...

  10. 出师表(ENGLISH) 强烈打call啊~王洛勇是什么神仙英语

    臣亮言:先帝创业未半而中道崩殂, Permit me to observe: the late emperor was taken from us before he could finish his ...