低功耗藍芽-BLE-ESP32

 什麼是低功耗藍牙?

低功耗藍牙,簡稱 BLE,是藍牙的一種節能變體。 BLE 的主要應用是短距離傳輸少量數據(低帶寬)。與始終開啟的藍牙不同,BLE 始終處於睡眠模式,除非發起連接。

這使得它消耗非常低的功率。 BLE 的功耗比藍牙低約 100 倍(取決於用例)。
由於其特性,BLE 適用於需要交換在鈕扣電池上定期運行的少量數據的應用程序。例如,BLE 在醫療保健、健身、跟踪、信標、安全和家庭自動化行業中非常有用。



BLE-Server和Client

使用低功耗藍牙,有兩種類型的設備:服務器和客戶端。 ESP32 既可以作為客戶端,也可以作為服務器。

服務器通告它的存在,因此它可以被其他設備發現,並且包含客戶端可以讀取的數據。客戶端掃描附近的設備,當它找到它正在尋找的服務器時,它會建立一個連接並監聽傳入的數據。這稱為點對點通信。

如前所述,BLE 還支持廣播模式和網狀網絡:

廣播模式:服務器向多個連接的客戶端傳輸數據;
網狀網絡:所有設備都連接起來,這是一個多對多的連接。
儘管可以實現廣播和網狀網絡設置,但它們是最近開發的,因此目前為 ESP32 實現的示例並不多。

GATT

GATT 代表通用屬性,它定義了暴露給連接的 BLE 設備的分層數據結構。這意味著 GATT 定義了兩個 BLE 設備發送和接收標準消息的方式。了解此層次結構很重要,因為這樣可以更輕鬆地了解如何使用 BLE 和編寫應用程序。


這些屬性描述瞭如何與特徵值交互。基本上,它包含可以與特徵一起使用的操作和過程:
播送

寫無響應

通知
表明
經過身份驗證的簽名寫入
擴展屬性

使用範例檔的"寫入"



/*
    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleWrite.cpp
    Ported to Arduino ESP32 by Evandro Copercini
*/

#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"


class MyCallbackspublic BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();

      if (value.length() > 0) {
        Serial.println("*********");
        Serial.print("New value: ");
        for (int i = 0i < value.length(); i++)
          Serial.print(value[i]);

        Serial.println();
        Serial.println("*********");
      }
    }
};

void setup() {
  Serial.begin(115200);

  Serial.println("1- Download and install an BLE scanner app in your phone");
  Serial.println("2- Scan for BLE devices in the app");
  Serial.println("3- Connect to MyESP32");
  Serial.println("4- Go to CUSTOM CHARACTERISTIC in CUSTOM SERVICE and write something");
  Serial.println("5- See the magic =)");

  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
                                       );

  pCharacteristic->setCallbacks(new MyCallbacks());

  pCharacteristic->setValue("Hello World");
  pService->start();

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

void loop() {
  // put your main code here, to run repeatedly:
  delay(2000);
}

解析

首先導入 BLE 功能所需的庫

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

然後,您需要為 Service 和 Characteristic 定義一個 UUID,也可以流用內訂的UUID
或要自己創建自己的UUID可以到這個網站https://www.uuidgenerator.net/

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

接收字串的類
class MyCallbackspublic BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();

      if (value.length() > 0) {
        Serial.println("*********");
        Serial.print("New value: ");
        for (int i = 0i < value.length(); i++)
          Serial.print(value[i]);

        Serial.println();
        Serial.println("*********");
      }
    }
};

在 setup() 中,它以 115200 的波特率啟動串行通信

Serial.begin(115200);

創建一個名為“MyESP32”的 BLE 設備。您可以將此名稱更改為您喜歡的任何名稱。

BLEDevice::init("MyESP32");

在以下行中,您將 BLE 設備設置為服務器。

BLEServer *pServer = BLEDevice::createServer();

在這之後,你的BLE服務器創建的UUID前面定義的服務。

BLEService *pService = pServer->createService(SERVICE_UUID);

設置該服務的特徵。如您所見,您還使用了之前定義的 UUID,您需要將特徵的屬性作為參數傳遞。在這種情況下,它是:讀和寫。

BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

創建setCallbacks() 方法接收傳來的值或字串

pCharacteristic->setCallbacks(new MyCallbacks());

創建特徵後,您可以使用 setValue() 方法設置其值。
我們將值設置為文本“Hello World 說 Neil”。您可以將此文本更改為您喜歡的任何內容。例如,在未來的項目中,該文本可以是傳感器讀數或燈的狀態。

pCharacteristic->setValue("Hello World");

最後,您可以啟動服務,並進行廣告,以便其他 BLE 設備可以掃描並找到此 BLE 設備

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

上傳完成之後,打開監測窗口,按一下ESP32的RESET,會出現以下畫面

下載手機APP nRF Connect 並開啓APP
按下SEND後

















































































































留言

這個網誌中的熱門文章