03 BLE协议各层数据格式概述

23 篇文章 28 订阅

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

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值