低功耗藍芽-BLE-ESP32


低功耗藍芽-BLE-ESP32

tags: esp32 BLE

什麼是低功耗藍牙?

低功耗藍牙,簡稱 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 MyCallbacks: public BLECharacteristicCallbacks {

    void onWrite(BLECharacteristic *pCharacteristic) {

      std::string value = pCharacteristic->getValue();

      if (value.length() > 0) {

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

        Serial.print("New value: ");

        for (int i = 0; i < 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 MyCallbacks: public BLECharacteristicCallbacks {

    void onWrite(BLECharacteristic *pCharacteristic) {

      std::string value = pCharacteristic->getValue();

      if (value.length() > 0) {

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

        Serial.print("New value: ");

        for (int i = 0; i < value.length(); i++)

          Serial.print(value\[i\]);

        Serial.println();

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

      }
    }
};

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

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 設備**

  
```cpp
BLEAdvertising *pAdvertising = pServer->getAdvertising();

  pAdvertising->start();

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

下載手機APP nRF Connect 並開啓APP

按下SEND後

參考-https://randomnerdtutorials.com/esp32-bluetooth-low-energy-ble-arduino-ide/


文章作者: blairan
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 blairan !
评论
  目錄