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); // 设置要发送的值为1pTxCharacteristic->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 connectingoldDeviceConnected = 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博客

ESP32的BLE使用学习相关推荐

  1. android studio蓝牙低功耗,arduino ESP32 AndroidStudio BLE低功耗蓝牙 物联网

    arduino ESP32 AndroidStudio BLE低功耗蓝牙 物联网 nodered开发: esp32采用的蓝牙于普通的蓝牙不同,是低功耗蓝牙,手机用一般的蓝牙代码是连不上的.在本文中,不 ...

  2. ESP32:蓝牙BLE控制M3508电机

    ESP32:蓝牙BLE控制M3508电机 先给各位朋友拜个年,祝大家新春快乐,事事顺利,身体健康啊! 还是熟悉的3508,内容概述: ESP32主控 蓝牙BLE通信 使用实时系统(FreeRTOS) ...

  3. esp32 arduino ble 有时扫描结果不完全的解决方案

    问题描述: 用esp32 做扫描应用时发现一个bug 本来想用esp32做ble扫描我的小米手环3广播信号,,实际操作时发现一个bug 在回调函数中的扫描总是扫描不到设备名???? 翻阅源码后发现 具 ...

  4. BLE协议栈学习2——OSAL

    OSAL简介 BLE 协议栈包含了 BLE 协议所规定的基本功能,这些功能是以函数的形式实现的,为了便于管理 这些函数集,BLE 协议栈内加入了实时操作系统(并非真正意义上的操作系统),称为 OSAL ...

  5. 蓝牙 BLE 协议学习: 有关概念介绍

    背景 在学校内就用过蓝牙技术参加过比赛(并拿了奖):而蓝牙作为物联网中比较常见的协议,有必要进行深入的学习.此后的文章会以 ble(v4.0) 进行学习. 介绍 蓝牙技术最初由电信巨头爱立信公司于 1 ...

  6. 基于ESP32的BLE蓝牙开关

    构思: 蓝牙无线插座的硬件设备为:ESP32-WROOM-32.OLED(Organic Light-Emitting Diode)显示屏模块.继电器.电源转换器.插头部件.插座部件.具体结构如下图所 ...

  7. android ble不配对接收广播数据_蓝牙低功耗(BLE)学习笔记_0

    BLE的体系结构主要由三部分组成,分别是控制器(controller),主机(Host)和应用程序(Application),如下图所示: BLE体系结构 Application layer顾名思义主 ...

  8. esp32~MP3音频文件学习,app架构

    从信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余.音频信号在时域和频域上具有相关性,也即存在数据冗余.将音频作为一个信源,音频编码的实质是减少音频中的冗余. 自然界中的 ...

  9. 系统性简述蓝牙以及ESP32对BLE蓝牙的使用(一)

    这里写自定义目录标题 1.蓝牙简介 1.1 蓝牙分类 1.2 蓝牙技术 1.3 蓝牙协议框架 2.BLE 低功耗蓝牙协议 2.1 BLE协议栈框架 2.2 Link Layer States 2.2. ...

最新文章

  1. php-cgi 重启,自动监测和重启 FastCGI 服务
  2. 《游戏设计师修炼之道:数据驱动的游戏设计》一2.8小结
  3. 一个苏州IT人的5年挨踢经历-------面试篇(之三)
  4. 【转】电驴提示“该内容尚未提供权利证明,无法提供下载”之解决办法详解...
  5. 人工智能最佳学习实践
  6. CopyOnWriteArrayList的addIfAbsent()方法
  7. Vue-cli 3.0+ 设置接口代理 设置vue.config.js的配置项
  8. Android中使用sax解析XML
  9. 支持向量机SVM原理(参数解读和python脚本)
  10. Oracle数据库游标使用大全
  11. uc保存网页html,UC浏览器如何保存网页?UC浏览器保存网页教程图文详解
  12. 基于stm32的减速直流电机PID算法控制
  13. python库源码分析_python第三方库Faker源码解读
  14. 电脑16G内存升级成32G内存日常使用区别大么?
  15. 从数字化视角看飞书产品
  16. 云服务器能像虚拟主机那样,云服务器能像虚拟主机那样
  17. 自动驾驶(七十二)---------LQR控制算法
  18. JVisualVM工具查看Java堆的情况
  19. python中sub是什么意思_在Python中split(),sub(),subn()功能?
  20. 树莓派下利用opencv在图片上画汉字点阵(写一句话)

热门文章

  1. “脑电波”辨别香水喜好,可定制唇色“口红打印机”,AI粉底适配器,新兴美妆元宇宙的探索之旅 | 美通社头条...
  2. python怎么用turtle画同心圆_在Python中用turtle函数画同心圆
  3. mybatis一对多查询的两种方式
  4. js中鼠标滚轮事件详解
  5. 用字符画一个海绵宝宝
  6. 仿微信聊天界面——键盘与面板的切换
  7. JAVA循环语句和跳转语句
  8. 招聘高级Java-Web开发程序员(专职或兼职) - schoolmate
  9. Windows查看当前目录下所有文件夹大小方法
  10. leetcode 1005. Maximize Sum Of Array After K Negations(python)