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


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

    对于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层进行处理。





  • 相关阅读:
    day33-1 线程队列
    day32-4 GIL全局解释锁
    day32-3 阻塞非阻塞同步异步&异步回调
    day32-2 线程池与进程池
    day32-1 事件Event
    Chrome设置--disable-web-security解决跨域问题
    去除系统部分属性触摸是出现的色值
    初始化一个React项目
    ## normalize.css 中文版
    vue组件的3种书写形式
  • 原文地址:https://www.cnblogs.com/-glb/p/11617633.html
Copyright © 2020-2023  润新知