未完待续……

BLE协议

Bluetooth Application

Applications

GATT-Based Profiles/Services

Bluetooth Core

(Stack)

BLE Host

ATT、GATT、SM

GAP

L2CAP

HCI(对蓝牙协议无影响)

BLE Controller

Link Layer

Physical Layer

1  Bluetooth Core(Stack)

  蓝牙核心协议,关注蓝牙核心技术的描述和规范,只提供基础的机制。

  蓝牙核心协议由Controller和Host两部分组成,在一个系统中,Host只有一个,但Controller可以有多个,如:单独的LE Controller;单独的BR/EDR Controller;单独的LE+BR/EDR Controller;在单独的BR/EDR Controller或LE+BR/EDR Controller基础上,增加一个或多个额外的AMP Controller。

1.1  Controller

  Controller实现射频相关的模拟和数字部分,完成最基本的数据发送和接收,Controller对外接口是天线,对内接口是主机控制器接口HCI(Hostcontroller interface);控制器包含物理层PHY(physicallayer),链路层LL(linker layer),直接测试模式DTM(Direct Test mode)以及主机控制器接口HCI。

1.1.1  Physical Layer

  频率选择(2402-2480MHz) + 信道选择(40) + 信道间隔(2MHz) + 调制方式(GFSK) + 数据传输速率(1Mbps)+ 接收灵敏度 + 发射功率 + 杂散辐射 + 射频容差

1、信道选择

物理信道(Physical Channel)为: F=2402+k*2MHz ,k=0,…,39,共40个信道。

Physical Channel = RF Channel

1.1.2.  Link Layer

信道分类(3+37) + 广播信道定义(37、38、39) + 数据通道分发(跳频) + 状态角色定义和切换 + 数据包校验重传

LL – Link Layer – Logic Link

  1、广播信道定义

37ch —— 2402MHz

38ch —— 2426MHz

39ch —— 2480MHz

之所以选定3个广播信道是一种权衡,少了可能会被阻塞,多了会增加功耗。3个广播信道刚好避开了WiFi的1ch,6ch,11ch,所以BLE广播的时候,不会被WiFi影响。(PS:可以人为阻塞这三个通道)

  2、数据信道切换

BLE匹配之后,LL由广播信道切换到数据信道,具体使用哪个数据信道在匹配时约定,且连接不会长期使用一个固定通道,会通过跳频技术随机有规律切换。

  3、定义状态和角色

图 2 Link Layer状态机

Standby状态是初始状态,即不发送数据,也不接收数据。根据上层实体的命令(如位于host软件中GAP),可由其它任何一种状态进入,也可以切换到除Connection状态外的任意一种状态。

Advertising状态是可以通过广播通道发送数据的状态,由Standby状态进入。它广播的数据可以由处于Scanning或者Initiating状态的实体接收。上层实体可通过命令将Advertising状态切换回Standby状态。另外,连接成功后,也可切换为Connection状态。

Scanning状态是可以通过广播通道接收数据的状态,由Standby状态进入。根据Advertiser所广播的数据的类型,有些Scanner还可以主动向Advertiser请求一些额外数据。上层实体可通过命令将Scanning状态切换回Standby状态。

Initiating状态和Scanning状态类似,不过是一种特殊的接收状态,由Standby状态进入,只能接收Advertiser广播的connectable的数据,并在接收到数据后,发送连接请求,以便和Advertiser建立连接。当连接成功后,Initiater和对应的Advertiser都会切换到Connection状态。

Connection状态是和某个实体建立了单独通道的状态,在通道建立之后,由Initiating或者Advertising自动切换而来。通道断开后,会重新回到Standby状态。

通道建立后(通常说“已连接”),处于Connection状态的双方,分别有两种角色Master和Slave:

Initiater方称作Master

Advertiser方称作Slave

  4、Air Interface Protocol

解决两个问题:不同实体间在对应状态下的数据交换,根据上层实体的指令以及实际情况负责状态之间的切换。

定义Physical Channel上收发的数据包格式:

Preamble(1 octet) Access Address(4 octets) PDU(2 to 257 octets) CRC(3 octets)

定义不同类型的PDU及其格式:

Advertising channel中Advertising有关的PDU

Advertising channel中Scanning有关的PDU

Advertising channel中Initialing有关的PDU

Data channel中LL data有关的PDU

Data channel中LL control有关的PDU

针对广播通道以白名单(White List)的形式定义Link Layer的数据过滤机制

执行广播通道上实际的packet收发操作

定义连接建立的方式及过之后的应答、流控等机制

  5、Link Layer Control

抽象出来一个链路控制协议(Link Layer Control),用于管理、控制两个Link Layer实体之间所建立的这个Connection,主要功能包括:

更新Connection相关的参数,如transmitWindowSize、transmitWindowOffset、connInterval等等(具体意义这里不再详述);

更新该连接所使用的跳频图谱(使用哪些Physical Channels);

执行链路加密(Encryption)有关的过程。

1.2.  HCI

    1. HCI作用图解

图 3 HCI作用图解

定义Host和Controller(通常是两颗IC)之间的通信协议,对理解蓝牙协议来说,是无关紧要的。向上为主机提供软件应用程序接口(API)。

    1. HCI内容

HCI逻辑上定义一系列的命令,事件;

物理上有UART,SDIO,USB,SPI接口;

实际可能包含里面的任意1种或几种。常见RF测试时,我们常使用UART发送标准的HCI指令控制Controller。

1.3.  Host

主机host是蓝牙协议栈的核心部分,GAP层负责制定设备工作的角色,SS层负责指定安全连接,Logic Link层功能非常强大,官方作用为协议/通道的多路复用,负责上层应用数据(L2CAPService Data Units,SDUs)的分割(和重组),生成协议数据单元(L2CAP Packet Data Units,PDUs),以满足用户数据传输对延时的要求,并便于后续的重传、流控等机制的实现。

1.3.1  L2CAP

提供数据封装服务,将LL提供的Logical Channel换分为一个个的L2CAP Channel,以便提供应用程序级别的通道复用。

逻辑连接控制和适配协议,Logic Link Control and Adaptation Protocol

Protocol/channel multiplexing,协议/通道的多路复用;

Segmentation and reassembly,上层应用数据(L2CAP Service Data Units,SDUs)的分割(和重组),生成协议数据单元(L2CAP Packet Data Units,PDUs),以满足用户数据传输对延时的要求,并便于后续的重传、流控等机制的实现;

Flow control per L2CAP channel,基于L2CAP Channel的流控机制;

Error control and retransmissions,错误控制和重传机制;

Support for Streaming,支持流式传输(如音频、视频等,不需要重传或者只需要有限重传);

Fragmentation and Recombination,协议数据单元(PDUs)的分片(和重组),生成符合Link Layer传输要求的数据片(长度不超过251,具体可参考5.4.1中有关的介绍);

Quality of Service,QoS的支持。

Protocol/channel multiplexing

channel multiplexing(基于通道的多路复用)—— CID,Channel ID

Protocol multiplexing(基于协议的多路复用)——只允许在BR/EDR controller中使用

1.3.2  ATT(Attribute Protocol)

负责数据检索

对上文的总结:Physical Layer负责提供一系列的Physical Channel;基于这些Physical Channel,Link Layer可在两个设备之间建立用于点对点通信的Logical Channel;而L2CAP则将这个Logical Channel换分为一个个的L2CAP Channel,以便提供应用程序级别的通道复用。到此之后,基本协议栈已经构建完毕,应用程序已经可以基于L2CAP欢快的run起来了。

    1. 特点

基于L2CAP,使用固定的Channel ID(0x004)

采用client-server的形式。提供信息(以后都称作Attribute)的一方称作ATT server(一般是那些传感器节点),访问信息的一方称作ATT client。

一个Attribute由Attribute Type、Attribute Handle和Attribute Value组成。

Attribute可以定义一些权限(Permissions),以便server控制client的访问行为

根据所定义的Attribute PDU的不同,client可以对server有多种访问方式

1.3.3  GATT(Generic Attribute Profile)

ATT之所以称作“protocol”,是因为它还比较抽象,仅仅定义了一套机制,允许client和server通过Attribute的形式共享信息。

GATT是一个profile(更准确的说是profile framework)

在蓝牙协议中,profile一直是一个比较抽象的概念,我们可以将其理解为“应用场景、功能、使用方式”都被规定好的Application。传统的BR/EDR如此,BLE更甚。上面我们讲过,BLE很大一部分的应用场景是信息(Attribute)的共享,因此,BLE协议栈基于Attribute Protocol,定义了一个称作GATT(Generic Attribute)的profile framework(它本身也是一个profile),用于提供通用的、信息的存储和共享等功能。

图 4 GATT Profile层次结构

1.3.4  SM(Security Manager)

1.3.5  GAP(Generic Access Profile)

通用访问配置文件,实现功能如下:

    1. 定义GAP层的蓝牙设备角色

Broadcaster Role,设备正在发送advertising events;

Observer Role,设备正在接收advertising events;

Peripheral Role,设备接受Link Layer连接(对应Link Layer的slave角色);

Central Role,设备发起Link Layer连接(对应Link Layer的master角色)。

    1. 定义GAP层的、用于实现各种通信的操作模式和过程

Broadcast mode and observation procedure,实现单向的、无连接的通信方式;

Discovery modes and procedures,实现蓝牙设备的发现操作;

Connection modes and procedures,实现蓝牙设备的连接操作;

Bonding modes and procedures,实现蓝牙设备的配对操作。

    1. 定义User Interface有关的蓝牙参数

蓝牙地址(Bluetooth Device Address);

蓝牙名称(Bluetooth Device Name);

蓝牙的pincode(Bluetooth Passkey);

蓝牙的class(Class of Device,和发射功率有关);

等等。

    1. Security有关的定义

2.  Application

蓝牙应用层协议,在蓝牙核心协议的基础上,根据具体的应用需求,定义出各种各样的策略,如FTP、文件传输、局域网等。

Profile是Application的代指,翻译为服务,具体有:SPP、HSP、HFP、FTP、IPv6/6LoWPAN等。

BLE——协议层次结构的更多相关文章

  1. CC2540开发板学习笔记(九)—— BLE协议简介

    一.BLE协议简介 1.协议是什么? 协议是一系列的通信标准,双方需要共同按照这进行正常数据 协议是一系列的通信标准,双方需要共同按照这进行正常数据发射和 接收.协议栈是的具体实现形式,通俗点来理解就 ...

  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. 第10节-BLE协议链路层(LL)

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

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

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

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

    本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...

  8. 蓝牙 BLE 协议学习: 001-BLE协议栈整体架构

    背景 在深入BLE协议帧之前,我们先看一下BLE协议栈整体架构. 转载自:<深入浅出低功耗蓝牙(BLE)协议栈> 架构 如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片, ...

  9. [蓝牙] 2、蓝牙BLE协议及架构浅析&&基于广播超时待机说广播事件

    第一章 BLE基本概念了解 一.蓝牙4.0和BLE区别   蓝牙4.0是一种应用非常广泛.基于2.4G射频的低功耗无线通讯技术.蓝牙低功耗(Bluetooth Low Energy ),人们又常称之为 ...

随机推荐

  1. 【Docker学习之四】Docker自定义容器镜像

    环境 docker-ce-19.03.1-3.el7.x86_64 centos 7 一.使用已有容器创建镜像-docker commit1.查看本地已有镜像 [root@node105 ~]# do ...

  2. Java中的常量池(字符串常量池、class常量池和运行时常量池)

    转载. https://blog.csdn.net/zm13007310400/article/details/77534349 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的 ...

  3. Equalizing Two Strings CodeForces - 1256F (思维)

    大意: 给定两个串$s,t$, 每次操作任选长度$len$, 分别翻转$s,t$中一个长$len$的子串, 可以进行任意次操作, 求判断能否使$s$和$t$相同. 字符出现次数不一样显然无解, 否则若 ...

  4. 【leetcode-135,62,63 动态规划】分发糖果 ,不同路径

    分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩 ...

  5. Java 中文转换拼音工具

    Java 中文转换拼音工具 /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p&g ...

  6. 利用jQuery-Word-Export导出word (含ECharts)

      写在前面的话:写博客的初衷是想把自己学到的知识总结下来,在写的过程中,相当于又把知识梳理了一遍.我坚信有输入,有输出,技术才会进步.我一般都会自己写一个小demo,测试没有问题,再进行整理. 在实 ...

  7. Entity Framework Codefirst的配置步骤

    Entity Framework Codefirst的配置步骤: (1) 安装命令: install-package entityframework (2) 创建实体类,注意virtual关键字在导航 ...

  8. 防止用户重复提交表单数据,session方式,js方式

    1. 使用session的方式创建Token令牌解决 创建一个生成令牌的工具类,在该类中有返回类的对象,生成token的方法 public class TokenUtil { /* *单例设计模式(保 ...

  9. 【转载】C#中List集合使用IndexOf判断元素第一次出现的索引位置

    在C#的List集合操作中,有时候需要判断元素对象在List集合中第一次出现的索引位置信息,此时需要使用到List集合的IndexOf方法来判断,如果元素存在List集合中,则IndexOf方法返回所 ...

  10. JavaScript_proto_和prototype到底是什么玩意

    _proto_和prototype到底有什么区别啊?是个什么东西啊? 在这里我头也比较大啊,小学语文没学好,所以组织能力比较差劲,所以尽量的咱用代码来解释吧. function too() { thi ...