分类:ble

GAP Bond Manager 和 LE 安全连接

GAP Bond Manager (GAPBondMgr) 是一个可配置模块,用于从应用程序中承担大部分与安全管理器 (SM) 协议相关的配对和绑定安全机制。GAPBondMgr 在协议栈任务的上下文中执行。

  1. 配对过程:通过 配对方法选择 中描述的方法交换密钥。
  2. 加密过程:使用步骤 1 中的密钥加密链路。
  3. 绑定过程:将密钥存储在安全闪存 (Simple Non Volatile memory, SNV) 中。
  4. 重新连接:使用存储在 SNV 中的密钥加密链路。

蓝牙核心规范版本 4.2 添加了支持 LE Secure Connections 的功能,以增强 BLE 配对过程的强度。详细描述请参见 Bluetooth Core Specification Version 5.1Security Architecture 部分 ([Vol 1], Part A, Section 5.1)。以前版本 (4.1 和 4.0) 使用的方法定义为 LE Legacy Pairing。主要区别在于 Secure Connection 使用椭圆曲线 Diffie-Hellman (ECDH) 密码术,而 LE Legacy Pairing 则不使用。

以下是核心规范中定义的四种配对方法,每种配对方法在 不同配对方法的 GAPBondMgr 示例 中有详细描述。

  • Just Works (LE Secure C...

ble5.0 蓝牙协议概述

从这部分开始详细介绍蓝牙协议栈功能、接口、协议栈工程关联、实现协议栈的文件和任务,该任务也作为协议栈应用的最高优先级任务。TI 采用库文件的方式作为协议栈的一个主策略,尽管如此,还是需要开发者了解协议栈各个抽象的功能和相互作用。

蓝牙 5.0 核心规范包含 LE 和 BR/EDR 两种设备类型,其中 LE 主要是设计为低功耗、小数据终端产品。BLE5.0 核心主要包含以下功能:

  • 2M Sym/s PLY 层设计(2M Symbol Rate 物理层)。
  • LE 信道选择算法 #2
  • LE 安全连接
  • LE 数据长度扩展
  • LE 隐私
  • LE LCAP 面向连接的信道支持
  • LE 链路层拓扑结构
  • LE Ping
  • 从机功能扩展
  • 连接参数请求

以上功能均在蓝牙 5.0 协议栈实现,并且可以选择编译。

如图 1 ,蓝牙协议栈包含一个 Host 和 Controller 两个逻辑实体。这种区分从经典蓝牙的 BR/EDR 就存在了,各种功能独立实现,任务配置文件和应用相关都在 Host 的 GAP、GATT 抽象层。

图1. 协议栈基础

BLE 工作在无需认证的 2.4G 免费频段,该频段广泛应用于 ISM(工业、科学、医疗)领域。BLE 通过跳频通信实现抗干扰特性,是 GFSK 调制信号,它采用 1Mbps 码元率 PHY 层设计,可以实现 1Mbps 波特率通信。BLE5.0 优化的物理层设计可以实现 2Mbps 的 PHY 层。

simple_peripheral 应用框架

本章节将详细讲解 CC2640R2F BLE5.0 的应用程序框架,我们希望您已经按照学习线路图储备了 CC2640R2F平台的软硬件架构知识 ,明白应用工程区分 App 和 Stack 工程管理。本章主要内容是围绕基于 TI-RTOS 的 App 应用程序框架。

图1. 应用程序框架图

以 simple_peripheral Demo 应用程序部分为例,包括以下内容:

  • Pre-main initialization
  • ICall
  • Simple Peripheral Task
  • Intertask Messages

main 函数包含在 IDE Startup 文件夹的资源文件 main.c 中。作为程序的入口,主要完成全局中断禁止、外设驱动初始化、电源管理、TI-RTOS 任务创建或构造、在启用 SYS / BIOS 内核调度时完成全局中断使能。main 函数不返回,将在整个项目生命周期内保留其资源。

基本 main.c 功能。

软件架构章节阐述了由于历史兼容原因会把整个应用工程区分 App 和 Stack 两个工程管理。因此,无法采用常规 API 调用和全局变量方式完成消息传递,App 和 Stack 之间的通信就需要重新考虑了。TI 引入了 ICALL 消息机制完成 App 和 Stack 独立工程管理的相互通信,接下来就着重理解原理和代码实现。

Indirect Call Framework (

Generic Access Profile (GAP)

GAP 分层负责设备建立连接的相关功能,包括设备发现、数据链路建立、终止、初始化安全管理和设备配置,参见下图 1 。

图1. GAP 分层的建立连接的示意图

在 Standby 状态,双方设备都处于未连接状态。Advertiser 尝试广播数据,Scanner 接收到广播数据后尝试进行扫描请求,并且得到扫描回复。此时 Scanner 产生连接意图,转变成 Initiator 发送连接请求,成功连接后发送广播的 Advertiser 作为 Master ,进行连接请求的 Initiator 成为 Slave。

  • Standby:复位后设备处于初始空闲状态。
  • Advertiser:设备正在通过特定数据进行广告,让任何 Initiator 设备知道它是可一个连接设备(此广告数据负载可以包含设备地址和一些其他数据,如设备名称)。
  • Scanner:扫描设备收到广告后,向广告客户发送扫描请求。广播者响应扫描响应。这个过程称为设备发现。当然扫描设备已经知道广告设备可以发起与其的建立连接。
  • Initiator:启动时,启动器必须指定要连接的对等设备地址。如果接收到与对等设备地址匹配的广告,则发起设备发送连接请求,该请求包含与广告设备连接所需的连接参数。
  • Master/Slave:当连接形成时,广播的发起者作为 Slave ,Initiator 建立者作为 Master。
  • Advertiser 进行广播

  • Scanner...

Generic Attribute Profile (GATT)

GAP 层负责连接相关的功能,GATT 主要是负责在两个已经连接的设备之间进行交互数据。GAP 层把 BLE 设备区分为主机 Master(Central)和从机 Slave(Perpherial),在 GATT 层则区分为 Server 和 Client 。客户端读取和写入存储在服务端的特征值( Characteristics )。

Server 该设备包含由 GATT 客户端读取或写入的 characteristic。

Client 从 GATT 服务器读取或写入数据的蓝牙设备。

图1. Server 和 Client

GATT 层的 Profile、Service、Characteristics、Attributes 概念一定要深入理解,因为一旦建立连接后,不管是嵌入式端还是应用端进行数据交互的都是这些概念。为了帮助理解,抽象以下包含关系:

图2. GATT 层四种概念之间的抽象包含关系

如图 2 ,一个或者多个 Characteristic 组成一个 Service。一个多个 Service 组成 Profile。Characteristic 又由多个 Attributes 组成。每个 Attribute 由包含 Handle、Type、Permissions 三个属性。

下面着重理解 Characteristic,它是数据交互的最终实体,每个特征包含以下 4 个 Attribute...

Logical Link Control and Adaptation Layer Protocol (L2CAP)

L2CAP 运行在 HCI 之上的 Host ,实现 Host 更高层(GAP、GATT、APP)和低层协议栈之间传输数据。

该层负责在 Host 和协议栈之间把交换的数据进行分割( segmentation )和重组( reassembly )以提供协议的多路处理能力。L2CAP 允许更高级别的协议和应用程序发送和接收高达 64KB(实际受限于蓝牙设备实际内存)的上层数据包(L2CAP 服务数据单元,SDU)。

图1. L2CAP 层数据传输示意图

蓝牙低功耗协议栈支持在链路层将 L2CAP PDU 分割( segmentation )和重组( reassembly )。这种分段允许 L2CAP 和构建在 L2CAP 之上的更高级协议(如属性协议 ATT )使用更大的有效负载,从而减少与较大数据传输不断拆分开销。当使用分片时,较大的数据包直接被分割成多个链路层数据包,并由对等设备的链路层重新组合。

图2. L2CAP 分割重组数据包

L2CAP PDU 的大小决定了属性协议最大传输单元( Attribute Protocol Maximum Transmission Unit ( ATT_MTU ))。默认情况下,LE 设备 L2CAP PDU 的大小为 27 字节,意味着在单个连接事件数据包可以传输的 LE 数据包的最大字节。在这种情况下,L2CAP 协议头为 4 字节,ATT_MTU...

LE Data Length Extension

数据长度扩展( LE Data Length Extension )功能允许 LE 控制器在连接状态下发送高达 251 字节的 PDU,在连接期间的任何时刻,主从设备可以协商该 PDU 大小。

对比 BLE4.0/4.1 的控制器数据通道最大有效载荷为 27 字节,使能数据扩展功能后的 BLE4.2/BLE5.0 能够达到 251 ,数据速率提高了大约 2.5 倍。

一旦建立连接,控制器将以两种可能的方式之一进行操作:

  • 如果在连接之前,PDU 大小和传输时间都被设置为默认值(即 TX 和 RX 都为 27B,328us),则 CC2640R2F 将不会发起数据长度交换命令(即 LL_LENGTH_REQ 不发送)。

    如果对等连接的主从设备发送 LL_LENGTH_REQ ,此时对等设备同样以默认大小 LL_LENGTH_RSP 回应。

  • 如果在连接之前,PDU 的大小和传输时间收发双方或者有一方不是默认值,则设备的 LE 控制器将使用 LL_LENGTH_REQ 和 LL_LENGTH_RSP 控制 PDU 协商,选择一个较大的 PDU 有效负载。

    数据长度更新可由 Host 发起或 Controller 自主执行,主机或从机可以启动该过程。

数据长度更新过程完成后,两个控制器都会根据两个参数选择新的数据长度:PDU 大小和传输时间,同时被主从设备支持的最大长度将会被选择。考虑到时间来支持不同的数...

BLE一次能传多少数据(ATT_MTU设置/LE Data扩展)

BLE 到底一包能够收发多少数据是很多开发者都会关心的。我们知道 BLE 5.0 物理层设计 2Mpbs 的码元率,实际数据传输速率远远到不了这个级别。主要原因是无法直接单次发送 1M 或者 1K 数据,必须按照我们知道的 ATT_MTU 作为最大值进行拆包发送,不断拆包的过程中导致整体蓝牙有效数据吞吐量下降。本章节,我们实用性出发研究如何究竟蓝牙一包能够发送多少数据。

以下是 GAPP Client 进行特征值写请求的完整抓包,AttValue 表示写入的值,该值的最大长度到底是多少呢?本文将详细研究并且验证。

本文的正确打开姿势,我们希望你已经仔细阅读并理解协议栈的 L2CAP,和 BLE4.2/5.0 全新支持的 LE 数据扩展功能。

在 BLE PHY 包格式由以下组成:排除 前导码、访问地址、CRC 地址 对于 BLE4.0/BLE4.1 上层协议(LL)最大可以包含 39 字节长度的 PDU(协议数据单元)。

更新后的 BLE4.2/BLE5.0 直接升级硬件将这一长度扩展到 257 ,默认了兼容 BLE4.0/4.1 还是采用了上面的 39 设计。

从蓝牙协议分层设计来看,逻辑链路层是最底层,已经正常连接的两...

pack sniffer 用以ble抓包

对于任何复杂协议的深入学习,我们都建议一个通用的学习方法,从规范->实现->抓包,规范是无关编程语言、语法文档表达,实现是各家SDK、API、源码,对于抓包则是对应实现理解规范。所以在BLE学习、研发过程抓包尤为重要。TI在这方面相比来说是做得相当好了,极大的简化了BLE的学习,熟练使用抓包工具,会大大降低蓝牙协议的技术入门槛,起到事半功倍的效果。对于蓝牙空中抓包,暂时地我们只有使用CC2540 USB Dongle。成功下载PacketSniffer直接双击安装。

成功安装PacketSniffer,我们直接插入CC2540 USB Dongle到PC,会自动安装驱动,成功安装驱动后,再设备管理器我们能够发现以下设备。

选择启动PackeetSniffer,并且选择Bluetooth Low Energy

我们将详细讲解界面功能,

  • 开始/停止抓包 自动滚轮
  • Capturing Device 当前用以抓包的的硬件设备,我们这里的为CC2540 USB Dongle
  • Radio ConfigurationAdvertising Channel 广播信道,在蓝牙概述 我们已经讲到 蓝牙40个信道保留了3个用以广播,默认广播信道会配置37、38、39全部进行广播,这里我们也可以指定某一个信道进行广播抓包。
  • Select fields 选择抓包指定协议层,指定类型显示,除非我们对协议分层和P...

SemiHosting

IAR和CCS都支持一种Semi-Hosting技术(半独立主机),这对产品早期开发的使用 printf和 System_printf 是非常方便的,轻易将调试信息打印在IDE的终端。但是一旦Semi-Hosting 使能,绝大的TI-RTOS例程在没有连接的IDE到时候不会运行,主要是因为类似 System_flush() API 需要等待IDE应答。区别其他IDE,CCS的握手机制不太一样,通过CCS编译生成的工程可以独立IDE运行。

对于Semi-Hosting,我们参考以下模型理解

本文以下CC2640R2F BLE5.0 SDK下面的 C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\examples\rtos\CC2640R2_LAUNCHXL\sysbios\hello 工程为例,介绍如何使用SemiHosting支持的System_printf用以打印调试信息。

在IAR 导入Examples已经详细讲解如何导入Examples,参考它,导入Hello 例程。在Main函数中,以下代码段实现主要功能:

对于以上代码的 System_printf("hello world\n");需要借助仿真器Debug的时候在Terminal打印。

IAR-View->Terminal I/O

CCS的Console 比较明显

Win...