ESP32低功耗蓝牙BLE通信

ESP32低功耗蓝牙BLE通信

    • 蓝牙分类
    • GATT协议
    • GATT角色
    • ESP32蓝牙简介
    • ESP32开发板作为BLE服务设备或扫描设备
    • 手机APP连接作为BLE Server的ESP32
    • 总结

蓝牙分类

经典蓝牙Classic Bluetooth):用于数据量比较大的传输,如:图像、视频、音乐等。

低功耗蓝牙(Bluetooth Low Energy):用于实时性要求比较高但数据速率比较低的产品,如智能穿戴设备、遥控类的,鼠标,键盘,还有传感设备的数据发送,如心跳带,血压计,温湿度传感器等。
还支持广播模式(一对多)和组网。

蓝牙分为单模和双模蓝牙。
单模蓝牙:只支持经典蓝牙(EDR/BDR基本速率/增强数据速率);只支持低功耗蓝牙(BTLE);
双模蓝牙:支持经典蓝牙(EDR/BDR)+低功耗蓝牙(BTLE)。

蓝牙从4.0开始就集成了经典蓝牙和低功耗蓝牙两个标准,并不只是低功耗蓝牙。低功耗蓝牙设备和经典蓝牙设备两者之间是不能相互通信的,如果主设备是低功耗蓝牙设备,从设备也必须是低功耗蓝牙设备;同样,经典蓝牙的从设备也只能和经典蓝牙的主设备进行通信。
在这里插入图片描述

GATT协议

GATT (Generic Attribute Profile) 是蓝牙低功耗 (Bluetooth Low Energy, BLE) 协议栈中的一部分,它定义了 BLE 设备之间交换数据的格式和规范。

GATT 是基于属性 (attribute) 和服务 (service) 的概念,通过将数据封装在属性中,从而实现设备之间的通信。

在 GATT 中,一个服务表示一个特定的功能,一个服务可以包含多个属性。每个属性都有一个唯一的标识符 (UUID),可以用来识别它们。属性的性质(Properties)可以是只读的 (Read),也可以是可写的 (Write),通知(notify), 广播(broadcast), 指示(indicate)等。属性还可以包含一个描述符 (Descriptor),用于描述属性的特性和值。描述符是可选的,但是它们可以提供关于属性的额外信息,例如范围、单位或名称。

GATT 使用基于请求-响应模型的通信方式。当一个设备想要读取或写入属性时,它会发送一个请求给另一个设备,请求的格式包含要访问的属性的 UUID 和操作类型 (读或写)。接收方设备会根据请求返回响应消息,其中包含请求的数据,或者在写入操作时返回确认消息。GATT 还定义了一些通用的属性和服务,例如设备信息服务 (Device Information Service)、电池服务 (Battery Service) 等,这些服务可以让开发人员更容易地实现常见的功能。

下图举例展示了GATT各层概念之间的包含关系:
在这里插入图片描述

GATT角色

在 GATT 中,存在两种角色:GATT Server 和 GATT Client。
在这里插入图片描述

(1)GATT Server
是指具有 GATT 数据的设备,它可以被 GATT Client 连接并提供服务。GATT Server 存储着一个或多个服务,每个服务都包含一个或多个属性。当 GATT Client 连接到 GATT Server 时,它可以通过 GATT 协议来访问服务和属性。GATT Server 需要响应 GATT Client 的请求,例如读取和写入属性值。
(2)GATT Client
是指需要访问 GATT Server 的设备。GATT Client 可以扫描周围的 BLE 设备,找到包含 GATT 数据的设备,并连接到它们。一旦连接建立,GATT Client 可以通过 GATT 协议来读取和写入 GATT Server 上的服务和属性。例如,GATT Client 可以读取一个温度传感器的属性值,或者写入一个 LED 灯的属性值。

一个设备既可以作为 GATT Server,也可以作为 GATT Client。例如,一个智能手表可以作为 GATT Server,提供心率监测服务;同时,它也可以作为 GATT Client 连接到另一个设备,例如智能手机,以获取其他服务的数据,如来自手机的通知。

ESP32蓝牙简介

在这里插入图片描述

ESP32-WROOM-32模组集成了双模蓝牙包括传统蓝牙(BR/EDR)、低功耗蓝牙(BLE)和 Wi-Fi,具有广泛的用途:Wi-Fi 支持极大范围的通信连接,也支持通过路由器直接连接互联网;而蓝牙可以让用户连接手机或者广播 Bluetooth LE Beacon 以便于信号检测。
蓝牙特性:
• 支持标准 Class-1、Class-2 和 Class-3,且无需外部功率放大器
• 增强型功率控制 (Enhanced Power Control)
• 输出功率高达 +9 dBm
• NZIF 接收器具有–94 dBm 的 BLE 接收灵敏度
• 自适应跳频 (AFH)
• 基于 SDIO/SPI/UART 接口的标准 HCI
• 高速 UART HCI,最高可达 4 Mbps
• 支持蓝牙 4.2 BR/EDR 和 Bluetooth LE 双模 controller
• 同步面向连接/扩展同步面向连接 (SCO/eSCO)
• CVSD 和 SBC 音频编解码算法
• 蓝牙微微网 (Piconet) 和散射网 (Scatternet)
• 支持传统蓝牙和低功耗蓝牙的多设备连接
• 支持同时广播和扫描
开发板集成Type-C USB转TTL串口芯片CH343可以实现一键串口下载程序和串口打印。

ESP32开发板作为BLE服务设备或扫描设备

一个ESP32开发板作为BLE Server,Arduino IDE打开开发板的BLE_server示例程序,并上传至开发板。
在这里插入图片描述

/*Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleServer.cppPorted to Arduino ESP32 by Evandro Coperciniupdates by chegewara
*/#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>// See the following for generating UUIDs:
// https://www.uuidgenerator.net/#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"void setup() {Serial.begin(115200);Serial.println("Starting BLE work!");BLEDevice::init("Long name works now");BLEServer *pServer = BLEDevice::createServer();BLEService *pService = pServer->createService(SERVICE_UUID);BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID,BLECharacteristic::PROPERTY_READ |BLECharacteristic::PROPERTY_WRITE);pCharacteristic->setValue("Hello World says Neil");pService->start();// BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibilityBLEAdvertising *pAdvertising = BLEDevice::getAdvertising();pAdvertising->addServiceUUID(SERVICE_UUID);pAdvertising->setScanResponse(true);pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issuepAdvertising->setMinPreferred(0x12);BLEDevice::startAdvertising();Serial.println("Characteristic defined! Now you can read it in your phone!");
}void loop() {// put your main code here, to run repeatedly:delay(2000);
}

在这里插入图片描述

另一个ESP32开发板作为BLE Scanner,扫描周围环境存在的蓝牙设备,Arduino IDE打开开发板的BLE_scan示例程序,并上传至开发板。

/*Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cppPorted to Arduino ESP32 by Evandro Copercini
*/#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>int scanTime = 5; //In seconds
BLEScan* pBLEScan;class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {void onResult(BLEAdvertisedDevice advertisedDevice) {Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());}
};void setup() {Serial.begin(115200);Serial.println("Scanning...");BLEDevice::init("");pBLEScan = BLEDevice::getScan(); //create new scanpBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());pBLEScan->setActiveScan(true); //active scan uses more power, but get results fasterpBLEScan->setInterval(100);pBLEScan->setWindow(99);  // less or equal setInterval value
}void loop() {// put your main code here, to run repeatedly:BLEScanResults foundDevices = pBLEScan->start(scanTime, false);Serial.print("Devices found: ");Serial.println(foundDevices.getCount());Serial.println("Scan done!");pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memorydelay(2000);
}

在这里插入图片描述

手机APP连接作为BLE Server的ESP32

手机浏览器搜索下载安装“nRF Connect for Mobile”软件APP,并和作为BLE Sever的ESP32开发板连接
在这里插入图片描述

总结

通过本实验我们了解了ESP32的BLE基础概念和简单的使用,在此基础上ESP32搭载一些传感器,可以通过BLE实现两个ESP32的数据传输或ESP32和手机进行人机信息交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/139086.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

GaussDB技术解读系列:性能调优

近日&#xff0c;在第14届中国数据库技术大会&#xff08;DTCC2023&#xff09;的GaussDB“五高两易”核心技术&#xff0c;给世界一个更优选择专场&#xff0c;华为数据库技术专家李士福详细解读了GaussDB性能调优的相关技术和应用实践。 本篇为大家分享GaussDB性能调优的实践…

网络爬虫——HTTP和HTTPS的请求与响应原理

目录 一、HTTP的请求与响应 二、浏览器发送HTTP请求的过程 三、HTTP请求方法 四、查看网页请求 五、常用的请求报头 六、服务端HTTP响应 七、常用的响应报头 八、Cookie 和 Session 九、响应状态码 十、网页的两种加载方法 十一、认识网页源码的构成 十二、爬虫协议…

【大数据开发技术】实验04-HDFS文件创建与写入

文章目录 一、实验目标二、实验要求三、实验内容四、实验步骤 一、实验目标 熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS原理熟练掌握HDFS的API使用方法掌握单个本地文件写入到HDFS文件的方法掌握多个本地文件批量写入到HDFS文件的方法 二、实验要求 给出主要实验步骤成…

uniapp——ios证书申请——详细步骤+遇到的坑——技能提升

三年前&#xff0c;我曾经写过uniapp的程序&#xff0c;时隔三年&#xff0c;又遇到了uniapp的需求&#xff0c;之前没有自行申请ios证书&#xff0c;现在终于要自己生成证书了。。。 是福不是祸&#xff0c;是祸躲不过。 uniapp生成ios证书的详细步骤 uniapp对接unipush的操作…

buuctf web [ACTF2020 新生赛]Upload

明了但不明显的文件上传 传个试试 行&#xff0c;抓包吧&#xff0c;php格式不行&#xff0c;就先上传要求的格式&#xff1a;jpg、png、gif 抓到上传的包之后&#xff0c;再修改成我们想要的 常见的php格式绕过有&#xff1a;php,php3,php4,php5,phtml,pht 挨个试试 这是上个…

第九章 常用服务器的搭建

第九章 常用服务器的搭建 1.配置FTP服务器 1.1.FTP简介 ​ FTP&#xff08;File Transfer Protocol&#xff0c;文件传送协议&#xff09;是TCP/IP网络上两台计算机间传送文件的协议&#xff0c;FTP是在TCP/IP网络和Internet上最早使用的协议之一&#xff0c;它属于网络协议…

【pytest】conftest.py使用

1. 创建test_project 目录 test_project/sub/test_sub.py def test_baidu(test_url):print(fsub {test_url}) test_project/conftest.py 设置钩子函数 只对当前目录 和子目录起作用 import pytest #设置测试钩子函数 pytest.fixture() def test_url():return "http…

可以创业,也可以副业的网上长期挣钱的项目

在这个飞速发展的互联网时代&#xff0c;越来越多的人开始尝试在网上创业或者寻找一份可持续的副业来增加收入。不过在网上赚钱的难度是比较大的&#xff0c;不是轻易就能做到的&#xff0c;所以不付出一番努力&#xff0c;没有悟性和执行力&#xff0c;那么是很难做好的&#…

淘天集团联合爱橙科技开源大模型训练框架Megatron-LLaMA

9月12日&#xff0c;淘天集团联合爱橙科技正式对外开源大模型训练框架——Megatron-LLaMA&#xff0c;旨在让技术开发者们能够更方便地提升大语言模型训练性能&#xff0c;降低训练成本&#xff0c;并保持和LLaMA社区的兼容性。测试显示&#xff0c;在32卡训练上&#xff0c;相…

pytorch环境搭建到pycharm项目映射配置(成功后回顾性记录/自用)

利用Anaconda创建pytorch虚拟环境 前提&#xff1a;成功安装Anaconda&#xff0c;确保可以打开NVIDIA控制面板 开始-》搜索“Anaconda Prompt” 打开后输入&#xff1a;conda create -n 你的虚拟环境名 python3.9。输入y&#xff0c;继续安装&#xff0c;完成。 输入&#…

【STM32学习】I2C通信协议 | OLED屏

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《STM32学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 今天需要将代码烧录到开发板中&#xff0c;本喵默认大家都会创建工程&#xff0c;以及进行基本的…

A股风格因子看板 (2023.09 第07期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第7期&#xff0c;指数组合数据截止日2023-08-31&#xff0c;要点如下 近1年A股风格因子收益走…

【ELFK】之消息队列kafka

一、kafka的定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。Kafka 是最初由 Linkedin 公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff0…

ImageJ查看图像灰度值矩阵及像素编号从0开始

ImageJ查看图像灰度值矩阵 imagej打开一幅图像 然后image —— transform——image to results&#xff0c;等一下就会出现灰度值矩阵 我读取的如下&#xff0c;可以看出&#xff0c;imagej对像素的编号是从0开始的&#xff0c;切记&#xff01;&#xff01;&#xff01;跟C/…

编译原理.龙书学习1

第一章&#xff1a; 编译器&#xff1a;将程序翻译成一种能够被计算机执行的形式 解释器&#xff1a;解释器直接利用用户提供的输入执行源程序中指定的操作 一个编译器的结构 编译器将源程序映射为语义上等价的目标程序&#xff0c;这个映射过程由两部分组成&#xff1a;分析…

MyBatis友人帐之ResultMap及分页

一、ResultMap 1.1查询为null问题 要解决的问题&#xff1a;属性名和字段名不一致 解决方案 方案一&#xff1a;为列名指定别名 , 别名和java实体类的属性名一致 . <select id"selectUserById" resultType"User">select id , name , pwd as passwor…

【PyTorch 攻略 (4/7)】张量和梯度函数

一、说明 W在训练神经网络时&#xff0c;最常用的算法是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;根据损失函数相对于给定参数的梯度进行调整。损失函数计算神经网络产生的预期输出和实际输出之间的差异。 目标是获得尽可能接近零的损失函…

QUIC协议报文解析(三)

在前面的两篇文字里我们简单介绍了QUIC的发展历史&#xff0c;优点以及QUIC协议的连接原理。本篇文章将会以具体的QUIC报文为例&#xff0c;详细介绍QUIC报文的结构以及各个字段的含义。 早期QUIC版本众多&#xff0c;主要有谷歌家的gQUIC&#xff0c;以及IETF致力于将QUIC标准…

打印由数字组成的金字塔图案——python

1222 33333 4444444 555555555打印由数字组成的金字塔图案。但n9时&#xff0c;如下图所示。 输入格式: 输入一个整数n&#xff08;1<A<9&#xff09;。 输出格式: 输出由数字组成的金字塔图案。 输入样例: 在这里给出一组输入。例如&#xff1a; 5输出样例: 在这…

【 2023华为杯C题】大规模创新类竞赛评审方案研究(思路、代码......)

目录 1 题目概述 2 问题 3 极差的定义及标准分的计算方法 4 题目及数据下载 5 思路、代码下载...... 1 题目概述 现在创新类竞赛很多&#xff0c;其中规模较大的竞赛&#xff0c;一般采用两阶段&#xff08;网评、现场评审&#xff09;或三阶段&#xff08;网评、现场评审…