esp32 确实是一款功能强大的物联网设备,内置了对蓝牙和 wifi 的支持。esp32 是其前身 esp8266 的高级版本,具有 ram、rom、gpio 引脚等额外功能。esp32 模块支持经典蓝牙和低功耗蓝牙 (ble),经典蓝牙可用于传输歌曲或文件,ble该选项可用于电池优化应用,如蓝牙信标、健身手环、接近度广告等。也可以将esp32 用作串行蓝牙,如用于简单微控制器项目的 hc-05 或 hc-06 模块。
在本教程中,我们将使用 esp32 构建一个 ble ibeacon,其中 esp32 将充当服务器,智能手机将充当客户端。
所需组件
硬件:
esp32 开发板
微型 usb 数据线
软件:
arduino ide
android 应用程序:nrf connect for mobile(由 nordic semiconductor 提供)
有许多 ble 扫描仪应用程序,其中一个我们在之前的项目“如何将 hm-10 ble 模块与 arduino 一起使用”中使用过。这个 ble 扫描仪应用程序提供了良好的图形界面 (gui),但缺乏额外的信息,所以在这个项目中,我们使用nrf connect for mobile 应用程序。
使用适用于 esp32 ibeacon 的 nrf connect android 应用程序
1. 从 google play 商店下载 nrf connect 应用程序并打开它。
2. 画面如下。当找到设备时,此项目的有用选项将是“扫描”、“扫描仪”和“信息”。
“扫描”选项将用于查看所有可用的 ibeacon。要开始搜索 ibeacon,请下拉屏幕或转到屏幕右上角的“扫描”选项。这将开始搜索可用的 ibeacons。
3.搜索ibeacon后,可以看到ibeacon的rssi、uuid、major和minor。如果您将移动设备或 ibeacon 彼此远离,rssi 将发生变化。在此屏幕中,rssi 为 (-37)。除此之外,还有一些详细信息,例如虚拟公司名称、设备类型、字节长度、esp32 的本地名称。这里是“ esp32 as ibeacon ”。您可以在草图中更改本地名称。
4. 从ibeacon 拿走智能手机后,rssi 值从-37 变为-58。如果您移动其中一台设备,这些值将不断变化。
rssi 信号可接受值如下:
将 esp32 编程为 ble ibeacon
当您在 arduino ide 中安装 esp32 board 时,可以使用 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() 等函数。有关更多信息,您可以访问' sys/time.h '的官方 unix 版本。
然后包含 esp32 ble 库,其中包含许多用于在不同配置中制作 esp32 的函数,例如 ble 客户端或 ble 服务器。
#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 秒。
#define 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 。
#define beacon_uuid 87b99b2c-9xxd-11e9-bxx2-526xxxx64f64
现在创建一个函数,该函数将包含 ibeacon 属性,例如 uuid、major、minor 等。在此函数中,为 ble 创建一个实例作为 ibeacon,并将 esp32 的假制造商 id、uuid、主要和次要设置为 ibeacon。
无效 setbeacon() { blebeacon obeacon = blebeacon(); obeacon.setmanufacturerid(0x4c00); obeacon.setproximityuuid(bleuuid(beacon_uuid)); obeacon.setmajor((bootcount & 0xffff0000) >> 16); obeacon.setminor(bootcount & 0xffff);
将该标志设置为 0x04,以便它将在扫描仪中输出bredrnotsupported。
oadvertisementdata.setflags(0x04);
设置发布的广告数据。
std::string strservicedata = ;
一个接一个地添加字符串进行广告。
strservicedata += (char)26; // len strservicedata += (char)0xff; // 输入 strservicedata += obeacon.getdata(); oadvertisementdata.adddata(strservicedata);
通过发布数据开始广告。
padvertising->setadvertisementdata(oadvertisementdata); padvertising->setscanresponsedata(oscanresponsedata);
以 115200 波特率启动串行监视器并获取时间。还要增加引导计数以存储重置次数。
序列号.开始(115200); gettimeofday(&now, null); serial.printf(启动 esp32 %d\n, bootcount++);
将当前时间存储在静态存储器中。
最后 = now.tv_sec;
创建一个 ble 设备并根据需要命名。这里 esp32 被命名为“ esp2 as ibeacon ”。请注意,名称可以很长,但此版本的代码已开始支持长名称。
bledevice::init(esp32 作为 ibeacon);
创建 ble 服务器以进行广告并开始广告。
bleserver *pserver = bledevice::createserver(); padvertising = bledevice::getadvertising(); bledevice::startadvertising();
然后将 esp32 设置为 ibeacon 模式。
设置信标();
开始广告然后停止广告并进入深度睡眠 10 秒。
p广告->开始();padvertising->stop(); esp_deep_sleep(1000000ll * gpio_deep_sleep_duration);
最后,使用 micro usb 电缆将 esp32 开发板与您的笔记本电脑连接,并使用 arduino ide 将代码上传到 esp32。然后在您的智能手机中打开nrf connect android 应用程序并开始扫描。您会发现esp32 作为 ibeacon广播,如下图所示:
#include “sys/time.h”
#include “bledevice.h”
#include “bleutils.h”
#include “bleserver.h”
#include “blebeacon.h”
#include “esp_sleep.h”
#define gpio_deep_sleep_duration 10 // 休眠 x 秒,然后唤醒
rtc_data_attr static time_t last;// 记住 rtc 内存中的上次启动
rtc_data_attr static uint32_t bootcount; // 记住 rtc 内存中的启动次数
// 有关生成 uuid,请参见以下内容:
// https://www.uuidgenerator.net/
bleadvertising *padvertising; // ble 广告类型
struct timeval now;
#define beacon_uuid “87b99b2c-90fd-11e9-bc42-526af7764f64” // uuid 1 128 位(可以使用 linux 工具 uuidgen 或通过https://www.uuidgenerator.net/随机数)
无效 setbeacon() {
blebeacon obeacon = blebeacon();
obeacon.setmanufacturerid(0x4c00); // 假 apple 0x004c lsb (endian_change_u16!)
obeacon.setproximityuuid(bleuuid(beacon_uuid));
obeacon.setmajor((bootcount & 0xffff0000) 》》 16);
obeacon.setminor(bootcount & 0xffff);
bleadvertisementdata oadvertisementdata = bleadvertisementdata();
bleadvertisementdata oscanresponsedata = bleadvertisementdata();
oadvertisementdata.setflags(0x04); // br_edr_not_supported 0x04
std::string strservicedata = “”;
strservicedata += (char)26; // len
strservicedata += (char)0xff; //
输入 strservicedata += obeacon.getdata();
oadvertisementdata.adddata(strservicedata);
padvertising-》setadvertisementdata(oadvertisementdata);
padvertising-》setscanresponsedata(oscanresponsedata);
}
无效设置(){
序列号。开始(115200);
gettimeofday(&now, null);
serial.printf(“启动 esp32 %d\n”, bootcount++);
serial.printf(“深度睡眠(自上次重置以来的 %lds,自上次启动以来的 %lds)\n”, now.tv_sec, now.tv_sec - last);
最后 = now.tv_sec;
// 创建 ble 设备
bledevice::init(“esp32 as ibeacon”);
// 创建 ble 服务器
bleserver *pserver = bledevice::createserver(); // 《-- 不再需要实例化 bleserver,更少的闪存和内存使用
padvertising = bledevice::getadvertising();
bledevice::startadvertising();
设置信标();
// 开始广告
padvertising-》start();
serial.println(“广告开始。..”);
延迟(100);
padvertising-》stop();
serial.printf(“进入深度睡眠\n”);
esp_deep_sleep(1000000ll * gpio_deep_sleep_duration);
serial.printf(“处于深度睡眠中\n”);
}
无效循环(){
}
新的iPad Pro 10.5是市面上最好的平板电脑吗?
NVIDIA cuBLAS库加速BLAS的GPU设计实现
美国陆军核心战术网WIN-T系统的技术体制、功能结构及应用分析
最新数据:2020上半年全球新能源汽车销量及 TOP 20车辆
智能+3D齐上阵 创佳新品电视亮相CCEF
如何使用ESP32构建一个BLE iBeacon
浅谈云计算的概念是如何产生的?
小米互联网空调降价 延续了米家空调极简风格
NAND闪存售价下降,需求量猛增,SK海力士Q3创新高销售额达到477亿元
核心交换机、汇聚交换机与普通交换机的区别介绍
反思16家拿到新能源汽车“准生证”,“鲶鱼”却难“持证上岗”
电缆故障测试仪--路径单元的详细介绍
关于使系统性能达到最佳的重要设计考虑因素
传统锂电池自放电率的测量方法
从龙头企业生态圈看智慧照明产业发展模式
绝缘线强者骅鹰科技正式冠名第10届行业评选
苹果自研CPU,对英特尔可以说是利大于弊
车载摄像头总线(C2B)—经济高效的摄像头连接
氢燃料电池的发电效率可以达到50%以上
光线跟踪的原理和优缺点的概述