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

对于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. 8.11 NOIP模拟测试17 入阵曲+将军令+星空

    T1 入阵曲 前缀和维护可以得60分 f[x1][y1][x2][y2]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];  O(n4) ...

  2. Asp.Net Core 减少Controller获取重复注入对象

    原文:Asp.Net Core 减少Controller获取重复注入对象 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012770274/art ...

  3. 远程文件传输命令•RHEL8/CentOS8文件上传下载-用例

    scp协议 scp [options] [本地用户名@IP地址:]file1 [远程用户名 @IP 地址 :] file2 options: -v 用来显示进度,可以用来查看连接,认证,或是配置错误. ...

  4. 【08月01日】A股滚动市净率PB历史新低排名

    2010年01月01日 到 2019年08月01日 之间,滚动市净率历史新低排名. 上市三年以上的公司,2019年08月01日市净率在30以下的公司. 来源:A股滚动市净率(PB)历史新低排名. 1 ...

  5. rocketmq常用命令整理

    1. 启动namesrv和borker sh /opt/alibaba-rocketmq/bin/runserver.sh com.alibaba.rocketmq.namesrv.NamesrvSt ...

  6. Go - chan 通道

    概述 原来分享的基础语法的时候,还未分享过 chan 通道,这次把它补上. chan 可以理解为队列,遵循先进先出的规则. 在说 chan 之前,咱们先说一下 go 关键字. 在 go 关键字后面加一 ...

  7. vins_fusion学习笔记

    Vins-Fusion源码:https://github.com/HKUST-Aerial-Robotics/VINS-Fusion 摘要 应项目需要,侧重学习stereo+gps融合 转载几篇写的比 ...

  8. Hbase Filter之FilterList

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/7098138.html 转载请注明出处 我们知道Hbase的Scan经常需要用到filter来过滤表中的数 ...

  9. Turbo码基本框架

    1. 基本原理 1.1 定义 1.2 分量码设计 2. 编码方法 2.1 交织器的设计 2.2 分量编码器 2.3 删余矩阵及复用 3. 译码方法和算法 3.1 迭代译码 3.2 MAP类算法 3.3 ...

  10. Portainer容器可视化管理工具使用文档

    本文内容 主要介绍下Portainer的Docker使用方式,基于当前最新版v1.22.1,使用Docker的本地部署,并连接另一台服务器进行测试,更多请参考官网https://www.portain ...