ESP32的BLE使用学习

UUID生成网站:

Online UUID Generator Tool

0.前言

什么是低功耗蓝牙?

BLE之所以被称为低功耗蓝牙,就是需要通讯的时候才握手,数据传输完成后,就断开连接。在通讯过程中,主动方是客户端,由客户端发起连接请求、收发数据、断开连接等操作服务器是被动的一方,随时做好了被连接的准备,并对连接请求作出相应

如果需要不断发送控制和接收数据的指令,则在控制端APP中设计中,需要加入定时器

BLE低功耗蓝牙,主要应用于少量数据的短距离传输(低带宽)。与经典蓝牙不同,BLE只在传输数据时建立连接,空闲时进入睡眠模式来节能。这使得它消耗非常低的功率,BLE的功耗比经典蓝牙低约100倍(取决于实际使用)。BLE不仅支持点对点通信,还支持广播模式和网状网络。

BLE适用场景:短距离、偶尔发送少量数据,长时间靠电池供电,比如健康手环、追踪标签、物联网传感器等。

  1. 点对点通信:客户端扫描附近的设备,当搜索到服务器时,建立连接并监听传入的数据
  2. 广播模式:服务器向连接的多个客户端进行数据传输,服务器notify
  3. 网状网络: 所有设备都已连接,多对多连接

BLE和经典蓝牙的对比:

1.BLE服务器和客户端

BLE蓝牙有两种类型的设备:服务器和客户端,ESP32既可以作为客户端,也可以作为服务器(例如ESP32开发板与BLE手柄间的数据通信)。

服务器:可以被其他设备(客户端)搜索,进行读取数据。

2.GATT协议

GATT (Generic Attribute Profile)通用属性配置文件,它定义了向连接的BLE设备公开的分层数据结构。这意味着GATT定义了两个BLE设备发送和接收标准信息的方式。

  •  profile:服务器集合,针对特定用例的标准服务集合
  • service:服务器UUID,只有一个,收集相关信息,如传感器读数、电池电量
  • Characteristic:特征量(每个特征量都有一个分配的专属UUID),它是实际数据保存在层次结构上的位置
  • properties描述如何与特征值交互,notify。例如:读、写、通知、广播、指示等
  • value:特征值
  • descriptor:描述符

在示例中,创建一个具有两个特征的服务,温度和湿度。温度和湿度数据保存在其特征值上,每个特征都有notify属性,以便在值变化时通知客户端

3.UUID

每个服务、特征和描述符都有一个UUID(通用唯一标识符),UUID用于唯一标识信息,它可以识别蓝牙设备提供的特定服务

UUID是唯一的128位(16字节)数字,例如:

0340fde2-67b2-11ed-9022-0242ac120002

 UUID生成网站: 

Online UUID Generator Tool

 4.BLE程序

所需库文件

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

程序说明

(1)定义service和characteristic UUID:

// See the following for generating UUIDs: https://www.uuidgenerator.net/
#define SERVICE_UUID "06CDF89C-005D-4899-998B-6C7E8F48AEF5" // UART service UUID
#define CHARACTERISTIC_UUID_RX "4b88ba09-d579-4823-ba39-3b01cd0d2481"
#define CHARACTERISTIC_UUID_TX "21136456-0ef8-4044-9b6a-47f2fde41b5b"

(2)创建BLE设备:

BLEDevice::init("ESP32 UART Test"); // Give it a name

(3)创建一个BLE服务:

示例1:创建BLE服务器代码流程

  1. 创建一个BLE Sever(BLE 服务器),在这种情况下,ESP32充当BLE服务器
  2. 创建一个BLE Service(BLE 服务)
  3. 创建一个BLE Characteristic,在服务上创建BLE特征

  4. 创建一个BLE Descriptor,在特征上创建一个BLE描述符。

  5. 启动服务

  6. 开始广播,以便其他设备可以找到它

uint8_t txValue = 0;                         // 要发送的值,先不用管
BLEServer *pServer = NULL;                   // BLEServer指针 pServer
BLECharacteristic *pTxCharacteristic = NULL; // BLECharacteristic指针 pTxCharacteristic
bool deviceConnected = false;                //本次连接状态
bool oldDeviceConnected = false;             //上次连接状态
  pServer = BLEDevice::createServer(); // 创建BLE服务(只有一个)
  pServer->setCallbacks(new MyServerCallbacks()); //设置回调
  BLEService *pService = pServer->createService(SERVICE_UUID); // 服务UUID

示例2:(8条消息) 轻松易懂arduino低功耗BLE蓝牙通信_DLGG创客DIY的博客-CSDN博客

①使用ESP32创建BLE Server 

  1. 创建BLE Server
  2. 给这个BLE Server添加一个Service,传入头部设置的Service UUID
  3. 再为这个Service创建Characteristic,这里除了传入UUID,还要声明这个Characteristic的读写属性。
  4. 然后给Characteristic赋个初始值,这个值可以被客户端读取然后改写。
  5. 最后,开启这个Service,然后开始广播,这样这个Server就可以被BLE的客户端扫描到。
  BLEDevice::init("MyESP32");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

 Characteristic赋个初始值:

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

 开启这个Service,然后开始广播:

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

 ②BLE Client端

  BLE Server创建完成后,需要Client端来连接Server,并读写数据。在BLE应用中,Client端往往是手机,当然也可以是其他单片机。

(4)创建一个BLE特征:

  // 创建一个 BLE 特征
  pTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);
  pTxCharacteristic->addDescriptor(new BLE2902());
  BLECharacteristic *pRxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);
  pRxCharacteristic->setCallbacks(new MyCallbacks()); //设置回调

(5)设置回调函数:

// 回调函数,让连接状态发送改变,重点!
class MyServerCallbacks : public BLEServerCallbacks
{
  void onConnect(BLEServer *pServer) // 开始连接
  {
    deviceConnected = true; // 连接成功
  };

  void onDisconnect(BLEServer *pServer) // 断开连接
  {
    deviceConnected = false; // 设备连接错误
  }
};

(6)启动广播:

pService->start();                  // 开始服务
  pServer->getAdvertising()->start(); // 开始广播,开启广播时,功耗很大,BLE连接成功后,可以关闭广播,功耗会下降
  Serial.println(" Waiting a client connection to notify...");

(7)断开连接和正在连接,写在loop中

void loop()
{
  // deviceConnected 已连接
  if (deviceConnected)
  {
    pTxCharacteristic->setValue(&txValue, 1); // 设置要发送的值为1
    pTxCharacteristic->notify();              // 广播
    txValue++;                                // 数值加1,然后取地址
    delay(2000);                              // 如果有太多包要发送,蓝牙会堵塞
  }

  // disconnecting  断开连接
  if (!deviceConnected && oldDeviceConnected)
  {
    delay(500);                  // 留时间给蓝牙缓冲
    pServer->startAdvertising(); // 重新广播
    Serial.println(" 开始广播 ");
    oldDeviceConnected = deviceConnected;
  }

  // connecting  正在连接
  if (deviceConnected && !oldDeviceConnected)
  {
    // do stuff here on connecting
    oldDeviceConnected = deviceConnected;
  }
}

重要参考程序:

(8条消息) ESP32经典蓝牙和BLE的使用 (基于Arduino)_月烨洵纾鄞.的博客-CSDN博客_esp32蓝牙arduino

5.APP Inventor

注意事项:

        单片机发送数据到手机:如果一直执行数据接收,数据一定会乱套,手机app可以通过定时器在间隔指定时间执行指定函数。

        切换界面,蓝牙依旧保持连接

在打开蓝牙扫描后,完成扫描后记得停止扫描,不然会一直扫描占用系统资源

连接蓝牙设备:连接蓝牙设备需要蓝牙设备的地址,蓝牙设备的地址则以字符串的形式保存在下拉框中。扫描得到的信息:蓝牙地址、设备名称、信号强度,地址的字符串长度为17.

接收和发送数据需要服务UUID和特征UUID。服务UUID只有一个,特征UUID可以有多个

APP设计参考:

(5条消息) ESP32S蓝牙04_tongyue的博客-CSDN博客

(5条消息) Appinventor——蓝牙app(蓝牙遥控器、串口助手、温湿度显示、切换界面蓝牙依旧保持连接)_霄耀在努力的博客-CSDN博客

(5条消息) APP Invertor 制作BLE蓝牙APP 控制esp32蓝牙小车_青烨慕容的博客-CSDN博客

(5条消息) APP Invertor 蓝牙BLE 个人案例分享 快速开发自己的蓝牙APP_重行HC的博客-CSDN博客

  • 6
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: ESP32 BLE OTA是指使用蓝牙低功耗(BLE)技术进行在线固件升级(OTA)。ESP32是一款功能强大的微控制器,具有集成的蓝牙功能,可以通过BLE连接与其他设备进行通信。 蓝牙低功耗(BLE)是一种无线通信协议,用于设备之间短距离的通信,具有低功耗和低延迟的特点。通过BLE连接,ESP32可以与其他设备进行数据传输,比如智能手机、电脑等。 OTA是指通过网络将设备的固件升级到最新版本的过程。传统的OTA需要通过WiFi或以太网连接到服务器下载升级包,然后将其写入设备中。然而,ESP32 BLE OTA可以通过BLE连接直接从远程服务器下载和安装升级包,无需额外的网络连接。 ESP32 BLE OTA可以使设备实现即时更新,提供更好的用户体验。通过BLE连接,可以在没有网络连接的情况下完成OTA,这对于一些特定场景(如智能家居设备)是非常有用的。 为了实现ESP32 BLE OTA,需要进行以下步骤: 1. 在设备上实现BLE连接和基本的数据传输功能。 2. 设计OTA协议,定义升级包的格式和传输方式。 3. 开发远程服务器,存储设备的固件升级包。 4. 设计客户端应用程序,通过BLE连接设备并发送OTA升级请求。 5. 设备接收升级请求后,连接到远程服务器并下载升级包。 6. 下载完成后,设备将升级包写入其存储器中,并进行相关验证。 7. 设备在确认升级包正确后,启动固件升级过程,更新自身的固件版本。 总而言之,ESP32 BLE OTA利用蓝牙低功耗技术实现在线固件升级,提供了便捷和即时更新的方式,适用于各种嵌入式设备和物联网应用。 ### 回答2: ESP32BLE OTA(Over-the-Air)是指通过蓝牙低功耗(BLE)无线技术对ESP32固件进行远程更新的方法。在传统的固件更新过程中,我们通常需要通过连接电脑或其他设备来更新固件,而使用BLE OTA可以通过蓝牙连接,使得固件更新更加方便和灵活。 BLE OTA的实现主要依赖于ESP32的蓝牙传输特性和OTA技术。首先,ESP32作为一个支持蓝牙的芯片,可以通过BLE连接与其他设备进行通信。其次,OTA技术是指在不连接物理线缆的情况下,对设备固件进行更新的技术。 具体实现BLE OTA的步骤如下: 1. 首先,确保ESP32已经连接上了蓝牙设备,比如手机或电脑。 2. 通过编程在ESP32上配置BLE特性和服务,以便与蓝牙设备建立连接并进行数据传输。 3. 在蓝牙设备上开发一个应用程序,用于通过BLEESP32进行通信和固件更新。 4. 当需要更新ESP32固件时,蓝牙设备将新固件文件传输到ESP32上。 5. ESP32通过OTA技术将接收到的固件文件进行验证和加载,完成固件更新的过程。 BLE OTA的优点是提供了一种灵活、方便且不受物理线缆限制的固件更新方式。通过蓝牙连接,可以在不接触设备的情况下对其进行远程更新,节省了时间和人力资源。此外,BLE OTA还可以与其他蓝牙应用程序进行集成,实现更多的功能和应用场景,为用户提供更好的体验。 综上所述,ESP32 BLE OTA是一种利用蓝牙低功耗无线技术对ESP32固件进行远程更新的方法。它的实现依赖于ESP32的蓝牙特性和OTA技术,通过BLE连接与蓝牙设备通信,实现灵活、方便的固件更新。这种方法不仅节省了时间和人力资源,还可以与其他蓝牙应用程序集成,提供更多的功能和应用场景。 ### 回答3: ESP32 BLE OTA是指基于蓝牙低功耗(BLE)的固件升级技术。ESP32是一款由乐鑫科技推出的低功耗、高性能的Wi-Fi和蓝牙芯片。OTA代表“Over-The-Air”,即通过无线网络进行固件升级。 使用ESP32 BLE OTA可以实现远程固件升级,无需通过有线连接设备进行升级操作。这种技术在物联网应用中非常有用,特别是当设备分布在不同位置,无法方便地进行有线连接时。 ESP32 BLE OTA的工作原理是,首先,将待升级的固件文件上传到中央服务器。然后,通过蓝牙连接将固件文件传输到ESP32设备。设备会确认文件的完整性和正确性,并进行固件升级。这个过程通常是自动化的,并且可以通过手机应用或其他远程控制设备进行操作。 ESP32 BLE OTA具有以下优点: 1. 便捷性:不需要通过有线连接设备进行固件升级,节省了时间和精力。 2. 灵活性:可以通过蓝牙连接实现远程升级,适用于设备分布在不同位置的场景。 3. 可靠性:升级过程中会进行文件完整性和正确性的检查,确保固件的安全性和正确性。 需要注意的是,在实施ESP32 BLE OTA时,需要确保设备具备蓝牙连接功能,并对固件升级过程进行充分的测试和验证,以确保升级的安全性和稳定性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值