文章目录
文章内容
基于bluetooth->gattc_multi_connect示例创建工程,读懂程序,配合已有蓝牙从机设备,实现蓝牙主机一对多通信。
上篇:BLE相关的基础知识介绍
低功耗蓝牙协议栈基本介绍
低功耗蓝牙协议栈如下图所示:
协议栈由Host(主机协议层)和Controller(控制协议层)组成,并且这两部分一般是分开执行的。
配置和应用程序是在协议栈的通用访问配置文件(GAP)和通用属性配置文件(GATT) 层中实现的。
通用访问协议(Generic Access Profile)是BLE 设备内部功能对外接口层。它规定 了三个方面:GAP 角色、模式和规程、安全问题。主要管理蓝牙设备的广播,连接和设备绑定。
属性传输协议(Attribute Protocol)定义了属性实体的概念,包括UUID、句柄和属 性值,规定了属性的读、写、通知等操作方法和细节。
通用属性规范(Generic Attribute Profile)定义了使用ATT的服务框架和协议的结构,两个设备应用数据的通信是通过协议栈的GATT层实现。
GATT 服务器——为GATT 客户端提供数据服务的设备
GATT 客户端——从GATT 服务器读写应用数据的设备
从应用端角度说,我们后续涉及到的开发主要聚焦在配置和应用层,因此只针对GAP和GATT层的相关基础知识做简单说明,以便于更快地读懂程序。
通用访问配置文件(GAP)
1.概述
低功耗蓝牙协议栈的 GAP 层定义了设备以下几种状态。
Standby:低功耗蓝牙协议栈未启用的空闲状态;
Advertiser:设备使用特定的数据进行广播,广播中可包含设备的名称、地址等数据。广播可表明此设备可被连接。
Scanner:当接收到广播数据后,扫描设备发送扫描请求包给广播者,广播者会返回扫描相应包。扫描者会读取广播者的信息并且判断其是否可以连接。此过程描述了发现设备的过程。
Initiator:建立连接时,连接发起者必须指定用于连接的设备地址,如果地址匹配,则会与广播者建立连接。连接发起者在建立连接时将初始化连接参数。
Master or Slave:如果设备在连接前是广播者,则其在连接时是从机;如果设备在连接前是发起者,则其在连接后为主机。
2.GAP 抽象层
应用程序可以通过调用GAP层的API函数来实现响应的BLE功能,如广播与连接。
GAP层可以运行以下四种角色:
广播者——不可以连接的一直在广播的设备
观察者——可以扫描广播设备,但不能发起建立连接的设备
从机——可以被连接的广播设备,可以在单个链路层连接中作为从机
主机——可以扫描广播设备并发起连接,在单个链路层或多链路层中作为主机
主机角色常规操作:
◇ 初始化GAPRole参数
◇ 初始化任务并注册应用程序的回调函数
◇ 应用层调用应用函数,发送GAP命令。GAP 层发送命令给蓝牙协议栈,协议栈收到命令,执行扫描操作,并返回相应状态
◇ GAPRole 任务将协议栈与GAP有关的事件传递给应用层。
◇ 蓝牙协议栈接收到连接断开的命令并传递给GAP层。
◇ GAP 层收到命令,直接通过回调函数传递给应用层。
通用属性配置文件(GATT)
GATT 层供应用程序在两个连接设备之间进行数据通讯,数据以特征的形式传递和储存。在GATT中,当两个设备连接时,它们将给自扮演以下两种角色之一:
· GATT 服务器– 该设备提供GATT客户端读取或写入特征数据库。
· GATT 客户端– 该设备从GATT服务器读写数据。
下图显示了低功耗蓝牙服务器和客户端的关系,其中外围设备(低功耗蓝牙模块)为 GATT 服务器,中央设备(智能手机)为GATT客户端。
备注:本文要实现的蓝牙主机功能等同于上述描述的中央设备,为GATT客户端
1. GATT 特征及属性
典型特征由以下属性构成:
·特征值(Characteristic Value):此值为特征的数据值。
·特征声明(Characteristic Declaration):存储特征值的属性,位置以及类型。
·客户端特征配置(Client Characteristic Configuration):通过此配置,GATT服务器可以配置需要发送到GATT服务器的属性(notified),或者发送到GATT服务器并且期望得到一个回应(indicated)。
·特征用户描述(CharacteristicUserDescription):描述特征值的ASCII字符串。
这些属性存储在GATT服务器的属性表中,以下特征与每个属性相关联:
·句柄(Handle) -表中属性的索引,每个属性都有唯一的句柄。
·类型(Type) - 此属性指示属性代表什么,称为通用唯一标识符(UUID)。部分UUID 由BluetoothSIG 定义,其他一些UUID可由用户自定义。
·权限(Permissions) -用于限制GATT客户端访问该属性的值的权限与方式。
·值(pValue)– 指向属性值的指针,在初始化后其长度无法改变。最大大小512字 节。
以一个GATT服务端的GATT属性表为例介绍gattprofile 服务。
GATT服务是特征的集合
Gattprofile 包含以下五个特征:
·Characteristic 1 - 可以读取或写入1个字节。
·Characteristic 2 - 可以读取1个字节,但不能写入。
·Characteristic 3 - 可以写入1个字节,但不能读取。
·Characteristic 4 - 可以配置为发送到GATT客户端设备1个字节的通知,但不能读取或写入。
·Characteristic 5 - 可以读取5个字节,但不能写入。
2. GATT 客户端抽象层
GATT 客户端没有属性表,因为客户端是接收信息而非提供信息。GATT层大多数接口直接来自应用程序。
GATT层的应用(GATT客户端)
◇ 初始化GATT
◇ 注册相关信息以接收传入的ATT指示和通知
◇ 执行客户端的程序,向服务器发送数据(write)
◇ 应用程序接收并处理GATT响应:协议栈接收到响应,并将消息发送至应用层。应用层查询到GATT消息,根据接收内容,应用层实现相应功能;应用处理完成后清除消息。
程序中涉及到的命名介绍
esp_bt_controller和esp_bluedroid开头的蓝牙控制器、底层协议栈相关,应用端的项目一般不会修改到该部分程序,不做关注。
esp_ble_gap开头为GAP层相关操作,涉及广播和连接。
esp_ble_gattc开头为GATT层相关操作,涉及应用程序在连接的设备之间数据通讯。
REMOTE开头表征蓝牙从机设备相关参数(即GATT 服务器)。
esp_gattc_char_elem_t 结构体,用于存放特征元素。包含特征句柄、特征属性(读、写、notify等)、特征uuid。在GATT服务发现完成事件中使用,程序中判断是否有notify属性,有则注册一个服务通知。
esp_gattc_descr_elem_t 结构体,用于存放描述符元素。包含特征描述符句柄、特征描述符uuid。在注册服务通知完成事件中使用,写入特征描述符值(写入1,使能notfiy,即蓝牙从机设备可以自主上报数据)
欢迎关注并留言
专辑其他文章会提前发表于公众号"IT搬砖客",欢迎关注并留言。