在本教程中,我们将了解ESP32中的BLE功能。ESP32具有蓝牙低能或BLE功能以及经典蓝牙。ESP32 BLE针对不同BLE设备之间的电池操作,低功率无线通信。我们将学习所有必需品,以便在ESP32中使用BLE并将其配置为服务器和客户端。我们还将看到如何将智能手机与ESP32 BLE服务器连接。
关于BLE的简短说明(蓝牙低能)
蓝牙4.0规范的主要特征是蓝牙低能或简单地集成。BLE(以前以蓝牙SMART销售)是专门为低功率无线通信而设计的经典蓝牙的高度优化版本。
虽然经典的蓝牙(通常描述为指称其数据速度的技术文档中的基本速率和增强的DARA速率)却被设计为替代有线通信,并用短距离无线通信。它的设计考虑了数据速度,应用程序包括大型文件传输,无线音频等。
另一方面,BLE可用于低功耗,而不是更高的数据速率,并考虑到IoT和电池经营的应用程序。BLE的一些流行应用是智能手表,健身追踪器,健康监测设备,无线电信标等。
与始终连接的经典蓝牙不同,BLE通常处于待机(空闲)模式,并且仅在需要时就醒来。因此,超低功耗。
蓝牙低能也可以在相同的2.4 GHz ISM频带上工作。这意味着可以将单个天线用于Wi-Fi和两个版本的蓝牙。
BLE中的不同层
BLE设备由三层组成:
- 控制器
- 主持人
- 应用
控制器包含以下内容:
- PHY - 物理层
- LL - 链接层
- HCI - 控制器侧主机控制器接口
主机包含以下内容:
- HCI - 主机侧主机控制器接口
- L2CAP - 逻辑链接控制和应用程序协议
- SM - 安全经理
- ATT - 属性协议
- 差距 - 通用访问配置文件
- GATT - 通用属性配置文件
应用层是包含用户界面,数据处理和逻辑方面的最高层。
BLE中的重要术语
让我们简要查看与BLE相关的一些重要术语。
- GATT:这是通用属性配置文件的简短。它使用服务和特性定义了BLE设备之间数据传输的规格。
- 特征:特征是一组称为属性的信息,属性是在设备之间传输的一组信息。特征通常包含以下属性:
- 值:特征的数据值
- 声明:特征的属性(位置,类型读,写,通知,指示等)
- 描述:描述特征的ASCII字符串。
- 服务:特征的集合称为服务。每个服务都有一个唯一的16位或128位ID,称为UUID。
- UUID:普遍唯一的标识符是对每个服务和配置文件中的特征提供的128位ID。使用网站uuidgenerator生成唯一的ID。每个服务和特征都有一个唯一的16位或128位ID,称为UUID。uuid的样本看起来像这样:
- 583F8B30-74B4-4757-8143-56048FD88B25
布莱国家
BLE设备可以具有5个可能的状态:
- 支持
- 广告
- 扫描
- 发起
- 连接的
BLE网络拓扑
两个BLE设备之间的通信可以是广播类型或连接类型。在广播中,“广播公司” BLE设备将数据发送到任何“观察者” BLE设备。这是一个单向数据传输。
对于双向通信,您需要在BLE设备之间进行“连接”。中央(主)设备的中央设备反复扫描从发送数据包的外围(从属)设备的广告数据包。
在ESP32中BLE
我们知道ESP32的主要功能是Wi-Fi。但此外,ESP32 SOC还具有蓝牙支持。ESP32蓝牙是双模式系统。这意味着ESP32支持经典的蓝牙和蓝牙低能(BLE)。
具体而言,ESP32中的蓝牙系统符合蓝牙v4.2经典蓝牙(BR/EDR)和BLE规格。在上一个教程中,我们已经探索了如何使用ESP32经典蓝牙有几个例子。我们将在本教程中探索ESP32的BLE功能。
ESP32 BLE服务器客户端模型
任何BLE设备都可以配置为服务器或客户端。ESP32也不例外,即ESP32可以是服务器,它可以宣传其在场,以便客户可以阅读其数据或作为客户端,该服务器可以扫描服务器并建立连接以从服务器接收数据。
在此项目中,我们将使用两个ESP32板,一个将作为BLE服务器编程为BLE服务器。ESP32初学者的项目这是给予的
ESP32 BLE服务器
首先,我们将看到如何将ESP32设置为BLE服务器。拿一个ESP32板并将其连接到计算机。我们将该板称为“ ESP32-BLE_SERVER”。打开Arduino IDE,并确保选择适当的ESP32开发板和COM端口。
代码
这是“ ble_server”示例的一个稍微修改的代码。我评论了代码以解释所有必要的事情。
将此代码上传到服务器ESP32设备。
ESP32 BLE客户端
取另一个ESP32板(我们将称为ESP32-BLE_CLIENT),然后将其连接到计算机。在Arduino IDE中,选择该板的COM端口。
代码
有一个称为“ ble_client”的示例作为ESP32 BLE库的一部分。我在这里使用了相同的代码(修改小)。将此代码上传到客户端ESP32设备。
在职的
将代码上传到两个ESP32板后,您需要监视两个板的串行端口以查看通信。为此,我使用Arduino IDE的串行监视器打开ESP32 BLE客户设备的COM端口和另一个软件(例如Putty或Terminal)打开ESP32 BLE服务器设备的串行端口。
在为ESP32 BLE服务器和客户端打开相应的串行端口终端后,通过按相应的启用(EN)按钮来重置两个板。
ESP32 BLE服务器设备将启动BLE服务器并开始广告其服务。如果您观察客户端ESP32的代码,我们使用了服务器ESP32的服务UUID和特征性UUID。这意味着客户端ESP32扫描BLE设备,如果找到了特定的UUID,则可以建立连接。
建立连接后,ESP32 BLE客户端首先从服务器读取特征值(我们将其设置为“ Hello,World!”中的服务器代码中的“ Hello,World!”),并将其打印在终端上。
之后,客户端试图每隔几秒钟设置具有新值的服务器的特征值。您可以在下面的图像中看到客户端的终端。
进入服务器,一旦启动BLE服务器,它就会每隔几秒钟读取自己的特征值。您可以看到以下图像,即服务器的特征值由客户端更新,并由服务器读取。
使用智能手机测试ESP32 BLE服务器
现在让我们看看如何将智能手机连接到ESP32 BLE服务器。将以下代码上传到ESP32板上,我们将其称为ESP32 BLE服务器,并在Arduino IDE中打开串行监视器。
在智能手机中,去玩商店并通过BluePixel Technologies安装“ BLE扫描仪”应用程序。安装后,打开应用程序(如果之前已经配对ESP32蓝牙,则不需要对)。在手机中启用蓝牙和位置(都需要扫描BLE设备)(应用程序将提示相同)。单击右上角的“扫描”图标。
该应用程序将开始扫描BLE设备并将其列出。您可以在列表中看到“ ESP32-Ble-Server”。
单击“连接”,智能手机开始使用ESP32 BLE服务器连接。连接后,它将显示服务列表及其特征。由于我们只使用一项服务初始化了ESP32,因此您可以在“自定义服务”部分下看到服务UUID以及特征性UUID。
要读取服务的初始特性值,请点击“自定义服务”部分中的“ R”图标。该应用程序从服务器读取值并将其显示在“值”选项中。
由于我们将特征的属性设置为读写和写作,因此我们可以通过敲击“ W”图标来设置特征的值。一个文本框弹出以编写值。输入值后,单击“确定”。该值是在服务器中设置的。
如果打开服务器的串行监视器,则可以看到服务器打印出新设置的值。我们实际上不是像上一个示例中那样连续监视“值”字段,而是实际上使用了BLE库的回调功能,当且仅当启动“写入”选项时,它才会被调用。
结论
ESP32中理解BLE的完整初学者指南。您可以学习一些蓝牙低能的基本功能,如何使用ESP32 BLE功能,如何将ESP32设置为BLE服务器和客户端,以及如何将智能手机连接到ESP32 BLE服务器。
这只是ESP32蓝牙低能的介绍性项目。将来,我们将利用ESP32中的BLE实施几种与物联网相关的应用程序。
3个回应
首先,恭喜这篇文章。
我以前曾在Arduino Ide Scketches进行测试,但是您的文章使您更容易理解。
写作的原因是因为我希望能够通过Alexa的BLE控制ESP32。
我希望能够用ESP32控制大约5个LED,这了解命令打开LED,关闭LED,亮度为25%。
我不想通过wifi进行控制
先前,感谢您对如何以简单方式处理该项目的任何评论。
这个示例很棒。我有兴趣管理多个设备(服务器)的连接。我需要多个bleclientcallbacks()吗?如果不是,我如何区分OnDisconnect()和OnConnect()中的不同服务器?PCLIENT参数是指向客户端还是连接设备的指针?对在多连接环境中如何使用它们的任何解释都将不胜感激。
我正在制作一个Android应用程序,该应用程序将通过BLE连接ESP32的问题是,问题不是因为没有扫描而无法扫描,我无法阅读和写作?有什么帮助吗?