ESP32 BLE Server Menerima Data dari ESP32 BLE Client

T. Ezandi Trinanda
2 min readAug 28, 2021

Untuk dapat menerima data dari client melalui Bluetooth Low Energy, server perlu membuat karakteristik dengan property WRITE. Server ini dibuat untuk menerima data suhu dan kelembapan dari client. Kode untuk client dapat dilihat pada Program ESP32 Mengirim Data Suhu dan Kelembapan melaui Bluetooth Low Energy.

Kode yang digunakan merupakan modifikasi dari kode example yang tersedia pada library ESP32 BLE Arduino yang ditulis oleh Neil Kolban dan Dariusz Krempa sebagai maintener-nya. Library ini sudah termasuk dalam dalam paket saat menginstal board ESP32 pada Arduino IDE, jika belum library dapat diinstal pada ESP32 BLE Arduino.

#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) {
for (int i = 0; i < value.length(); i++)
Serial.print(value[i]);
Serial.println();
}
}
};
void setup() {
Serial.begin(115200);
BLEDevice::init("ESP32");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setCallbacks(new MyCallbacks());
// 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);
pAdvertising->setMinPreferred(0x12);
BLEDevice::startAdvertising();
}
void loop() {}

Penjelasan Kode

Untuk menggunakan protokol BLE, mulai dengan memasukkan library yang diperlukan. Jika perangkat digunakan sebagai server, import juga BLEServer.h .

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

Kemudian tentukan UUID yang digunakan. UUID dapat menggunakan UUID yang disediakan pada contoh kode library atau bisa di-generate melalui Online UUID Generator Tool.

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

Memanggil kelas untuk menangani data yang diterima oleh server dan deklarasi variabel value untuk menyimpan data yang diterima oleh server.

class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();

Jika data yang diterima besar dari 0, maka lakukan perulangan untuk menerima data dari client sampai semua data diterima, setelah itu baru print.

if (value.length() > 0) {
for (int i = 0; i < value.length(); i++)
Serial.print(value[i]);
Serial.println();
}

Inisialisasi nama server dengan nama ESP32.

BLEDevice::init("ESP32");

Membuat server dengan nama yang telah dibuat sebelumnya.

pServer = BLEDevice::createServer();

Fungsi dibawah ini digunakan untuk membuat Service dengan UUID yang telah ditentukan sebelumnya pada server.

BLEService *pService = pServer->createService(SERVICE_UUID);

Kemudian buat dan tentukan properti atau fungsi karakterisitik yang telah ditentukan. Fungsi server yang digunakan kali ini adalah untuk menerima data dari client. Maka property dari karakteristik dibuat menjadi WRITE.

pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_WRITE
);

Panggil kelas untuk menangani jika ada data yang diterima dari server dengan syntax di bawah ini.

pCharacteristic->setCallbacks(new MyCallbacks());

Mulai jalankan service agar dapat dideteksi oleh client

pService->start();

Perintah di bawah ini untuk memulai mengirimkan paket adverstising. sementara kode utama dapat ditulis pada bagian loop.

BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(false);
pAdvertising->setMinPreferred(0x0); // set value to 0x00 to not advertise this parameter
BLEDevice::startAdvertising()

--

--