- Istilah yang terkait dengan BLE (Bluetooth Hemat Energi)
- Mempersiapkan perangkat keras
- Pemrograman ESP32 untuk Indikasi Level Baterai menggunakan layanan GATT
- Menguji layanan GATT Anda di ESP32 BLE
Headphone Nirkabel, Gelang Kebugaran, Speaker Bluetooth, Headphone In-Ear, Ponsel, Laptop… ada begitu banyak perangkat Bluetooth di sekitar kita dan sebagian besar perangkat ini dioperasikan dengan baterai. Pernahkah Anda bertanya-tanya bahwa, ketika Anda menghubungkan perangkat Bluetooth ke ponsel Anda, bagaimana ia secara otomatis memahami bahwa perangkat yang terhubung adalah komputer atau perangkat audio atau ponsel? Untuk beberapa perangkat, ponsel kami mungkin secara otomatis menampilkan persentase baterai perangkat yang terhubung di bilah notifikasi. Bagaimana semua ini terjadi dengan sendirinya? Harus ada beberapa protokol umum yang dibagikan antara ponsel dan perangkat Bluetooth dengan benar!
Tetap penasaran, Anda akan mendapatkan jawaban untuk pertanyaan ini saat kami mencoba memahami Bluetooth Hemat Energi (disingkat BLE), dengan modul ESP32 yang populer. Tidak seperti Bluetooth Klasik di ESP32, BLE hanya beroperasi ketika komunikasi diaktifkan dan tetap dalam mode tidur jika tidak, ini menjadikannya pilihan yang tepat untuk aplikasi bertenaga baterai. BLE juga dapat membentuk jaringan mesh dan bertindak sebagai Beacon. Biasanya modul BLE berfungsi baik sebagai server atau sebagai klien, di sini kita akan menggunakan ESP32 BLE sebagai server.
Di sini kami telah membagi ESP32 Bluetooth menjadi tiga segmen untuk kemudahan pemahaman.
1. Serial Bluetooth pada ESP32 mengaktifkan LED dari Ponsel
2 . Server BLE untuk mengirim data level Baterai ke Ponsel menggunakan Layanan GATT
3. Klien BLE untuk memindai perangkat BLE dan bertindak sebagai suar.
Kami telah membahas artikel pertama; dalam artikel ini kita akan mempelajari cara membuat ESP32 BLE berfungsi sebagai server dan menggunakan Layanan GATT untuk mengirim informasi level baterai. Untuk tujuan pengujian kami akan mengirimkan nilai hardcode dari ESP32 sebagai persentase baterai ke ponsel kami melalui layanan BLE GATT, dengan cara ini Ponsel kami akan menganggap bahwa ESP32 adalah perangkat Bluetooth yang dioperasikan dengan baterai yang mencoba mengirim ke persentase baterainya. Sebelum membahas lebih rinci, kami akan memahami beberapa istilah yang terkait dengan Bluetooth Hemat Energi.
Istilah yang terkait dengan BLE (Bluetooth Hemat Energi)
BLE Server: Seperti yang diceritakan sebelumnya, BLE dapat diprogram untuk bekerja sebagai Server atau sebagai klien. Saat bekerja sebagai server, BLE hanya dapat menyediakan data yang tidak dapat memulai koneksi. Contohnya adalah sebuah band kebugaran. Server dapat mengirim informasi hanya jika klien memintanya.
Paling umum BLE ESP32 digunakan sebagai Server. Setiap Server akan memiliki satu atau lebih Layanan di dalamnya dan demikian pula setiap layanan akan memiliki satu atau lebih karakteristik yang terkait dengannya. Sebuah Karakteristik mungkin memiliki nol, satu atau lebih dari satu Deskriptor di dalamnya. Setiap Layanan, karakteristik, atau Deskriptor akan memiliki ID unik yang telah ditentukan sebelumnya yang disebut UUID.
Klien BLE: Klien dapat memindai koneksi dan mendengarkan perangkat Bluetooth lain. Contohnya adalah ponsel Anda. Perhatikan bahwa sebagian besar perangkat keras BLE dapat bekerja sebagai server dan sebagai klien, perangkat lunaklah yang menentukan peran perangkat.
Perangkat Periferal / Perangkat Pusat: Dalam jaringan BLE hanya ada satu Perangkat Pusat, tetapi dapat memiliki perangkat Periferal sebanyak yang diperlukan. Perangkat Pusat dapat terhubung ke semua perangkat periferal pada saat yang sama, tetapi perangkat periferal hanya dapat terhubung ke Perangkat Pusat, dengan cara ini tidak ada dua perangkat periferal yang dapat saling berbagi data. Contoh terbaik untuk perangkat Pusat adalah Ponsel pintar kami dan untuk perangkat Periferal adalah earphone Bluetooth atau gelang kebugaran kami.
BLE Advertising: A BLE Advertising adalah istilah culun untuk menginstruksikan perangkat Bluetooth agar dapat dilihat oleh semua sehingga dapat berpasangan dan membuat koneksi. Ini dapat dianggap sebagai komunikasi satu arah. Di sini server terus menggunakan data iklan dan mengharapkan server menerimanya. BLE Beacon adalah sejenis BLE.
UUID (Universal Unique Identifier): Setiap perangkat Bluetooth BLE diberi Nomor Pengenal Unik Universal saat diprogram oleh programmer. Anda dapat menganggap pengenal ini sebagai urutan angka yang mewakili fungsionalitas / peran perangkat BLE. Sekali lagi ada dua jenis UUID. Salah satunya adalah UUID Layanan dan yang lainnya adalah UUID Karakteristik.
Layanan GATT: GATT adalah singkatan dari Profil Atribut Generik; ini mendefinisikan beberapa cara standar yang digunakan dua perangkat BLE yang harus selalu berkomunikasi. Protokol Atribut (ATT) ini telah ditentukan sebelumnya dan umum untuk semua perangkat BLE sehingga dengan cara ini setiap dua perangkat BLE dapat mengidentifikasi satu sama lain. Jadi GATT adalah jawaban dari pertanyaan kami sebelumnya.
Teknik yang menggunakan dua perangkat BLE untuk mengirim data bolak-balik didefinisikan oleh konsep yang disebut layanan dan karakteristik.
Karakteristik Layanan BLE / BLE: UUID Layanan memberi tahu kita jenis layanan apa yang akan dilakukan perangkat BLE dan Karakteristik UUID memberi tahu apa saja parameter atau fungsi yang akan dijalankan oleh layanan itu. Jadi setiap Layanan akan memiliki satu atau lebih karakteristik di bawahnya. Baik! Dari mana programmer mendapatkan UUID ini? Setiap UUID sudah ditentukan oleh GATT (Profil Atribut Generik) Anda dapat mengunjungi situs web mereka dan memilih UUID yang diperlukan untuk proyek tersebut. Saya tahu itu sedikit melambung di atas kepala kita; mari kita coba memahaminya dengan sebuah contoh.
Mari kita asumsikan perangkat BLE pemutar audio. Awalnya saat Anda memasangkannya dengan telepon Anda, telepon Anda mengidentifikasinya sebagai perangkat audio dan juga menampilkan level baterai pada bilah status. Jadi, agar ini terjadi, pemutar audio harus memberi tahu ponsel Anda bahwa ia bersedia berbagi tingkat baterai dan persentase pengisian daya yang ada di dalamnya. Hal ini dilakukan dengan menggunakan UUID, ada UUID khusus yang mengatakan bahwa dadu BLE akan memberikan rincian tentang level baterai UUID ini yang memberitahu jenis layanan yang disebut UUID Layanan, lagi-lagi mungkin ada begitu banyak parameter yang harus ditukar dengan menyelesaikan layanan seperti nilai baterai pada parameter tersebut, setiap parameter akan memiliki UUID sendiri dan ini disebut UUID Karakteristik.Fungsi umum yang dilakukan oleh suatu karakteristik adalah Baca, Tulis, Beri Tahu dan Tunjukkan.
Deskriptor BLE: Deskriptor adalah atribut opsional yang ada di dalam Karakteristik. Descriptor biasanya menentukan cara mengakses Karakteristik.
BLE Beacon: Bluetooth Beacon lebih seperti sakelar kedekatan yang melakukan beberapa tindakan yang ditentukan sebelumnya saat pengguna masuk ke dalam jangkauan (kedekatan). Itu mengiklankan identitasnya sepanjang waktu dan karenanya selalu siap untuk dipasangkan.
BLE2902: Saya masih skeptis tentang hal ini, tetapi Anda dapat menganggapnya sebagai perangkat lunak di sisi klien yang memberi tahu server untuk mengaktifkan atau menonaktifkan pemberitahuan ini akan membantu kami dalam menghemat daya
Semoga Anda mendapat gambaran kasar, baiknya adalah kita tidak perlu tahu banyak karena semua pekerjaan tangan sudah dilakukan untuk kita melalui perpustakaan.
Mempersiapkan perangkat keras
Proyek ini tidak memerlukan pengaturan perangkat keras tetapi pastikan Anda telah menambahkan detail papan ESP32 pada Arduino IDE Anda dan telah mencoba program kedip sampel minimum untuk memeriksa apakah semuanya berfungsi seperti yang diharapkan. Anda skeptis tentang cara melakukannya, Anda dapat mengikuti Memulai ESP32 dengan tutorial Arduino untuk melakukan hal yang sama.
Juga untuk menguji layanan BLE kami akan menggunakan aplikasi android nRF di ponsel kami yang dapat langsung diunduh dari PlayStore. Ini juga tersedia di Itunes Store untuk pengguna Iphone. Jika Anda berencana untuk bekerja dengan BLE untuk waktu yang lama, aplikasi ini akan sangat berguna untuk keperluan debugging.
Pemrograman ESP32 untuk Indikasi Level Baterai menggunakan layanan GATT
Pada saat ini saya berasumsi bahwa Anda memiliki gagasan yang adil tentang layanan GATT apa dan bagaimana penerapannya menggunakan Layanan dan model karakteristik. Sekarang, mari kita selami program untuk mempelajari bagaimana penerapannya di ESP32 menggunakan Arduino IDE. Sebelum kita melanjutkan, saya ingin menggunakan ruang ini untuk berterima kasih kepada Andreas Spiess atas videonya BLE yang membuat segalanya menjadi jelas di pihak saya.
Kami memulai program dengan mengimpor perpustakaan yang diperlukan ke dalam sketsa kami. Ada banyak hal yang perlu dikonfigurasi untuk menggunakan fungsionalitas BLE ESP32 semoga berkat Neil Kolban yang telah melakukan kerja keras untuk kami dan telah menyediakan perpustakaan. Jika Anda ingin memahami fungsionalitas pustaka, Anda dapat merujuk ke dokumentasinya di halaman github.
#include
Selanjutnya kita harus menentukan fungsi Server Call-back untuk perangkat Bluetooth kita. Sebelum itu mari kita pahami apa itu fungsi callback di BLE.
Apa fungsi panggilan balik di BLE?
Saat BLE beroperasi sebagai Server, penting untuk menentukan fungsi panggilan balik Server. Ada banyak jenis panggilan balik yang terkait dengan BLE tetapi sederhananya Anda menganggap ini sebagai pengakuan yang dilakukan untuk memastikan bahwa tindakan telah diselesaikan. Callback server digunakan untuk memastikan bahwa koneksi antara klien dan server berhasil dibuat.
Kami menggunakan baris kode berikut untuk melakukan panggilan balik server.
bool _BLEClientConnected = false; kelas MyServerCallbacks : BLEServerCallbacks publik { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Di dalam fungsi pengaturan void , kami memulai komunikasi Serial pada 115200 untuk debugging dan kemudian menginisialisasi Perangkat Bluetooth melalui fungsi InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Indikator Level Baterai - BLE"); InitBLE (); }
The initBLE adalah tempat di mana semua keajaiban terjadi. Kami harus membuat server Bluetooth dan menggunakan layanan Tingkat Baterai di sini. Namun sebelum itu kita harus mendefinisikan UUID untuk Service, Characteristic dan Descriptor untuk membaca Level baterai. Semua UUID dapat diperoleh dari situs web layanan Bluetooth GATT. Untuk kasus kami, kami mencoba menggunakan layanan Baterai dan UUID untuk itu didefinisikan sebagai 0X180F seperti yang ditunjukkan di bawah ini.
Selanjutnya, kita perlu mengetahui Karakteristik yang terkait dengan layanan ini. Untuk mengetahuinya cukup klik pada Battery Service dan Anda akan dibawa ke halaman Karakteristik Layanan, di mana disebutkan bahwa Level baterai adalah nama karakteristik dan nilainya dari 0 hingga 100. Perhatikan juga bahwa kita hanya dapat melakukan dua tindakan dengan karakteristik ini, yang pertama adalah Baca yang wajib dilakukan dan yang lainnya adalah Beri Tahu yang Opsional. Jadi kami harus mengirim nilai baterai ke klien (Telepon) yang wajib dan jika perlu kami dapat memberi tahu telepon tentang mana yang opsional.
Tapi tunggu, kami masih belum menemukan nilai UUID untuk Level Baterai Karakteristik. Untuk melakukan itu, masuk ke halaman Karakteristik Baterai dan cari nama Level Baterai, Anda akan menemukan UUID-nya sebagai 0X2A19, snapshot yang sama ditampilkan di bawah.
Sekarang kita memiliki semua nilai, mari kita letakkan program seperti yang ditunjukkan di bawah ini. Nama BatterySerivce , BatteryLevelCharacteristic dan BatteryLevelDescriptor adalah variabel yang ditentukan pengguna untuk merujuk ke Service, Characteristic dan Descriptor yang kami gunakan dalam program ini. Nilai untuk Descriptor 0X2901 digunakan ketika ukuran nilai 8-bit, informasi lebih lanjut dapat ditemukan di halaman Deskripsi Deskriptor.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Kembali ke fungsi initBLE . Pertama-tama kita harus menjalankan server BLE dan membuatnya beriklan dengan sebuah nama. Baris berikut digunakan untuk memulai BLE sebagai server. Nama yang saya berikan ke server BLe saya adalah "Baterai BLE", tetapi Anda dapat memilih sendiri.
BLEDevice:: init ("Baterai BLE"); // Buat Server BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (MyServerCallbacks baru ());
Selanjutnya kita harus memulai layanan GATT karena kita telah mendefinisikan UUID, kita cukup memulai layanan menggunakan baris di bawah ini.
// Buat Layanan BLE BLEService * pBattery = pServer-> createService (BatteryService);
Setelah layanan dimulai, kita dapat menautkan deskriptor dengan karakteristik, dan menyetel nilainya. Layanan BLE2902 juga ditambahkan di sini seperti yang ditunjukkan di bawah ini.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Persentase 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (baru BLE2902 ());
Akhirnya semuanya sudah diatur, sekarang yang tersisa hanyalah meminta ESP32 untuk beriklan sehingga perangkat lain seperti ponsel kita dapat menemukannya dan terhubung dengannya, dan ketika terhubung ke klien itu harus memulai layanan Baterai yang dapat dilakukan melalui baris berikut.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> mulai (); // Mulai beriklan pServer-> getAdvertising () -> start ();
Sejauh ini sudah bagus, langkah terakhir adalah memberi tahu deskriptor berapa nilai persentase baterai yang harus dikirim ke klien (Telepon). Nilai ini bisa dari 0 -100 seperti yang kita baca sebelumnya, untuk menyederhanakannya, saya memiliki kode keras sederhana nilai baterai menjadi 57 dan kemudian menaikkannya setiap 5 detik dan mulai dari 0 setelah mencapai 100. Kode yang harus dilakukan yang ditunjukkan di bawah ini. Perhatikan bahwa nilai yang dikirim dalam format unit8_t.
tingkat uint8_t = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); penundaan (5000); level ++; Serial.println (int (level)); jika (int (level) == 100) level = 0; }
Menguji layanan GATT Anda di ESP32 BLE
The kode lengkap dijelaskan di atas diberikan pada akhir halaman. Unggah kode ke papan ESP32 Anda. Setelah diunggah, ponsel Anda akan menemukan perangkat Bluetooth yang disebut "BLE Battery" Pair dengannya.
Kemudian install aplikasi android nRF dan buka dan sambungkan ke perangkat BLE Battery BLE. Perluas bagian Layanan Baterai dan Anda akan menemukan layar berikut.
Seperti yang Anda lihat, Aplikasi telah secara otomatis mengidentifikasi bahwa BLE menyediakan Layanan Baterai dan memiliki karakteristik Level Baterai karena UUID yang kami gunakan dalam program. Anda juga dapat melihat nilai baterai saat ini yaitu 67% menunggu selama 5 detik dan Anda juga dapat melihatnya bertambah.
Hal yang keren tentang menggunakan BLE adalah sekarang aplikasi apa pun yang bekerja dengan BLE akan berpikir bahwa ESP32 Anda adalah perangkat BLE yang memberi tahu level baterai. Untuk mencobanya saya menggunakan aplikasi bernama BatON dan aplikasi tersebut mengidentifikasi ESP32 sebagai perangkat Bluetooth bertenaga baterai dan memberikan notifikasi persentase pada ponsel saya seperti ini
Keren!! Baik? Saya juga telah menunjukkan pekerjaan lengkap dalam video di bawah ini. Sekarang, setelah Anda mempelajari cara menggunakan layanan Baterai BLE dengan ESP32, Anda dapat mencoba layanan GATT lainnya juga yang sangat menarik seperti Denyut Nadi, HID, Denyut Jantung dll.. Selamat bersenang-senang….