ESP32实际上是一款功能强大的IoT设备,具有对蓝牙和WiFi的内置支持。ESP32是其前身ESP8266的高级版本,具有RAM,ROM,GPIO引脚等额外功能。ESP32模块同时支持经典蓝牙和低功耗蓝牙(BLE),经典蓝牙可用于传输歌曲或文件以及BLE该选项可用于电池优化的应用程序,例如蓝牙信标,健身带,接近度等。也可以将ESP32用作串行蓝牙,例如HC-05或HC-06模块,用于简单的微控制器项目。
众所周知,BLE可以在两种不同的模式下运行-服务器模式和客户端模式。在我们之前的ESP32教程中已经讨论了这两种模式:
- ESP32 BLE服务器-GATT服务用于电池电量指示
- ESP32 BLE客户端–连接健身带以触发灯泡
在本教程中,我们将使用ESP32构建BLE iBeacon,其中ESP32将充当服务器,而智能手机将充当客户端。我假设您已经熟悉如何将ESP32开发板与Arduino IDE结合使用,如果您还不熟悉ESP32入门指南的话。
通过浏览我们之前使用Raspberry Pi和HM-10 BLE iBeacon的Bluetooth iBeacon项目,您还可以了解什么是Beacon / iBeacon技术。
所需组件
硬件:
- ESP32开发板
- 微型USB电缆
软件:
- Arduino IDE
- Android应用程序:移动版nRF Connect(由Nordic Semiconductor提供)
有许多BLE扫描器应用程序,其中一个是我们在先前的如何将HM-10 BLE模块与Arduino结合使用的项目中使用的。该BLE扫描器应用程序提供了良好的图形界面(GUI),但缺少其他信息,因此在此项目中,我们使用NRF Connect for Mobile应用程序。
使用适用于ESP32 iBeacon的nRF Connect Android应用
1.从Google Play商店下载nRF Connect应用程序,然后将其打开。
2.屏幕如下所示。找到设备后,此项目的有用选项将为“扫描”,“扫描仪”和“信息”。
在“扫描”选项将被用于所有查看可用iBeacons。要开始搜索iBeacon,请下拉屏幕或转到屏幕右上角的“扫描”选项。这将开始搜索可用的iBeacons。
3.搜索iBeacon之后,您将可以看到iBeacon的RSSI,UUID,主要和次要。如果您将移动设备或iBeacon相互远离,则RSSI将会更改。在此屏幕上的RSSI是(-37)。除此之外,还有一些详细信息,例如虚拟公司名称,设备类型,字节长度,ESP32的本地名称。这里是“ ESP32 as iBeacon ”。您可以在草图中更改本地名称。
4.从iBeacon拿走智能手机后,RSSI值从-37变为-58。如果您移动其中一台设备,这些值将不断变化。
RSSI信号可接受的值如下:
信号强度 | TL; DR | 需要 | |
---|---|---|---|
-30 dBm | 惊人 | 最大可达到的信号强度。客户只能距离AP几英尺远才能实现这一目标。在现实世界中并不典型或不理想。 | 不适用 |
-67 dBm的 | 很好 | 对于要求非常可靠,及时地传送数据包的应用,其信号强度最低。 | VoIP / VoWiFi,视频流 |
-70 dBm的 | 好的 | 最小信号强度,可实现可靠的数据包传输。 | 电子邮件,网络 |
-80 dBm的 | 不好 | 基本连接的最小信号强度。数据包传递可能不可靠。 | 不适用 |
-90 dBm的 | 无法使用 | 在本底噪声中接近或淹没。任何功能极不可能。 | 不适用 |
将ESP32编程为BLE iBeacon
在Arduino IDE中安装ESP32开发板时,有可用的ESP32 BLE iBeacon示例程序。但是我们在本教程中对此草图进行了稍微的编辑,在本教程的最后给出了示例程序的完整编辑版本。
要打开ESP32 BLE_iBeacon的示例程序,请按照以下步骤操作。
- 打开Arduino IDE并选择“ ESP32 Dev Module”。(如果找不到此开发板,请检查是否已安装ESP32开发板包)
- 转到文件>示例> ESP32 BLE Arduino > BLE_iBeacon
- 打开“ BLE_iBeacon”草图。
现在,对本教程中的代码进行了一些修改。ESP32名称也将在此草图中更新。因此,从包含必要的库开始,这些库将在创建BLE服务器和iBeacon中使用。
#include“ sys / time.h”
这是一个时间库,用于获取当前系统时间。它包含的功能,如tv_sec,函数gettimeofday()等。欲了解更多信息,您可以访问官方发布UNIX “ SYS / time.h中”。
然后包括ESP32 BLE库,其中包含许多用于使ESP32具有不同配置的功能,例如BLE Client或BLE Server。
#include“ BLEDevice.h” #include“ BLEUtils.h” #include“ BLEServer.h”
包含的iBeacon库将ESP32设置为iBeacon。除此之外,ESP32还包含了深度睡眠库。该库将用于在规定的时间段内以深度睡眠模式发送ESP32。
#include“ BLEBeacon.h” #include“ esp_sleep.h”
定义ESP32的睡眠时间。ESP32在此处将处于深度睡眠状态,持续10秒钟,并会播发广告,然后再次进入深度睡眠状态10秒钟。
#定义GPIO_DEEP_SLEEP_DURATION 10
此处定义了RTC_DATA_ATTR。请注意,如果您使用RTC_DATA_ATTR属性定义全局变量,则该变量将被放入RTC_SLOW_MEM存储器中。因此,在深度睡眠之前声明为RTC_DATA_ATTR的结构并将动态内存复制到此结构有助于在唤醒后将其恢复到动态内存中。简而言之,我们正在将时间从动态内存中保存到静态内存中,以便在深度睡眠后再次恢复它。这里定义了两个变量。' last '用于获取ESP32进入深度睡眠的最后时间,并使用 bootcount 进行复位计数。
RTC_DATA_ATTR静态time_t最后; RTC_DATA_ATTR静态uint32_t引导计数;
然后定义BLE广告类型。定义如下。
BLEAdvertising * pAdvertising;
所述 的timeval 被定义为结构来访问当前时间。
现在构造timeval;
还定义了UUID。可以从此链接生成UUID 。
#定义BEACON_UUID“ 87b99b2c-9XXd-11e9-bXX2-526XXXX64f64”
现在创建一个包含iBeacon属性的函数,例如UUID,Major,Minor等,在该函数中,将BLE的实例创建为iBeacon,并将伪造的制造商ID,UUID,ESP32的主要和次要设置为iBeacon。
无效setBeacon(){ BLEBeacon oBeacon = BLEBeacon(); oBeacon.setManufacturerId(0x4C00); oBeacon.setProximityUUID(BLEUUID(BEACON_UUID)); oBeacon.setMajor((bootcount&0xFFFF0000)>> 16); oBeacon.setMinor(bootcount&0xFFFF);
将标志设置为0x04,以便它将在扫描仪中输出 BrEdrNotSupported 。
oData.setFlags(0x04);
设置要发布的广告数据。
std:: string strServiceData =“”;
依次添加字符串以进行广告。
strServiceData + =(char)26; // Len strServiceData + =(char)0xFF; // 输入strServiceData + = oBeacon.getData(); oData.addData(strServiceData);
通过发布数据开始广告。
pAdvertising-> setData(oData); pAdvertising-> setScanResponseData(oScanResponseData);
以115200波特率启动串行监视器并获取时间。还要增加 引导计数 以存储复位次数。
Serial.begin(115200); gettimeofday(&now,NULL); Serial.printf(“ start ESP32%d \ n”,bootcount ++);
将当前时间存储在静态存储器中。
last = now.tv_sec;
创建一个BLE设备并根据需要命名。ESP32在这里被命名为“ ESP2 as iBeacon ”。请注意,名称可以很长,但是此版本的代码已开始支持长名称。
BLEDevice:: init(“ ESP32 as iBeacon”);
创建BLE服务器进行公告并启动。
BLEServer * pServer = BLEDevice:: createServer(); pAdvertising = BLEDevice:: getAdvertising(); BLEDevice:: startAdvertising();
然后将ESP32设置为iBeacon模式。
setBeacon();
开始做广告,然后停止做广告,进入深度睡眠状态10秒钟。
pAdvertising-> start(); pAdvertising-> stop(); esp_deep_sleep(1000000LL * GPIO_DEEP_SLEEP_DURATION);
最后,使用Micro USB电缆将ESP32开发板插入笔记本电脑,然后使用Arduino IDE将代码上传到ESP32。然后在智能手机中打开 nRF Connect Android应用 并开始扫描。您会发现 ESP32作为iBeacon 广播,如下图所示:
这就是ESP32用作BLE Beacon来宣传UUID,Major和Minor的方式。如果您想了解有关iBeacon的更多信息,请遵循我们之前关于HM10的教程iBeacon。另外,如果您有任何疑问,请在下面评论或在论坛中提问。
下面给出了完整的代码以及可运行的视频。
/>