在 Arduino IDE 上开始使用 ESP32 蓝牙低功耗 (BLE)

释放双眼,带上耳机,听听看~!

ESP32 不仅配备 Wi-Fi,还配备蓝牙和蓝牙低功耗 (BLE)。这篇文章是使用 ESP32 快速介绍 BLE。首先,我们将探索什么是 BLE 以及它可以用于什么,然后我们将看一些使用 Arduino IDE 的 ESP32 示例。为了简单介绍,我们将创建一个 ESP32 BLE 服务器和一个 ESP32 BLE 扫描仪来查找该服务器。

介绍低功耗蓝牙

什么是低功耗蓝牙?

低功耗蓝牙,简称BLE,是蓝牙的一种省电变体。BLE 的主要应用是少量数据的短距离传输(低带宽)。与始终开启的蓝牙不同,BLE 始终处于睡眠模式,除非在启动连接时。

这使得它消耗非常低的功率。BLE 的功耗比蓝牙低大约 100 倍(取决于用例)。

BLE-Intro

此外,BLE不仅支持点对点通信,还支持广播模式和网状网络。

请查看下表,它更详细地比较了 BLE 和蓝牙经典

Bluetooth-vs-BLE

查看图像源

由于其特性,BLE 适用于需要在纽扣电池上定期交换少量数据的应用。例如,BLE 在医疗保健、健身、跟踪、信标、安全和家庭自动化行业中非常有用。

ble-applications

BLE 服务器和客户端

使用蓝牙低功耗,有两种类型的设备:服务器和客户端。ESP32 既可以作为客户端,也可以作为服务器。

服务器宣传它的存在,因此它可以被其它设备发现,并包含客户端可以读取的数据。客户端扫描附近的设备,当它找到它正在寻找的服务器时,它会建立连接并监听传入的数据。这称为点对点通信。

BLE-server-and-client

如前所述,BLE 还支持广播模式和网状网络:

  • 广播模式:服务器将数据传输给连接的多个客户端;
  • 网状网络:所有设备都连接,这是多对多连接。

尽管可以实现广播和网状网络设置,但它们是最近开发的,因此目前为 ESP32 实现的示例并不多。

GATT

GATT 代表通用属性,它定义了向连接的 BLE 设备公开的分层数据结构。这意味着 GATT 定义了两个 BLE 设备发送和接收标准消息的方式。理解这种层次结构很重要,因为它可以更容易地理解如何使用 BLE 和编写应用程序。

GATT-BLE-ESP32

BLE服务

层次结构的顶层是一个配置文件,它由一个或多个服务组成。通常,一个 BLE 设备包含多个服务。

每个服务至少包含一个特征,或者还可以引用其它服务。服务只是信息的集合,例如传感器读数。

SIG(蓝牙特殊兴趣组)定义的几种类型的数据有预定义的服务,例如:电池电量、血压、心率、体重秤等。您可以在此处查看其它定义的服务

gatt-services

查看图像源

BLE特性

特征始终由服务拥有,它是实际数据包含在层次结构(值)中的位置。特征始终具有两个属性:特征声明(提供有关数据的元数据)和特征值。

此外,特征值后面可以跟描述符,这进一步扩展了特征声明中包含的元数据。

这些属性描述了如何与特征值进行交互。基本上,它包含可以与特性一起使用的操作和过程:

  • 播送
  • 不回复就写
  • 通知
  • 表明
  • 经过身份验证的签名写入
  • 扩展属性

UUID

每个服务、特征和描述符都有一个 UUID(通用唯一标识符)。UUID 是唯一的 128 位(16 字节)数字。例如:

55072829-bc9e-4c53-938a-74a6d4c78776

SIG(蓝牙特殊兴趣组)中指定的所有类型、服务和配置文件都有缩短的 UUID 。

但是,如果您的应用程序需要自己的 UUID,您可以使用此UUID 生成器网站生成它。

总之,UUID 用于唯一标识信息。例如,它可以识别蓝牙设备提供的特定服务。

BLE 与 ESP32

ESP32 可以作为 BLE 服务器或 BLE 客户端。在Arduino IDE 的 ESP32 BLE 库中有几个 ESP32 的 BLE 示例 。当您在 Arduino IDE 上安装 ESP32 时,默认情况下会安装此库。

 

在您的 Arduino IDE 中,您可以转到 文件>示例> ESP32 BLE Arduino并搜索 BLE 库附带的示例。

BLE-examples-arduino-ide-esp32

注意:要查看 ESP32 示例,您必须在 Tools >  Board上选择 ESP32 板。

对于在 Arduino IDE 上使用 BLE 的 ESP32 的简要介绍,我们将创建一个 ESP32 BLE 服务器,然后创建一个 ESP32 BLE 扫描仪来查找该服务器。我们将使用并解释 BLE 库附带的示例。

要遵循此示例,您需要两个 ESP32 开发板。我们将使用 ESP32 DOIT DEVKIT V1 Board

ESP32 BLE 服务器

要创建 ESP32 BLE 服务器,请打开 Arduino IDE 并转到 文件>示例> ESP32 BLE Arduino并选择BLE_server示例。应加载以下代码:

要创建 BLE 服务器,代码应遵循以下步骤:

  1. 创建一个 BLE 服务器。在这种情况下,ESP32 充当 BLE 服务器。
  2. 创建 BLE 服务。
  3.  在服务上创建 BLE 特征。
  4. 在特性上创建一个 BLE 描述符。
  5. 启动服务。
  6.  开始广告,以便其它设备可以找到。

代码如何工作

让我们快速了解一下 BLE 服务器示例代码是如何工作的。

它首先为 BLE 功能导入必要的库。

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

然后,您需要为服务和特征定义一个 UUID。

#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

您可以保留默认 UUID,也可以转到 uuidgenerator.net 为您的服务和特征创建随机 UUID。

在函数 setup() 里面,它以 115200 的波特率开始串行通信。

Serial.begin(115200);

然后,您创建一个名为“ MyESP32 ”的 BLE 设备。您可以将此名称更改为您喜欢的任何名称。

// Create the BLE Device
BLEDevice::init("MyESP32");

在以下行中,您将 BLE 设备设置为服务器。

BLEServer *pServer = BLEDevice::createServer();

之后,您使用之前定义的 UUID 为 BLE 服务器创建服务。

 BLEService *pService = pServer->createService(SERVICE_UUID);

然后,您为该服务设置特征。如您所见,您还使用了之前定义的 UUID,并且您需要将特征的属性作为参数传递。在这种情况下,它是:READ 和 WRITE。

BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                     CHARACTERISTIC_UUID,
                                     BLECharacteristic::PROPERTY_READ |
                                     BLECharacteristic::PROPERTY_WRITE
                                     );

创建特征后,您可以使用undefined()方法。

pCharacteristic->setValue("Hello World says Neil");

在这种情况下,我们将值设置为文本“Hello World says Neil”。您可以将此文本更改为您喜欢的任何内容。例如,在未来的项目中,该文本可以是传感器读数或灯的状态。

最后,您可以启动服务和广告,以便其它 BLE 设备可以扫描并找到此 BLE 设备。

BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();

这只是一个关于如何创建 BLE 服务器的简单示例。在这段代码中,没有做任何事情环形(),但您可以添加新客户端连接时发生的情况(查看 BLE_notify 示例以获取一些指导)。

ESP32 BLE 扫描仪

创建 ESP32 BLE 扫描仪很简单。获取另一个 ESP32(另一个正在运行 BLE 服务器程序)。在您的 Arduino IDE 中,转到 文件 > 示例>  ESP32 BLE Arduino并选择BLE_scan示例。应加载以下代码:

此代码将 ESP32 初始化为 BLE 设备并扫描附近的设备。将此代码上传到您的 ESP32。您可能想暂时断开另一个 ESP32 与您的计算机的连接,因此您确定将代码上传到正确的 ESP32 板上。

上传代码后,您应该打开两个 ESP32 板:

  • 一个带有“BLE_server”程序的 ESP32;
  • 其它带有 ESP32 “BLE_scan” 程序。
scan-server-esp32

转到运行“BLE_scan”示例的 ESP32 的串行监视器,按下 ESP32(带有“BLE_scan”程序)启用按钮重新启动并等待几秒钟,同时扫描。

esp32-scan-enable-button

扫描仪发现了两个设备:一个是 ESP32(它的名称为“ MyESP32 ” ),另一个是我们的MiBand2。

esp32-scan

使用智能手机测试 ESP32 BLE 服务器

大多数现代智能手机都应该具备 BLE 功能。我目前正在使用 OnePlus 5,但大多数智能手机也应该可以使用。

您可以使用智能手机扫描 ESP32 BLE 服务器并查看其服务和特性。为此,我们将使用  来自 Nordic 的名为nRF Connect for Mobile的免费应用程序,它适用于Android(Google Play 商店) 和 iOS(App Store)

前往 Google Play 商店或 App Store 并搜索“nRF Connect for Mobile”。安装应用程序并打开它。

nRF-connect

不要忘记转到蓝牙设置并在智能手机中启用蓝牙适配器。您可能还希望使其对其它设备可见,以便稍后测试其它程序。

enable-bluetooth-nrf-e1519725728543

一旦智能手机中的一切准备就绪并且 ESP32 正在运行 BLE 服务器程序,在应用程序中,点击扫描按钮以扫描附近的设备。您应该会找到一个名为“ MyESP32 ”的 ESP32。

ble-server-found

单击“连接”按钮。

如下图所示,ESP32 有一个服务,其 UUID 是您之前定义的。如果您点击该服务,它会展开菜单并显示带有您还定义的 UUID 的特征。

BLE-server-service

该特征具有 READ 和 WRITE 属性,其值是您之前在 BLE 服务器程序中定义的值。所以,一切正常。

总结

在本教程中,我们向您展示了低功耗蓝牙的基本原理,并向您展示了一些使用 ESP32 的示例。我们已经探索了 BLE 服务器程序和 BLE 扫描程序。这些是帮助您开始使用 BLE 的简单示例。

这个想法是使用 BLE 发送或接收来自其它设备的传感器读数。我们将发布更多关于 ESP32 BLE 的教程和项目,敬请期待!

给TA打赏
共{{data.count}}人
人已打赏
ESP32-进阶免费项目

ESP32 继电器模块 – 控制交流电器(Web 服务器)

2022-8-30 0:12:47

免费项目

ESP32 BLE 服务器和客户端(蓝牙低功耗)

2022-8-30 11:17:05

4 条回复 A文章作者 M管理员
  1. Coming

    感谢

  2. cyqand

    非常谢谢!

  3. 火星人

    非常感谢

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索