低功耗藍芽-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 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 的波特率啟動串行通信
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後
留言
張貼留言