ESP32 không chỉ có công nghệ Wi-Fi mà còn có cả công nghệ Bluetooth và Bluetooth Low Energy (BLE), bài viết này sẽ hướng dẫn các bạn sử dụng BLE trên ESP32 lập trình bằng Arduino IDE. Đầu tiên, chúng ta sẽ khám phá xem BLE là gì và các ứng dụng của nó, sau đó chúng ta sẽ dựng một ESP32 BLE Server và thử dùng một chiệc điện thoại để quét nó.
Giới thiệu Bluetooth Low Energy – BLE
Bluetooth Low Energy là gì?
Bluetooth Low Energy, viết tắt là BLE, là một công nghệ Bluetooth tiết kiệm năng lượng. BLE chủ yếu được dùng để truyền lượng dữ liệu nhỏ (băng thông thấp) với khoảng cách ngắn. Khác với Bluetooth là luôn được bật, BLE ngủ liên tục trừ khi bắt đầu kết nối.
Điều này làm BLE tiêu thụ năng lượng thấp, lượng tiêu thụ ít hơn 100 lần so với Bluetooh (tùy vào môi trường sử dụng).
Hơn nữa, BLE không chỉ hỗ trợ giao tiếp point-to-point mà còn hỗ trợ broadcast và mesh network.
So sánh BLE và Bluetooth Classic trong bảng dưới đây.
Do tính chất của nó, BLE phù hợp cho các ứng dụng cần trao đổi một lượng nhỏ dữ liệu định kỳ, chỉ chạy trên một viên Pin. Ví dụ, BLE được sử dụng rất nhiều trong chăm sóc sức khỏe, thể dục, theo dõi, beacons, an ninh và nhà thông minh.
BLE Server and Client
Trong Bluetooth Low Energy, có 2 dạng thiết bị: Server và Client. ESP32 có thể đóng vai trò Server cũng như Client.
Server quảng cáo sự tồn tại của nó, do đó các thiết bị khác có thể tìm thấy và chứa dữ liệu mà Client có thể đọc. Client quét các thiết bị gần đó và khi tìm thấy Server 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. Điều này được gọi là giao tiếp point-to-point.
Như đã nói ở trên, BLE cũng hỗ trợ broadcast và mesh network:
- Broadcast: Server truyền dữ liệu đến nhiều Client được kết nối
- Mesh network: tất cả các thiết bị được kết nối tạo thành mạng.
GATT
GATT là viết tắt của Generic Attributes, nó xác định cấu trúc dữ liệu phân cấp được hiển thị cho các thiết bị BLE được kết nối. Có nghĩa là GATT xác định tiêu chuẩn mà hai thiết bị BLE gửi và nhận dữ liệu. Hiểu hệ thống phân cấp này rất quan trọng, bởi vì nó sẽ giúp bạn dễ dàng hiểu cách sử dụng BLE và viết các ứng dụng.
BLE Service
Cấp cao nhất của hệ thống phân cấp là một Profile (hồ sơ), bao gồm một hoặc nhiều Service (dịch vụ). Thông thường, một thiết bị BLE chứa nhiều hơn một Service.
Mỗi Service đều chứa ít nhất một Characteristic (đặc tính) hoặc cũng có thể tham chiếu các Service khác. Một Service chỉ đơn giản là một tập hợp thông tin, như “đọc cảm biến”.
Có các Service được xác định trước cho một số loại dữ liệu được định nghĩa bởi SIG (Bluetooth Special Interest Group) như: Mức pin, Huyết áp, Nhịp tim, Cân nặng, v.v. Bạn có thể kiểm tra tại đây.
BLE Characteristic
Characteristic (đặc tính) luôn được sở hữu bởi một Service và đó là nơi chứa dữ liệu trong hệ thống phân cấp (Value). Characteristic luôn có hai thuộc tính: characteristic declaration (cung cấp thông tin về dữ liệu) và characteristic value.
- Broadcast
- Read
- Write without response
- Write
- Notify
- Indicate
- Authenticated Signed Writes
- Extended Properties
UUID
Mỗi Service, Characteristic và Descriptor đều có UUID (Mã định danh duy nhất toàn cầu). Một UUID là một số 128 bit (16 byte) duy nhất. Ví dụ:
55072829-bc9e-4c53-938a-74a6d4c78776
Có các UUID rút ngắn cho các Type, Service và Profile được chỉ định trong SIG.
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 tạo UUID này.
Tóm lại, UUID được sử dụng để xác định 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 một thiết bị Bluetooth.
BLE trên ESP32
ESP32 có thể đóng vai trò Server hoặc Client, Thư viện ESP32 BLE đã được tích hợp sẵn khi cài đặt ESP32 trên ARrduino IDE.
CÀI ĐẶT ESP32 TRÊN ARDUINO IDE (WINDOW, LINUX, MAC OS X)
Mở Arduino IDE, File > Examples > ESP32 BLE Arduino.
ESP32 BLE Server
Để tạo một ESP32 BLE Server, File > Examples > ESP32 BLE Arduino > BLE_server.
/* 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); }
Để tạo một BLE Server, trình tự sẽ như sau:
- Tạo một BLE Server
- Tạo một BLE Service
- Tạo một BLE Characteristic trên Service
- Tạo một BLE Descriptor trên Characteristic
- Chạy Service
- Bắt đầu quảng bá
Hướng dẫn chi tiết
Đầu tiên cần khai báo thư viện dùng trong sketch.
#include <BLEDevice.h> #include <BLEUtils.h> #include <BLEServer.h>
Sau đó, khai báo các UUID.
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
Bạn có thể dùng khai báo mặc định hoặc tạo ở trang web.
Tạo một BLE device tên là “MyESP32”, thay đổi nếu bạn muốn.
// Create the BLE Device BLEDevice::init("MyESP32");
Cấu hình BLE device là BLE Server.
BLEServer *pServer = BLEDevice::createServer();
Tạo một Service cho BLE Server với UUID trước đó
BLEService *pService = pServer->createService(SERVICE_UUID);
Cài đặt characteristic cho service.
BLECharacteristic *pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE );
Sau khi tạo characteristic, bạn có thể setValue()
pCharacteristic->setValue("Hello World says Neil");
Trong trường hợp này giá trị được đặt là chuỗi “Hello World says Neil”, bạn có thể thay đổi nếu muốn. Trong dự án của bạn, chuỗi này có thể là trạng thái sensor hay trạng thái đèn.
Cuối cùng là chạy service và bắt đầu quảng bá. Các thiết bị BLE có thể quét thấy thiết bị này.
BLEAdvertising *pAdvertising = pServer->getAdvertising(); pAdvertising->start();
Kết nối với ESP32 BLE Server bằng điện thoại
Sử dụng điện thoại có hỗ trợ BLE. Tải ứng dụng miễn phí nRF Connect for Mobile của Nordic. Android (Google Play Store) and iOS (App Store)
Bạn phải cho phép Bluetooth adapter trên điện thoại của bạn.
Sử dụng SCAN để tìm các thiết bị lân cận.
Chọn “Connect”
Tổng kết
Bài viết đã giới thiệu cho các bạn căn bản về BLE và hướng dẫn sử dụng BLE trên ESP32. Mong rằng các bạn có thể ứng dụng nó trong các dự án cửa mình và tiếp tục đón đọc các bài hướng dẫn lập trình với ESP32 trên ESPITEK
Chúc các bạn thành công!