• 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程序

    所需库文件

    1. #include
    2. #include
    3. #include
    4. #include

    程序说明

    (1)定义service和characteristic UUID:

    1. // See the following for generating UUIDs: https://www.uuidgenerator.net/
    2. #define SERVICE_UUID "06CDF89C-005D-4899-998B-6C7E8F48AEF5" // UART service UUID
    3. #define CHARACTERISTIC_UUID_RX "4b88ba09-d579-4823-ba39-3b01cd0d2481"
    4. #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. 开始广播,以便其他设备可以找到它

    1. uint8_t txValue = 0; // 要发送的值,先不用管
    2. BLEServer *pServer = NULL; // BLEServer指针 pServer
    3. BLECharacteristic *pTxCharacteristic = NULL; // BLECharacteristic指针 pTxCharacteristic
    4. bool deviceConnected = false; //本次连接状态
    5. bool oldDeviceConnected = false; //上次连接状态
    1. pServer = BLEDevice::createServer(); // 创建BLE服务(只有一个)
    2. pServer->setCallbacks(new MyServerCallbacks()); //设置回调
    3. 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的客户端扫描到。
    1. BLEDevice::init("MyESP32");
    2. BLEServer *pServer = BLEDevice::createServer();
    3. BLEService *pService = pServer->createService(SERVICE_UUID);
    4. BLECharacteristic *pCharacteristic = pService->createCharacteristic(
    5. CHARACTERISTIC_UUID,
    6. BLECharacteristic::PROPERTY_READ |
    7. BLECharacteristic::PROPERTY_WRITE
    8. );

     Characteristic赋个初始值:

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

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

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

     ②BLE Client端

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

    (4)创建一个BLE特征:

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

    (5)设置回调函数:

    1. // 回调函数,让连接状态发送改变,重点!
    2. class MyServerCallbacks : public BLEServerCallbacks
    3. {
    4. void onConnect(BLEServer *pServer) // 开始连接
    5. {
    6. deviceConnected = true; // 连接成功
    7. };
    8. void onDisconnect(BLEServer *pServer) // 断开连接
    9. {
    10. deviceConnected = false; // 设备连接错误
    11. }
    12. };

    (6)启动广播:

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

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

    1. void loop()
    2. {
    3. // deviceConnected 已连接
    4. if (deviceConnected)
    5. {
    6. pTxCharacteristic->setValue(&txValue, 1); // 设置要发送的值为1
    7. pTxCharacteristic->notify(); // 广播
    8. txValue++; // 数值加1,然后取地址
    9. delay(2000); // 如果有太多包要发送,蓝牙会堵塞
    10. }
    11. // disconnecting 断开连接
    12. if (!deviceConnected && oldDeviceConnected)
    13. {
    14. delay(500); // 留时间给蓝牙缓冲
    15. pServer->startAdvertising(); // 重新广播
    16. Serial.println(" 开始广播 ");
    17. oldDeviceConnected = deviceConnected;
    18. }
    19. // connecting 正在连接
    20. if (deviceConnected && !oldDeviceConnected)
    21. {
    22. // do stuff here on connecting
    23. oldDeviceConnected = deviceConnected;
    24. }
    25. }

    重要参考程序:

    (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博客

  • 相关阅读:
    前端工程师的摸鱼日常(17)
    图论 - 最小生成树(Prime、Kruskal)
    【计算机网络】网络编程接口 Socket API 解读(5)
    2022第四季度的机遇,Genesis Universe限量卡牌争夺战开启
    【算法】查找类——二分查找算法
    猿创征文|date-fns 毫秒助手函数
    分布式事务
    CPG 固体支持物研究:Lumiprobe通用 CPG II 型
    TLS 的证书验证过程
    Soft:Eric软件界面的简介、案例应用之详细攻略
  • 原文地址:https://blog.csdn.net/qq_45355603/article/details/127933143