zoukankan      html  css  js  c++  java
  • 第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层进行处理。





  • 相关阅读:
    java 在线网络考试系统源码 springboot mybaits vue.js 前后分离跨域
    springboot 整合flowable 项目源码 mybiats vue.js 前后分离 跨域
    flowable Springboot vue.js 前后分离 跨域 有代码生成器 工作流
    Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    java 企业 网站源码 后台 springmvc SSM 前台 静态化 代码生成器
    java 进销存 商户管理 系统 管理 库存管理 销售报表springmvc SSM项目
    基于FPGA的电子计算器设计(中)
    基于FPGA的电子计算器设计(上)
    FPGA零基础学习:SPI 协议驱动设计
    Signal tap 逻辑分析仪使用教程
  • 原文地址:https://www.cnblogs.com/-glb/p/11617633.html
Copyright © 2011-2022 走看看