《ESP32从0到1》之:蓝牙一对多主机(上)


文章内容

基于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搬砖客",欢迎关注并留言。

  • 46
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT搬砖客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值