ESP32 Chế Độ Tiết Kiệm Năng Lượng (BLE).
PHẦN 1: Giới thiệu Bluetooth năng lượng thấp BLE.
- 2 Thiết bị 2 hay 2 device giao tiếp với nhau thông qua chế độ BLE tiết kiệm năng lượng, dùng PIN.
- 2 Thiết bị giao tiếp qua Bluetooth.
Ngoài ra, BLE không chỉ hỗ trợ giao tiếp điểm-điểm mà còn hỗ trợ chế độ quảng bá và mạng lưới.( điểm với điểm có nghĩa là 2 ESP32 giao tiếp với nhau, hoặc 1 ESP32 với 1 Module Blutooth khác vd HC-05R).
- Chế độ BLE Được ứng dụng trong việc trao đổi giữ liệu nhỏ, ví dụ như đo nhịp tim truyền từ bệnh nhân sang điện thoại ( sử dụng Blutooth điện thoại để giao tiếp Blutooth esp32).hay 1 số thiết bị điện tử hiện nay đang sử dụng như đồng hồ ... : BLE được sử dụng nhiều trong các ngành chăm sóc sức khỏe, thể dục, theo dõi, báo hiệu, bảo mật và tự động hóa gia đình
Phần 2: BLE Server and Client ( BLE máy chủ và máy khách).
Máy chủ quảng cáo sự tồn tại của nó để các thiết bị khác có thể tìm thấy nó và chứa dữ liệu mà máy khách có thể đọc. Máy khách quét các thiết bị lân cận và khi tìm thấy máy chủ mà nó đang tìm kiếm, nó sẽ thiết lập kết nối và lắng nghe dữ liệu đến. Đây được gọi là giao tiếp điểm-điểm.
Như đã đề cập trước đây, BLE cũng hỗ trợ chế độ quảng bá và mạng lưới:
- Chế độ quảng bá: (Broadcast mode: )máy chủ truyền dữ liệu đến nhiều máy khách được kết nối với nhau;
- Mạng lưới:(Mesh network) tất cả các thiết bị được kết nối, đây là kết nối nhiều đến nhiều.
Mặc dù có thể triển khai thiết lập mạng lưới quảng bá và mạng lưới, nhưng chúng đã được phát triển rất gần đây, do đó, không có nhiều ví dụ được triển khai cho ESP32 tại thời điểm này.
GATT
BLE Service
Cấp cao nhất của hệ thống phân cấp là một hồ sơ, bao gồm một hoặc nhiều dịch vụ. Thông thường, một thiết bị BLE chứa nhiều hơn một dịch vụ.
Mỗi dịch vụ đều chứa ít nhất một đặc tính, hoặc cũng có thể tham chiếu đến các dịch vụ khác. Một dịch vụ chỉ đơn giản là một tập hợp thông tin, chẳng hạn như các chỉ số cảm biến.
Có các dịch vụ được xác định trước cho một số loại dữ liệu được xác định bởi SIG (Nhóm sở thích đặc biệt của Bluetooth) như: Mức pin, Huyết áp, Nhịp tim, Thang cân, v.v. Bạn có thể kiểm tra tại đây các dịch vụ được xác định khác.
Một số dịch vụ :
BLE Characteristic
Đặc tính luôn được sở hữu bởi một dịch vụ và nó là nơi chứa dữ liệu thực tế trong hệ thống phân cấp (giá trị). Đặc tính luôn có hai thuộc tính: khai báo đặc trưng (cung cấp siêu dữ liệu về dữ liệu) và giá trị đặc trưng.
Ngoài ra, giá trị đặc trưng có thể được theo sau bởi các bộ mô tả, mở rộng hơn nữa trên siêu dữ liệu có trong khai báo đặc trưng.
Các thuộc tính mô tả cách tương tác với giá trị đặc trưng. Về cơ bản, nó chứa các thao tác và thủ tục có thể được sử dụng với đặc điểm:
- Broadcast
- Read
- Write without response
- Write
- Notify
- Indicate
- Authenticated Signed Writes
- Extended Properties
UUID
Mỗi dịch vụ, đặc tính và bộ mô tả có một UUID (Số nhận dạng duy nhất phổ biến). UUID là một số 128 bit (16 byte) duy nhất. Ví dụ:
55072829-bc9e-4c53-938a-74a6d4c78779
Nhưng nếu ứng dụng của bạn cần UUID riêng, bạn có thể tạo nó bằng cách sử dụng trang web của trình tạo UUID này.
Tóm lại, UUID được sử dụng để nhận dạng thông tin duy nhất. Ví dụ, nó có thể xác định một dịch vụ cụ thể được cung cấp bởi thiết bị Bluetooth.
BLE with ESP32
ESP32 có thể hoạt động như một máy chủ BLE hoặc một máy khách BLE. Có một số ví dụ BLE cho ESP32 trong thư viện BLE ESP32 cho Arduino IDE. Thư viện này được cài đặt theo mặc định khi bạn cài đặt ESP32 trên Arduino IDE.
File > Examples > ESP32 BLE Arduino
ESP32 BLE Server (Code arduino).
/*
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleServer.cpp
Ported to Arduino ESP32 by Evandro Copercini
updates by chegewara
*/
#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"
void setup() {
Serial.begin(115200);
Serial.println("Starting BLE work!");
BLEDevice::init("Long name works now");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setValue("Hello World says Neil");
pService->start();
// BLEAdvertising *pAdvertising = pServer->getAdvertising(); // this still is working for backward compatibility
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06); // functions that help with iPhone connections issue
pAdvertising->setMinPreferred(0x12);
BLEDevice::startAdvertising();
Serial.println("Characteristic defined! Now you can read it in your phone!");
}
void loop() {
// put your main code here, to run repeatedly:
delay(2000);
}
How the code works
1.1 Thư viện
#include <BLEDevice.h> #include <BLEUtils.h> #include <BLEServer.h>
1.2 Sau đó, bạn cần xác định UUID cho Dịch vụ và Đặc điểm.
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
1.3 Thiết lập tốc độ truyền.
Serial.begin(115200);
1.4 Tên Thiết bị.
// Create the BLE Device BLEDevice::init("MyESP32");
BLEServer *pServer = BLEDevice::createServer();
Sau đó, bạn tạo một dịch vụ cho máy chủ BLE với UUID được xác định trước đó.
BLEService *pService = pServer->createService(SERVICE_UUID);
Sau đó, bạn đặt đặc trưng cho dịch vụ đó. Như bạn có thể thấy, bạn cũng sử dụng UUID được xác định trước đó và bạn cần chuyển các thuộc tính của đặc tính làm đối số. Trong trường hợp này, đó là: ĐỌC và VIẾT.
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
Sau khi tạo đặc tính, bạn có thể đặt giá trị của nó bằng phương thức setValue ().
pCharacteristic->setValue("Hello World says Neil");
Trong trường hợp này, chúng tôi đang đặt giá trị cho văn bản "Hello World said Neil". Bạn có thể thay đổi văn bản này thành bất cứ điều gì bạn muốn. Trong các dự án tương lai, văn bản này có thể là giá trị đọc của cảm biến hoặc trạng thái của đèn chẳng hạn.
Cuối cùng, bạn có thể bắt đầu dịch vụ và quảng cáo để các thiết bị BLE khác có thể quét và tìm thiết bị BLE này.
BLEAdvertising *pAdvertising = pServer->getAdvertising(); pAdvertising->start();
Đây chỉ là một ví dụ đơn giản về cách tạo một máy chủ BLE. Trong đoạn mã này, không có gì được thực hiện trong vòng lặp (), nhưng bạn có thể thêm những gì sẽ xảy ra khi một máy khách mới kết nối (kiểm tra ví dụ BLE_notify để biết một số hướng dẫn).
ESP32 BLE Scanner
/*
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
Ported to Arduino ESP32 by Evandro Copercini
*/
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
int scanTime = 5; //In seconds
BLEScan* pBLEScan;
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());
}
};
void setup() {
Serial.begin(115200);
Serial.println("Scanning...");
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
pBLEScan->setInterval(100);
pBLEScan->setWindow(99); // less or equal setInterval value
}
void loop() {
// put your main code here, to run repeatedly:
BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
Serial.print("Devices found: ");
Serial.println(foundDevices.getCount());
Serial.println("Scan done!");
pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory
delay(2000);
}
Mã này khởi tạo ESP32 dưới dạng thiết bị BLE và quét các thiết bị lân cận. Tải mã này lên ESP32 của bạn. Bạn có thể muốn tạm thời ngắt kết nối ESP32 khác khỏi máy tính của mình, vì vậy bạn chắc chắn rằng bạn đang tải mã lên đúng bo mạch ESP32.
Sau khi mã được tải lên và bạn sẽ bật hai bảng ESP32:
Một ESP32 với bản phác thảo “BLE_server”;
Khác với bản phác thảo "BLE_scan" của ESP32.
Máy quét tìm thấy hai thiết bị: một là ESP32 (nó có tên “MyESP32) và thiết bị kia là MiBand2 của chúng tôi.
Testing the ESP32 BLE Server with Your Smartphone
Scan tim ra được thiết bị của bạn.