---
# System prepended metadata

title: TP_Modul_6_Bluetooth_&_BLE

---

---
title: TP_Modul_6_Bluetooth_&_BLE

---

# Tugas Pendahuluan Modul 6 - Bluetooth & BLE

```
Nama  : Muhammad Avicenna Raffaiz Adiharsa
NPM   : 2206062844
https://hackmd.io/@96kami/B1rT7aN6xx
```

> Note: Soal Programming tidak perlu dicantumkan referensi, hanya soal Teori saja yang perlu referensi minimal 2.

## Teori (70 Poin)

### 1. Jelaskan perbedaan arsitektur inti antara Bluetooth Classic (BR/EDR) dan Bluetooth Low Energy (BLE). Bandingkan keduanya berdasarkan: <span style="color:red;">(15 Poin)</span>
- Kasus Penggunaan Utama (Primary Use Case)
- Topologi Jaringan (Topology)
- Konsumsi Daya (Power Consumption)

---

Bluetooth Classic (BR/EDR) dirancang untuk transfer data berkelanjutan berkecepatan tinggi (audio, transfer file), menggunakan topologi point-to-point.

Bluetooth Low Energy (BLE) dirancang untuk komunikasi singkat, periodik, dengan konsumsi daya sangat rendah (perangkat wearable, sensor IoT), mendukung topologi point-to-point, broadcast, star, dan mesh.

Classic boros daya dengan koneksi lebih lama, sementara BLE sangat hemat daya dengan koneksi cepat, memungkinkan perangkat bertahan bertahun-tahun dengan satu baterai. Pilihan tergantung kebutuhan aplikasi: kinerja tinggi pilih Classic, daya tahan baterai ekstrem pilih BLE.

### Referensi:

- Bluetooth Low Energy vs. Bluetooth Classic: What's the Difference? [Online]. Available: https://www.ezurio.com/resources/blog/bluetooth-low-energy-vs-bluetooth-classic-what-s-the-difference. [Diakses: 9-Oktober-2025]
- Bluetooth Classic vs. Bluetooth Low Energy (BLE) on Android – Hints & Implementation Steps [Online]. Available: https://www.thedroidsonroids.com/blog/bluetooth-classic-vs-bluetooth-low-energy-ble. [Diakses: 9-Oktober-2025]
- Bluetooth Vs. Bluetooth Low Energy: A Detailed Comparison [Online]. Available: https://stormotion.io/blog/ble-and-bluetooth-comparison. [Diakses: 9-Oktober-2025]

---

### 2. Dalam pengembangan aplikasi BLE, GAP dan GATT adalah dua profil paling fundamental pada Protocol Stack. Jelaskan: <span style="color:red;">(20 Poin)</span>
- Peran dari Generic Access Profile (GAP) dan tiga tanggung jawab utamanya.
- Peran dari Generic Attribute Profile (GATT) dan jelaskan hierarki data yang ditetapkannya (Service, Characteristic, Descriptor).

---

GAP mengatur bagaimana perangkat BLE saling menemukan dan terhubung. GATT mengatur apa yang mereka bicarakan setelah terhubung, dengan format data terstruktur (Service, Characteristic, Descriptor). GAP mengelola koneksi dan peran (Peripheral/Central), sementara GATT memungkinkan pertukaran data dalam model client-server.

### Referensi:

- How GAP and GATT Work — Bluetooth Low Energy Basics [Online]. Available: https://punchthrough.com/how-gap-and-gatt-work. [Diakses: 9-Oktober-2025]
- Bluetooth ATT and GATT Explained (Connection-Oriented Communication) [Online]. Available: https://novelbits.io/bluetooth-le-att-gatt-explained-connection-oriented-communication. [Diakses: 9-Oktober-2025]


---

### 3. Keamanan adalah pilar penting dalam komunikasi Bluetooth modern. Jelaskan tiga pilar keamanan yang dibangun pada LE Secure Connections: <span style="color:red;">(20 Poin)</span>
- Encryption (Confidentiality)
- Privacy (Anti-Tracking) menggunakan Resolvable Private Addresses (RPAs)
- Authentication untuk perlindungan terhadap serangan Man-in-the-Middle (MITM)

---

#### Encryption
Melindungi data dari penyadapan. Menggunakan enkripsi AES-CCM 128-bit, standar kuat seperti brankas yang hanya bisa dibuka dengan kunci unik oleh pengirim dan penerima. Setelah pairing, semua data otomatis terenkripsi.

#### Privacy (Anti-Tracking) menggunakan Resolvable Private Addresses (RPAs)
Mencegah pelacakan lokasi fisik perangkat. Perangkat menggunakan Resolvable Private Addresses (RPA), alamat Bluetooth sementara yang berubah setiap 15 menit. Perangkat yang sudah bonded (bertukar Identity Resolving Key/IRK) dapat mengenali satu sama lain meskipun alamat berubah.

#### Authentication (Perlindungan MITM) 
Memastikan koneksi ke perangkat yang benar, bukan penipu, melawan serangan Man-in-the-Middle (MITM). Menggunakan protokol ECDH untuk membuat kunci enkripsi rahasia bersama. Selama pairing, otentikasi dilakukan via Numeric Comparison, Passkey Entry, atau Out of Band (OOB). Ini mencegah penyerang mencegat atau memanipulasi data.

### Referensi:

- Bluetooth LE Security [Online]. Available: https://docs.silabs.com/bluetooth/latest/bluetooth-le-fundamentals/08-bluetooth-smart-security. [Diakses: 9-Oktober-2025]
- Bluetooth LE: Security Modes and Procedures Explained [Online]. Available: https://www.allaboutcircuits.com/technical-articles/bluetooth-le-security-modes-and-procedures-explained. [Diakses: 9-Oktober-2025]
- Securing BLE Connections—An Overview of the Security Protocol [Online]. Available: https://www.allaboutcircuits.com/technical-articles/securing-ble-connectionsan-overview-of-the-security-protocol. [Diakses: 9-Oktober-2025]

---

### 4. Dalam komunikasi BLE, sebuah perangkat dapat mengambil beberapa peran fundamental. Jelaskan peran dari: <span style="color:red;">(15 Poin)</span>
- Advertiser / Broadcaster
- Scanner / Observer
- Central / Master
- Peripheral / Slave

---

#### Advertiser / Broadcaster
Perangkat ini mengirimkan sinyal atau "paket iklan".
* **Advertiser**: Mengirim paket agar perangkat lain (Scanner) dapat menemukan dan memulai koneksi.
* **Broadcaster**: Mengirim paket tanpa berniat dihubungi kembali, hanya menyiarkan data satu arah. Contoh: beacon museum.

#### Scanner / Observer
Perangkat ini mendengarkan paket iklan dari Advertiser atau Broadcaster.
* **Scanner**: Mencari Advertiser untuk memulai koneksi.
* **Observer**: Mendengarkan siaran Broadcaster tanpa niat terhubung, hanya mengumpulkan data. Contoh: aplikasi ponsel menampilkan suhu dari sensor.

#### Central / Master
Setelah koneksi terjalin, peran Central mengambil alih, diinisiasi oleh Scanner yang berhasil terhubung ke Advertiser.
* **Tanggung Jawab**: Mengelola waktu koneksi, meminta data, mengirim perintah.
* **Contoh Umum**: Ponsel, tablet, komputer.

#### Peripheral / Slave
Peran ini diambil oleh Advertiser setelah koneksi berhasil dibuat.
* **Tanggung Jawab**: Menyediakan data, merespons permintaan dari Central, mengikuti jadwal dan perintah Central.
* **Contoh Umum**: Fitness tracker, sensor detak jantung, smart lock.



### Referensi:

- BLE master/slave, GATT client/server, and data RX/TX basics [Online]. Available: https://community.silabs.com/s/article/ble-master-slave-gatt-client-server-and-data-rx-tx-basics?language=en_US. [Diakses: 9-Oktober-2025]
- Introduction to Bluetooth Low Energy Advertisements https://medium.com/networkers-fiit-stu/introduction-to-bluetooth-low-energy-advertisements-fde7a409673. [Diakses: 9-Oktober-2025]


---

## Programming (30 Poin)

### 5. Membuat Perangkat BLE Sederhana

Tugas kalian adalah membuat ESP32 berfungsi sebagai "remote terminal" via BLE. Perangkat ini akan:
- Melakukan advertising dengan nama unik kalian.
- Mencetak pesan ke Serial Monitor saat sebuah perangkat (misalnya, smartphone) terhubung.
- Mencetak pesan ke Serial Monitor saat perangkat tersebut terputus.
- Menerima pesan teks dari smartphone dan menampilkannya di Serial Monitor.

#### Output yang Diharapkan:
- Perangkat ESP32 kalian harus muncul di aplikasi pemindai BLE (seperti nRF Connect atau aplikasi serupa) dengan nama "ESP32_BLE_[NPM]" (ganti [NPM] dengan NPM kalian).
- Kode final
- Screenshot dari aplikasi pemindai BLE yang menunjukkan perangkat kalian terdeteksi.
- Analisis singkat tentang bagaimana kode tersebut bekerja.

#### Petunjuk:
1. Gunakan Arduino IDE atau PlatformIO untuk menulis kode.
2. Gunakan library BLE yang sesuai (seperti `BLEDevice.h` untuk Arduino).
3. Inisialisasi perangkat BLE dengan nama unik.
4. Mulai proses advertising.
5. Verifikasi dengan aplikasi pemindai BLE.

#### Kode Template
```ino
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

// TODO 1: Definisikan nama unik untuk perangkat BLE kalian.
// Format: "ESP32_{Nama}_{NPM}"
#define DEVICE_NAME "ESP32_Mai_12345"

// UUIDs untuk Service dan Characteristic (kalian bisa gunakan ini)
#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

// --- Callback untuk Event dari Server (Connect/Disconnect) ---
class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      // TODO 2: Tulis pesan "Device Connected" ke Serial Monitor
      // saat sebuah client terhubung.
    }

    void onDisconnect(BLEServer* pServer) {
      // TODO 3: Tulis pesan "Device Disconnected" ke Serial Monitor
      // saat client terputus.
    }
};

// --- Callback untuk Event dari Characteristic (Data Diterima) ---
class MyCharacteristicCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      // TODO 4: Dapatkan data yang dikirim dari client,
      // lalu cetak ke Serial Monitor.
      // Format Cetak: "Data Received: [data_kalian]"
    }
};


void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");

  // Inisialisasi BLE Device
  BLEDevice::init(DEVICE_NAME);

  // TODO 5: Implementasikan logika setup untuk Server BLE.
  // 1. Buat BLE Server.
  BLEServer *pServer = /* ... */;
  
  // 2. Set callback untuk server menggunakan class MyServerCallbacks.
  
  
  // 3. Buat BLE Service.
  BLEService *pService = /* ... */;

  // 4. Buat BLE Characteristic di dalam service.
  //    Pastikan characteristic memiliki property WRITE.
  BLECharacteristic *pCharacteristic = /* ... */;
  
  // 5. Set callback untuk characteristic menggunakan class MyCharacteristicCallbacks.
  
  
  // 6. Start service.
  
  
  // 7. Mulai advertising agar perangkat bisa ditemukan.
  
  
  Serial.println("Device is now advertising! Ready to connect.");
}

void loop() {
  // Biarkan kosong. Semua pekerjaan ditangani oleh callback secara event-driven.
  delay(2000);
}
```

#### Kode Praktikan

```ino
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

#define DEVICE_NAME "ESP32_Raffa_2206062844"

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

class MyServerCallbacks: public BLEServerCallbacks {
  void onConnect(BLEServer* pServer) override {
    Serial.println("Device Connected");
  }

  void onDisconnect(BLEServer* pServer) override {
    Serial.println("Device Disconnected");
    BLEDevice::startAdvertising();
  }
};

class MyCharacteristicCallbacks: public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) override {
    std::string rxValue = pCharacteristic->getValue();
    if (rxValue.length() > 0) {
      Serial.print("Data Received: ");
      Serial.println(rxValue.c_str());
    }
  }
};

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");

  BLEDevice::init(DEVICE_NAME);

  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

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

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

  pCharacteristic->setCallbacks(new MyCharacteristicCallbacks());

  pService->start();

  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(false);
  pAdvertising->setMinPreferred(0x06);
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();

  Serial.println("Device is now advertising! Ready to connect.");
}

void loop() {
  delay(2000);
}
```

#### Screenshot
ga punya esp32

<!-- GANTI WOI, INI HP GW -->
<!-- Tambahkan secukupnya, minimal screenshot print serial + HP kalian -->

! Print Serial | HP Kalian 1 | 
| --- | --- | 
| ![](http://cdn.digilabdte.com/u/gEmgo0.png) | ![](http://cdn.digilabdte.com/u/6kW5IF.jpg) | 

| HP Kalian 2 | HP Kalian 3 |
| --- | --- |
![](http://cdn.digilabdte.com/u/Tqi7ok.jpg) | ![](http://cdn.digilabdte.com/u/5muFVH.jpg) |

#### Analisis Kode:

Inisialisasi perangkat BLE dilakukan dengan `BLEDevice::init()`, yang menciptakan identitas unik "ESP32_Raffa_2206062844". Kemudian, sebuah server BLE dibuat untuk menerima koneksi dari klien, dengan `MyServerCallbacks` yang menangani koneksi dan diskoneksi, serta memulai advertising kembali saat terputus. Layanan mengelompokkan fitur BLE, sementara karakteristik adalah titik data yang dapat dibaca atau ditulis, dengan properti `WRITE` memungkinkan klien mengirim data teks ke ESP32. Data ini kemudian dibaca oleh `MyCharacteristicCallbacks` dan ditampilkan di Serial Monitor. Akhirnya, perangkat memulai advertising agar dapat ditemukan oleh aplikasi BLE lainnya.