ESP32 不仅配备 Wi-Fi,还配备蓝牙和蓝牙低功耗 (BLE)。这篇文章是使用 ESP32 快速介绍 BLE。首先,我们将探索什么是 BLE 以及它可以用于什么,然后我们将看一些使用 Arduino IDE 的 ESP32 示例。为了简单介绍,我们将创建一个 ESP32 BLE 服务器和一个 ESP32 BLE 扫描仪来查找该服务器。
目录
介绍低功耗蓝牙
什么是低功耗蓝牙?
低功耗蓝牙,简称BLE,是蓝牙的一种省电变体。BLE 的主要应用是少量数据的短距离传输(低带宽)。与始终开启的蓝牙不同,BLE 始终处于睡眠模式,除非在启动连接时。
这使得它消耗非常低的功率。BLE 的功耗比蓝牙低大约 100 倍(取决于用例)。
此外,BLE不仅支持点对点通信,还支持广播模式和网状网络。
请查看下表,它更详细地比较了 BLE 和蓝牙经典。
由于其特性,BLE 适用于需要在纽扣电池上定期交换少量数据的应用。例如,BLE 在医疗保健、健身、跟踪、信标、安全和家庭自动化行业中非常有用。
BLE 服务器和客户端
使用蓝牙低功耗,有两种类型的设备:服务器和客户端。ESP32 既可以作为客户端,也可以作为服务器。
服务器宣传它的存在,因此它可以被其它设备发现,并包含客户端可以读取的数据。客户端扫描附近的设备,当它找到它正在寻找的服务器时,它会建立连接并监听传入的数据。这称为点对点通信。
如前所述,BLE 还支持广播模式和网状网络:
- 广播模式:服务器将数据传输给连接的多个客户端;
- 网状网络:所有设备都连接,这是多对多连接。
尽管可以实现广播和网状网络设置,但它们是最近开发的,因此目前为 ESP32 实现的示例并不多。
GATT
GATT 代表通用属性,它定义了向连接的 BLE 设备公开的分层数据结构。这意味着 GATT 定义了两个 BLE 设备发送和接收标准消息的方式。理解这种层次结构很重要,因为它可以更容易地理解如何使用 BLE 和编写应用程序。
BLE服务
层次结构的顶层是一个配置文件,它由一个或多个服务组成。通常,一个 BLE 设备包含多个服务。
每个服务至少包含一个特征,或者还可以引用其它服务。服务只是信息的集合,例如传感器读数。
SIG(蓝牙特殊兴趣组)定义的几种类型的数据有预定义的服务,例如:电池电量、血压、心率、体重秤等。您可以在此处查看其它定义的服务。
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 库附带的示例。
注意:要查看 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 服务器,代码应遵循以下步骤:
- 创建一个 BLE 服务器。在这种情况下,ESP32 充当 BLE 服务器。
- 创建 BLE 服务。
- 在服务上创建 BLE 特征。
- 在特性上创建一个 BLE 描述符。
- 启动服务。
- 开始广告,以便其它设备可以找到。
代码如何工作
让我们快速了解一下 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” 程序。
转到运行“BLE_scan”示例的 ESP32 的串行监视器,按下 ESP32(带有“BLE_scan”程序)启用按钮重新启动并等待几秒钟,同时扫描。
扫描仪发现了两个设备:一个是 ESP32(它的名称为“ MyESP32 ” ),另一个是我们的MiBand2。
使用智能手机测试 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”。安装应用程序并打开它。
不要忘记转到蓝牙设置并在智能手机中启用蓝牙适配器。您可能还希望使其对其它设备可见,以便稍后测试其它程序。
一旦智能手机中的一切准备就绪并且 ESP32 正在运行 BLE 服务器程序,在应用程序中,点击扫描按钮以扫描附近的设备。您应该会找到一个名为“ MyESP32 ”的 ESP32。
单击“连接”按钮。
如下图所示,ESP32 有一个服务,其 UUID 是您之前定义的。如果您点击该服务,它会展开菜单并显示带有您还定义的 UUID 的特征。
该特征具有 READ 和 WRITE 属性,其值是您之前在 BLE 服务器程序中定义的值。所以,一切正常。
总结
在本教程中,我们向您展示了低功耗蓝牙的基本原理,并向您展示了一些使用 ESP32 的示例。我们已经探索了 BLE 服务器程序和 BLE 扫描程序。这些是帮助您开始使用 BLE 的简单示例。
这个想法是使用 BLE 发送或接收来自其它设备的传感器读数。我们将发布更多关于 ESP32 BLE 的教程和项目,敬请期待!
感谢
非常谢谢!
非常感谢
学习一下!
学习一下
非常谢谢!
KANKAN
看看,,,,不错 感谢
感谢分享
楼主辛苦
感谢
有机器翻译的味道,方便告知下原文吗
感谢
学习一下
评论来学习
学习一下
感谢,感谢,十分有用的知识
😁
非常谢谢!!!!
前来学习
感谢
可以作为服务器连接手机嘛?
可以作为服务器连接手机吗?
xiexie
😤😍
谢谢兄弟
感谢博主
henhao
不太清楚
Good Good Study , Day Day Up!!!
学习
1
加油加油
为啥串口窗不显示Hello World says Neil
非常感谢!👍