关于esp32蓝牙模块的使用——esp32学习笔记

关于esp32蓝牙模块的使用——esp32学习笔记

  • 关于esp32蓝牙模块的使用——esp32学习笔记
    • 零、前言
    • 一、经典蓝牙BT
    • 二、低功耗蓝牙BLE()
      • 0.前言
      • 1.首先我们来做一些准备工作
      • 2.创建一个BLE设备
      • 3.创建一个BLE服务
      • 4.创建一个BLE特征
      • 5.开始服务和广播
      • 6.接下来呢在loop函数中我们的蓝牙连接会对应三种状态:

零、前言

esp32自带蓝牙模块可以让我们进行蓝牙连接并进行数据交换

一、经典蓝牙BT

首先来编写代码,经典蓝牙的使用非常简单,首先声明使用了BluetoothSerial这个库,然后使用SerialBT.begin函数设置蓝牙的名字,再然后就是设置配对码,由于这里没有用到配对码,所以我将注释掉。当配对成功我们就使用printf函数打印出蓝牙配对成功。

#include <Arduino.h>
#include <BluetoothSerial.h>BluetoothSerial SerialBT;void setup()
{Serial.begin(115200);SerialBT.begin("BAKUMAN"); // 如果没有参数传入则默认是蓝牙名称是: "ESP32"// SerialBT.setPin("1234");   // 蓝牙连接的配对码Serial.printf("BT initial ok and ready to pair. \r\n");
}void loop()
{if (Serial.available()){SerialBT.write(Serial.read());}if (SerialBT.available()){Serial.write(SerialBT.read());}delay(1);
}

再然后就是loop函数中:

Serial.available()是串口中(演示中为电脑端)收到的信息,如果串口中有数据,就使用蓝牙发送出去。

SerialBT.available()是蓝牙中(演示中为手机端)收到的信息,如果蓝牙中有数据,就发送给串口,串口就会打印出来。

接下来就是演示的截图:

串口发送信息:

蓝牙发送数据:

二、低功耗蓝牙BLE()

0.前言

UUID:ble的服务和characteristic是通过UUID来进行识别的。创建uuid可以使用这么一个网站:Online UUID Generator Tool

notify:如果这个主机的一个特征值characteristic发生改变,就可以通过notify来告诉我们

pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);
//创建一个(读)特征值, 它是通知下发类型的特征值

write:我们可以把特征值定为写入类型, 这样客户端可以给我们写入, 触发写入回调函数

BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);
//创建一个(写)特征, 它是写入类型的特征值pCharacteristic->setCallbacks(new MyCallbacks());
//为特征添加一个回调

使用这个低功耗蓝牙有这么几个步骤:

\1. 创建一个 BLE Server

\2. 创建一个 BLE Service

\3. 创建一个 BLE Characteristic

\4. 创建一个 BLE Descriptor

\5. 开始服务

\6. 开始广播

并且我们还需要使用BLEDevice,BLEServer,BLEUtils,BLE2902,common这几个库

1.首先我们来做一些准备工作

/*Video: https://www.youtube.com/watch?v=oCMOYS71NIUBased on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cppPorted to Arduino ESP32 by Evandro CoperciniCreate a BLE server that, once we receive a connection, will send periodic notifications.创建一个BLE服务器,一旦我们收到连接,将会周期性发送通知T使用步骤:1. 创建一个 BLE Server2. 创建一个 BLE Service3. 创建一个 BLE Characteristic4. 创建一个 BLE Descriptor5. 开始服务6. 开始广播*/
#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include "common.h"uint8_t txValue = 0;                         //后面需要发送的值
BLEServer *pServer = NULL;                   //BLEServer指针 pServer
BLECharacteristic *pTxCharacteristic = NULL; //BLECharacteristic指针 pTxCharacteristic
bool deviceConnected = false;                //本次连接状态
bool oldDeviceConnected = false;             //上次连接状态// See the following for generating UUIDs: https://www.uuidgenerator.net/
#define SERVICE_UUID "12a59900-17cc-11ec-9621-0242ac130002" // UART service UUID
#define CHARACTERISTIC_UUID_RX "12a59e0a-17cc-11ec-9621-0242ac130002"
#define CHARACTERISTIC_UUID_TX "12a5a148-17cc-11ec-9621-0242ac130002"//注意这里面是用class MyServerCallbacks : public BLEServerCallbacks
{void onConnect(BLEServer *pServer){deviceConnected = true;};void onDisconnect(BLEServer *pServer){deviceConnected = false;}
};class MyCallbacks : public BLECharacteristicCallbacks
{void onWrite(BLECharacteristic *pCharacteristic){std::string rxValue = pCharacteristic->getValue(); //接收信息if (rxValue.length() > 0){ //向串口输出收到的值Serial.print("RX: ");for (int i = 0; i < rxValue.length(); i++)Serial.print(rxValue[i]);Serial.println();}}
};

2.创建一个BLE设备

 BLEDevice::init(ble_name);

3.创建一个BLE服务

    pServer = BLEDevice::createServer();pServer->setCallbacks(new MyServerCallbacks()); //设置回调BLEService *pService = pServer->createService(SERVICE_UUID);

在这里面的回调函数就是上面代码串中的MyServerCallbacks

4.创建一个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()); //设置回调

这里创建了一个特征值,类型是通知。

在后面使用createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE)将rx收集到的信息写入,通过MyCallbacks再打印出来

为了实现"串口",我们在这个服务下添加了两个特征值, 一个是TX. 一个是RX.另外还需注意三个uuid因该是相对应的值。

5.开始服务和广播

    pService->start();                  // 开始服务pServer->getAdvertising()->start(); // 开始广播Serial.println(" 等待一个客户端连接,且发送通知... ");

6.接下来呢在loop函数中我们的蓝牙连接会对应三种状态:

(1)设备已经连接:

if (deviceConnected){pTxCharacteristic->setValue(&txValue, 1); // 设置要发送的值为1pTxCharacteristic->notify();              // 广播txValue++;                                // 指针数值自加1delay(2000);                              // 如果有太多包要发送,蓝牙会堵塞}

这里面测试的是不停发送数据,每发一次数值加一。

此时

class MyServerCallbacks : public BLEServerCallbacks
{void onConnect(BLEServer *pServer){deviceConnected = true;};void onDisconnect(BLEServer *pServer){deviceConnected = false;}
};

通过这个回调可以说清楚这个蓝牙到底有没有连接,如果连接了通过

pServer->setCallbacks(new MyServerCallbacks());

这个MyServerCallbacks回调就可以返回连接状态。

调式结果如图:

ble串口:

ble开始广播

最后附上整段代码:

/*Video: https://www.youtube.com/watch?v=oCMOYS71NIUBased on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cppPorted to Arduino ESP32 by Evandro CoperciniCreate a BLE server that, once we receive a connection, will send periodic notifications.创建一个BLE服务器,一旦我们收到连接,将会周期性发送通知T使用步骤:1. 创建一个 BLE Server2. 创建一个 BLE Service3. 创建一个 BLE Characteristic4. 创建一个 BLE Descriptor5. 开始服务6. 开始广播*/
#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include "common.h"uint8_t txValue = 0;                         //后面需要发送的值
BLEServer *pServer = NULL;                   //BLEServer指针 pServer
BLECharacteristic *pTxCharacteristic = NULL; //BLECharacteristic指针 pTxCharacteristic
bool deviceConnected = false;                //本次连接状态
bool oldDeviceConnected = false;             //上次连接状态d
// See the following for generating UUIDs: https://www.uuidgenerator.net/
#define SERVICE_UUID "12a59900-17cc-11ec-9621-0242ac130002" // UART service UUID
#define CHARACTERISTIC_UUID_RX "12a59e0a-17cc-11ec-9621-0242ac130002"
#define CHARACTERISTIC_UUID_TX "12a5a148-17cc-11ec-9621-0242ac130002"class MyServerCallbacks : public BLEServerCallbacks
{void onConnect(BLEServer *pServer){deviceConnected = true;};void onDisconnect(BLEServer *pServer){deviceConnected = false;}
};class MyCallbacks : public BLECharacteristicCallbacks
{void onWrite(BLECharacteristic *pCharacteristic){std::string rxValue = pCharacteristic->getValue(); //接收信息if (rxValue.length() > 0){ //向串口输出收到的值Serial.print("RX: ");for (int i = 0; i < rxValue.length(); i++)Serial.print(rxValue[i]);Serial.println();}}
};void setup()
{Serial.begin(115200);// 创建一个 BLE 设备BLEDevice::init("BAKUMAN");//在这里面是ble的名称// 创建一个 BLE 服务pServer = BLEDevice::createServer();pServer->setCallbacks(new MyServerCallbacks()); //设置回调BLEService *pService = pServer->createService(SERVICE_UUID);// 创建一个 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()); //设置回调pService->start();                  // 开始服务pServer->getAdvertising()->start(); // 开始广播Serial.println(" 等待一个客户端连接,且发送通知... ");
}void loop()
{// deviceConnected 已连接if (deviceConnected){pTxCharacteristic->setValue(&txValue, 1); // 设置要发送的值为1pTxCharacteristic->notify();              // 广播txValue++;                                // 指针数值自加1delay(2000);                              // 如果有太多包要发送,蓝牙会堵塞}// disconnecting  断开连接if (!deviceConnected && oldDeviceConnected){delay(500);                  // 留时间给蓝牙缓冲pServer->startAdvertising(); // 重新广播Serial.println(" 开始广播 ");oldDeviceConnected = deviceConnected;}// connecting  正在连接if (deviceConnected && !oldDeviceConnected){// do stuff here on connectingoldDeviceConnected = deviceConnected;}
}

关于esp32蓝牙模块的使用——esp32学习笔记相关推荐

  1. 物联网|蓝牙4.0BLE协议栈简介|IAR集成开发环境简介|IAR各版本下载链接|物联网之蓝牙4.0 BLE基础-学习笔记(2)

    文章目录 3.蓝牙4.0BLE协议栈简介 Tips: BLE协议结构图介绍 Tips IAR各版本下载链接 3.蓝牙4.0BLE协议栈简介 问题: 1.什么是LE协议栈?BLE协识栈与BLE协议的关系 ...

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

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

  3. java 模块设计模式_Java9模块化学习笔记二之模块设计模式

    模块设计的原则: 1.防止出现编译时循环依赖(主要是编译器不支持),但运行时是允许循环依赖的,比如GUI应用 2.明确模块的边界 几种模块设计: API模块,聚合模块(比如java.base) 可选依 ...

  4. numpy.random 模块中文文档学习笔记

    1 numpy.random.randint() 整数随机,指定上下界,左闭右开 np.random.randint(1, size=10) >>> array([0, 0, 0, ...

  5. Python学习笔记:常用第三方模块3

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. Python学习笔记:第三方模块2

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. Python学习笔记:常用第三方模块(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. Python学习笔记:常用内建模块7XML

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  9. Python学习笔记:常用内建模块6 (urllib)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. NativeXml (1):下载、安装、测试
  2. points.checkVector(2, CV_32S) >= 0 in function ‘cv::fillConvexPoly‘
  3. background-position 详解
  4. 访问远程Visdom
  5. SIR模型和Python实现
  6. array转list_Java面试题Array和ArrayList有何区别?
  7. MSCRM与MS人立方关系的集成
  8. java 租房系统源码,JAVA房屋出租管理系统
  9. julia常用矩阵函数_Julia语言入门
  10. VirtualBox Linux网络配置
  11. xshell 批量创建.xsh会话文件
  12. directshow使用Sample Grabber采样
  13. 屏幕小于6英寸的手机_6英寸是多大?6英寸是多少厘米?
  14. 牛客网软件测试面试题总结
  15. Python基础嘚吧嘚
  16. MapReduce总结
  17. Suzy找到实习了吗Day 8 | 字符串开始啦 344. 反转字符串,541. 反转字符串 II,剑指 Offer 05. 替换空格,151. 反转字符串中的单词,左旋转字符串
  18. 基于ensp的网络设计【实现网络互联、限制访问、内外网地址转换】
  19. 97年黑客设计大赛中冠军作品
  20. SpeedMent入门集成SpringBootStream常见操作

热门文章

  1. 教你怎么去创建一个代币!
  2. Keil5 平台 S3C2440裸机程序开发-----中断系统/UART
  3. 龙芯3A5000参数 龙芯3A5000怎么样
  4. Android前端判断敏感词汇
  5. 单摆测重力加速度的算法(Python)
  6. dct图像压缩c语言实现,DCT变换在图像压缩中的实现
  7. QT 软键盘实现
  8. ListView 仿QQ微信侧滑出现删除按钮
  9. 中金公司:券商IT广阔天际 明月不出群星闪耀
  10. 美国高考能不能带计算机,这件“神器”在美国被高中允许却被美国大学禁止