- Các thuật ngữ liên quan đến BLE (Bluetooth Low Energy)
- Chuẩn bị phần cứng
- Lập trình ESP32 cho Chỉ báo mức pin bằng dịch vụ GATT
- Kiểm tra dịch vụ GATT của bạn trên ESP32 BLE
Tai nghe không dây, Dây đeo thể dục, Loa Bluetooth, Tai nghe nhét trong, Điện thoại di động, Máy tính xách tay… có rất nhiều thiết bị Bluetooth xung quanh chúng ta và hầu hết các thiết bị này đều hoạt động bằng pin. Bạn đã bao giờ tự hỏi rằng, khi bạn kết nối một thiết bị Bluetooth với điện thoại di động của mình, làm thế nào nó tự động hiểu rằng thiết bị được kết nối là máy tính hoặc thiết bị âm thanh hoặc điện thoại di động? Đối với một số thiết bị, điện thoại của chúng tôi thậm chí có thể tự động hiển thị phần trăm pin của thiết bị được kết nối trên thanh thông báo. Làm thế nào để tất cả những điều này xảy ra một mình? Nên có một số giao thức chung được chia sẻ giữa điện thoại và thiết bị Bluetooth đúng không!
Hãy tò mò, bạn sẽ nhận được câu trả lời cho những câu hỏi này khi chúng tôi cố gắng hiểu Bluetooth Low Energy (viết tắt là BLE), với mô-đun ESP32 phổ biến. Không giống như Bluetooth cổ điển trong ESP32, BLE chỉ hoạt động khi giao tiếp được kích hoạt và giữ nguyên ở chế độ ngủ, điều này khiến nó trở thành lựa chọn phù hợp cho các ứng dụng sử dụng pin. BLE cũng có thể tạo thành mạng lưới và hoạt động như Beacons. Thông thường mô-đun BLE hoạt động như một máy chủ hoặc một máy khách, ở đây chúng tôi sẽ sử dụng ESP32 BLE làm máy chủ.
Ở đây chúng tôi đã chia ESP32 Bluetooth hoàn chỉnh thành ba phân đoạn để dễ hiểu.
1. Bluetooth nối tiếp trên đèn LED chuyển đổi ESP32 từ điện thoại di động
2 . Máy chủ BLE để gửi dữ liệu mức pin tới Điện thoại di động bằng Dịch vụ GATT
3. Ứng dụng khách BLE để quét các thiết bị BLE và hoạt động như một đèn hiệu.
Chúng tôi đã đề cập đến bài báo đầu tiên; trong bài viết này, chúng ta sẽ tìm hiểu cách làm cho ESP32 BLE hoạt động như một máy chủ và sử dụng Dịch vụ GATT để gửi thông tin về mức pin. Với mục đích thử nghiệm, chúng tôi sẽ gửi các giá trị được mã hóa cứng từ ESP32 dưới dạng phần trăm pin tới điện thoại di động của chúng tôi thông qua dịch vụ BLE GATT, theo cách này Thiết bị di động của chúng tôi sẽ giả định rằng ESP32 là thiết bị Bluetooth hoạt động bằng pin đang cố gắng gửi phần trăm pin của nó. Trước khi đi vào chi tiết, chúng tôi sẽ nhấn mạnh một số thuật ngữ liên quan đến Bluetooth Low Energy.
Các thuật ngữ liên quan đến BLE (Bluetooth Low Energy)
Máy chủ BLE: Như đã nói trước đó, BLE có thể được lập trình để hoạt động như Máy chủ hoặc máy khách. Khi hoạt động như một máy chủ, BLE chỉ có thể cung cấp dữ liệu, nó không thể bắt đầu kết nối. Ví dụ sẽ là một ban nhạc thể dục. Máy chủ chỉ có thể gửi thông tin nếu máy khách yêu cầu.
Thông thường nhất, BLE của ESP32 được sử dụng một Máy chủ. Mỗi Máy chủ sẽ có một hoặc nhiều Dịch vụ bên trong nó và tương tự như vậy, mỗi dịch vụ sẽ có một hoặc nhiều đặc điểm đi kèm với nó. Một Đặc điểm có thể không có, một hoặc nhiều hơn một Bộ mô tả bên trong nó. Mỗi Dịch vụ, đặc tính hoặc Bộ mô tả sẽ có ID duy nhất được xác định trước của riêng nó được gọi là UUID.
Máy khách BLE: Máy khách có thể quét kết nối và nghe các thiết bị Bluetooth khác. Một ví dụ sẽ là điện thoại di động của bạn. Lưu ý rằng hầu hết các thiết bị phần cứng BLE có thể hoạt động như máy chủ và như máy khách, phần mềm quyết định vai trò của thiết bị.
Thiết bị Ngoại vi / Thiết bị Trung tâm: Trong mạng BLE có thể chỉ có một Thiết bị Trung tâm, nhưng có thể có nhiều Thiết bị Ngoại vi theo yêu cầu. Thiết bị Trung tâm có thể kết nối với tất cả các thiết bị ngoại vi cùng một lúc, nhưng thiết bị ngoại vi chỉ có thể kết nối với Thiết bị trung tâm, theo cách này không có hai thiết bị ngoại vi nào có thể chia sẻ dữ liệu giữa nhau. Ví dụ tốt nhất cho thiết bị Trung tâm sẽ là Điện thoại thông minh của chúng tôi và đối với thiết bị Ngoại vi sẽ là tai nghe Bluetooth hoặc dây đeo thể dục.
Quảng cáo BLE: Quảng cáo BLE là một thuật ngữ thú vị để hướng dẫn tất cả mọi người đều có thể nhìn thấy thiết bị Bluetooth để thiết bị có thể ghép nối và thiết lập kết nối. Đây có thể được coi là một phương thức giao tiếp một chiều. Ở đây máy chủ tiếp tục quảng cáo dữ liệu mong đợi một máy chủ nhận nó. BLE Beacon là một loại BLE.
UUID (Số nhận dạng duy nhất chung): Mọi thiết bị Bluetooth BLE đều được cấp một Số nhận dạng duy nhất chung khi được lập trình viên lập trình. Bạn có thể coi số nhận dạng này như một dãy số thể hiện chức năng / vai trò của thiết bị BLE. Một lần nữa có hai loại UUID. Một là UUID dịch vụ và một là UUID đặc trưng.
Dịch vụ GATT: GATT là viết tắt của Cấu hình Thuộc tính Chung; điều này xác định một số cách tiêu chuẩn sử dụng mà hai thiết bị BLE phải luôn giao tiếp. Giao thức thuộc tính (ATT) này được xác định trước và phổ biến cho tất cả các thiết bị BLE, vì vậy, theo cách này, bất kỳ thiết bị BLE nào cũng có thể nhận dạng nhau. Vì vậy, GATT là câu trả lời cho câu hỏi trước đây của chúng tôi.
Kỹ thuật sử dụng hai thiết bị BLE sẽ gửi dữ liệu tới và lui được định nghĩa bằng khái niệm gọi là dịch vụ và đặc tính.
Dịch vụ BLE / Đặc tính của BLE: UUID dịch vụ cho chúng ta biết loại dịch vụ mà thiết bị BLE sẽ thực hiện và UUID đặc trưng cho chúng ta biết các tham số hoặc chức năng sẽ được thực hiện bởi dịch vụ đó. Vì vậy, mỗi Dịch vụ sẽ có một hoặc nhiều đặc điểm dưới chúng. Được chứ! Lập trình viên lấy UUID này từ đâu? Mỗi UUID đã được xác định bởi GATT (Cấu hình thuộc tính chung), bạn có thể truy cập trang web của họ và chọn UUID theo yêu cầu cho dự án. Tôi biết nó đã nảy một chút qua đầu của chúng tôi; hãy thử hiểu nó bằng một ví dụ.
Giả sử thiết bị BLE của một trình phát âm thanh. Ban đầu khi bạn ghép nối thiết bị với điện thoại của mình, điện thoại sẽ xác định đó là thiết bị âm thanh và cũng hiển thị mức pin trên thanh trạng thái. Vì vậy, để điều này xảy ra, trình phát âm thanh phải bằng cách nào đó cho điện thoại của bạn biết rằng nó sẵn sàng chia sẻ mức pin và phần trăm sạc có trong pin. Điều này được thực hiện bằng cách sử dụng UUID, có một UUID cụ thể cho biết rằng xúc xắc BLE sẽ cung cấp thông tin chi tiết về mức pin UUID này cho biết loại dịch vụ được gọi là Service UUID, một lần nữa có thể có rất nhiều thông số phải được trao đổi để hoàn thành một dịch vụ như giá trị của pin trên tham số đó, mỗi tham số sẽ có UUID riêng và chúng được gọi là UUID đặc trưng.Chức năng phổ biến được thực hiện bởi một đặc tính là Đọc, Ghi, Thông báo và Cho biết.
Bộ mô tả BLE: Bộ mô tả là một thuộc tính tùy chọn có bên trong Đặc tính. Bộ mô tả thường chỉ định cách truy cập một Đặc tính.
BLE Beacon: Bluetooth Beacon giống như một công tắc vùng lân cận thực hiện một số hành động được xác định trước khi người dùng đến một phạm vi (vùng lân cận). Nó quảng cáo danh tính của mình mọi lúc và do đó luôn sẵn sàng ghép nối.
BLE2902: Tôi vẫn còn nghi ngờ về điều này, nhưng bạn có thể nghĩ nó như một phần mềm ở phía máy khách thông báo cho máy chủ để Bật hoặc Tắt thông báo, điều này sẽ giúp chúng tôi tiết kiệm điện năng
Hy vọng bạn có một ý tưởng sơ bộ, tốt là chúng tôi không cần biết nhiều vì tất cả các thủ tục đã được thực hiện cho chúng tôi thông qua các thư viện.
Chuẩn bị phần cứng
Dự án không yêu cầu thiết lập phần cứng nhưng đảm bảo bạn đã thêm chi tiết bảng ESP32 trên Arduino IDE của mình và đã thử chương trình nhấp nháy mẫu tối thiểu để kiểm tra xem mọi thứ có hoạt động như mong đợi hay không. Bạn nghi ngờ về cách thực hiện, bạn có thể làm theo hướng dẫn Bắt đầu với ESP32 với Arduino để làm điều tương tự.
Ngoài ra, để kiểm tra các dịch vụ BLE, chúng tôi sẽ sử dụng ứng dụng android nRF trên điện thoại di động của chúng tôi, ứng dụng này có thể được tải xuống trực tiếp từ PlayStore. Nó cũng có sẵn trong Itunes Store cho người dùng Iphone. Nếu bạn đang có ý định làm việc lâu dài với BLE, ứng dụng này sẽ thực sự hữu ích cho mục đích gỡ lỗi.
Lập trình ESP32 cho Chỉ báo mức pin bằng dịch vụ GATT
Đến lúc này, tôi cho rằng bạn có một ý tưởng hợp lý về dịch vụ GATT và cách nó được triển khai bằng cách sử dụng Dịch vụ và các mô hình đặc trưng. Bây giờ, chúng ta hãy đi sâu vào chương trình để tìm hiểu cách nó được triển khai trong ESP32 bằng Arduino IDE. Trước khi chúng ta tiếp tục, tôi muốn sử dụng không gian này để cảm ơn Andreas Spiess vì video BLE của anh ấy đã làm cho mọi thứ trở nên rõ ràng hơn về phía tôi.
Chúng tôi bắt đầu chương trình bằng cách nhập các thư viện cần thiết vào bản phác thảo của chúng tôi. Có rất nhiều thứ phải cấu hình để sử dụng chức năng BLE của ESP32, hy vọng cảm ơn Neil Kolban, người đã thực hiện công việc khó khăn cho chúng tôi và đã cung cấp các thư viện. Nếu bạn muốn hiểu chức năng của các thư viện, bạn có thể tham khảo tài liệu của anh ấy trên trang github.
#include
Tiếp theo, chúng ta phải xác định chức năng Server Call-back cho thiết bị Bluetooth của chúng ta. Trước đó, hãy hiểu rằng hàm gọi lại trong BLE là gì.
Hàm gọi lại trong BLE là gì?
Khi BLE đang hoạt động dưới dạng Máy chủ, điều quan trọng là phải xác định chức năng gọi lại Máy chủ. Có nhiều loại lệnh gọi lại được liên kết với BLE nhưng nói một cách đơn giản, bạn hãy coi chúng như một xác nhận đang được thực hiện để đảm bảo rằng hành động đó đã được hoàn thành. Một lệnh gọi lại máy chủ được sử dụng để đảm bảo rằng kết nối giữa máy khách và máy chủ được thiết lập thành công.
Chúng tôi sử dụng các dòng mã sau để thực hiện gọi lại máy chủ.
bool _BLEClientConnected = false; lớp MyServerCallbacks : BLEServerCallbacks công cộng { trống onConnect (BLEServer * pserver) { _BLEClientConnected = true; } void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Bên trong chức năng thiết lập void , chúng tôi bắt đầu giao tiếp nối tiếp tại 115200 để gỡ lỗi và sau đó khởi tạo Thiết bị Bluetooth thông qua chức năng InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Chỉ báo mức pin - BLE"); InitBLE (); }
Các initBLE là nơi mà tất cả sự kỳ diệu xảy ra. Chúng tôi phải tạo một máy chủ Bluetooth và sử dụng dịch vụ Mức pin tại đây. Nhưng trước đó chúng ta phải xác định UUID cho Dịch vụ, Đặc tính và Bộ mô tả để đọc Mức pin. Tất cả UUID có thể được lấy từ trang web của dịch vụ Bluetooth GATT. Đối với trường hợp của chúng tôi, chúng tôi đang cố gắng sử dụng dịch vụ Pin và UUID cho nó được xác định là 0X180F như hình dưới đây.
Tiếp theo, chúng ta cần biết Đặc điểm liên quan đến dịch vụ này. Để biết điều đó, chỉ cần nhấp vào Dịch vụ pin và bạn sẽ được đưa đến trang Đặc điểm dịch vụ, nơi có đề cập rằng Mức pin là tên của các đặc điểm và nó có giá trị từ 0 đến 100. Cũng lưu ý rằng chúng tôi chỉ có thể thực hiện hai các hành động có đặc điểm này, một là Đọc là bắt buộc phải làm và hai là Thông báo là Tùy chọn. Vì vậy, chúng tôi phải gửi giá trị pin cho khách hàng (Điện thoại) là bắt buộc và nếu cần, chúng tôi có thể thông báo cho điện thoại về giá trị này là tùy chọn.
Nhưng chờ đợi, chúng tôi vẫn không tìm thấy giá trị UUID cho Mức pin đặc trưng. Để làm điều đó, hãy truy cập trang Đặc tính pin và tìm kiếm tên Mức pin, bạn sẽ tìm thấy UUID của nó là 0X2A19, ảnh chụp nhanh tương tự được hiển thị bên dưới.
Bây giờ chúng ta đã có tất cả các giá trị, hãy đặt nó vào chương trình như hình dưới đây. Tên BatterySerivce , BatteryLevelCharacteristic và BatteryLevelDescriptor là các biến do người dùng xác định để chỉ Dịch vụ, Đặc tính và Bộ mô tả mà chúng tôi đang sử dụng trong chương trình. Giá trị cho Bộ mô tả 0X2901 được sử dụng khi kích thước của giá trị là 8-bit, bạn có thể tìm thêm thông tin ở trang Mô tả Bộ mô tả.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Quay lại chức năng initBLE . Đầu tiên chúng ta phải khởi động máy chủ BLE và đặt tên cho nó quảng cáo. Các dòng sau được sử dụng để khởi động BLE dưới dạng máy chủ. Tên mà tôi đã đặt cho máy chủ BLe của mình là “Pin BLE”, nhưng bạn có thể chọn tên của riêng mình.
BLEDevice:: init ("Pin BLE"); // Tạo BLE Server BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (MyServerCallbacks mới ());
Tiếp theo, chúng ta phải bắt đầu dịch vụ GATT vì chúng ta đã xác định UUID, chúng ta có thể chỉ cần khởi động dịch vụ bằng dòng bên dưới.
// Tạo dịch vụ BLE BLEService * pBattery = pServer-> createService (BatteryService);
Khi dịch vụ được khởi động, chúng tôi có thể liên kết bộ mô tả với các đặc điểm và đặt các giá trị. Dịch vụ BLE2902 cũng được thêm vào đây như hình dưới đây.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Phần trăm 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (BLE2902 ()) mới;
Cuối cùng mọi thứ đã được thiết lập, bây giờ tất cả những gì còn lại là yêu cầu ESP32 quảng cáo để các thiết bị khác như điện thoại của chúng tôi có thể phát hiện ra nó và kết nối với nó, và khi được kết nối với một máy khách, nó sẽ khởi động dịch vụ Pin có thể được thực hiện mặc dù dòng sau.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Bắt đầu quảng cáo pServer-> getAdvertising () -> start ();
Điều đó cho đến nay rất tốt, bước cuối cùng là cho bộ mô tả biết giá trị của pin theo phần trăm sẽ được gửi đến máy khách (Điện thoại) là gì. Giá trị này có thể từ 0 -100 như chúng ta đã đọc trước đó, để giữ cho mọi thứ đơn giản, tôi đã mã hóa cứng đơn giản giá trị của pin là 57 và sau đó tăng nó lên cứ sau 5 giây và bắt đầu từ 0 khi nó đạt đến 100. Mã cần làm được hiển thị bên dưới. Lưu ý rằng giá trị đang được gửi có định dạng unit8_t.
uint8_t cấp = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); chậm trễ (5000); cấp độ ++; Serial.println (int (cấp)); if (int (level) == 100) level = 0; }
Kiểm tra dịch vụ GATT của bạn trên ESP32 BLE
Các mã hoàn chỉnh giải thích ở trên được đưa ra ở cuối trang. Tải mã lên bảng ESP32 của bạn. Sau khi tải lên, điện thoại của bạn sẽ phát hiện ra một thiết bị Bluetooth có tên “Pin BLE” Ghép nối với thiết bị đó.
Sau đó cài đặt ứng dụng android nRF và mở nó lên và kết nối với thiết bị BLE Battery BLE. Mở rộng phần Dịch vụ Pin và bạn sẽ thấy màn hình sau.
Như bạn có thể thấy, Ứng dụng đã tự động xác định rằng BLE cung cấp Dịch vụ pin và có các đặc điểm về Mức pin do UUID mà chúng tôi đã sử dụng trong chương trình. Bạn cũng có thể thấy giá trị pin hiện tại là 67%, hãy đợi trong 5 giây và bạn cũng có thể nhận thấy nó đang tăng dần.
Điều thú vị khi sử dụng BLE là bây giờ bất kỳ ứng dụng nào hoạt động với BLE sẽ nghĩ rằng ESP32 của bạn là thiết bị BLE thông báo mức pin. Để dùng thử, tôi đã sử dụng một ứng dụng có tên BatON và ứng dụng này đã xác định ESP32 là thiết bị Bluetooth chạy bằng pin và đưa ra thông báo phần trăm trên điện thoại của tôi như thế này
Mát mẻ!! Đúng? Tôi cũng đã cho thấy toàn bộ hoạt động trong video bên dưới. Bây giờ, bạn đã học cách sử dụng các dịch vụ BLE Battery với ESP32, bạn có thể thử các dịch vụ GATT khác cũng rất thú vị như Nhịp tim, HID, Nhịp tim, v.v. Chúc bạn vui vẻ….