Kembali ke Katalog Modul
MODUL 26 DEEP DIVE

PHP Backend Native untuk Ingest Data IoT

MODUL 26 (SPESIALIS IOT): PHP BACKEND INGEST DATA IOT


📌 META MODUL & PRASYARAT

  • Bidang Spesialisasi: Backend API Engineering for IoT Data Ingestion.
  • Target Pembaca: Pembelajar yang sudah menguasai Database Fundamentals (Modul 25).
  • Learning Outcome:
  • Memahami peran PHP Native Backend sebagai tempat penampungan (Ingest Engine) data sensor dari ESP32.
  • Mampu membuat API Endpoint Receiver (/api/telemetry.php) berbasis PDO & Prepared Statements.
  • Mampu memvalidasi API Key / Secret Token dari header HTTP request ESP32.
  • Mampu mengeluarkan response JSON terstruktur untuk status balasan ke ESP32.
  • Estimasi Waktu Belajar: 120 Menit.
  • Tingkat Kesulitan: 🟢 Pemula - Menengah (Level 26 / 40).
  • Prasyarat: Modul 25 (Database Fundamentals untuk IoT).

⚡ CHEAT SHEET KODE PHP INGEST RECEIVER API (api/telemetry.php)

<?php
declare(strict_types=1);
header('Content-Type: application/json');

// 1. Verifikasi HTTP Method (Hanya izinkan POST)
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['status' => 'error', 'message' => 'Method Not Allowed']);
exit;
}

// 2. Verifikasi API Key Keamanan dari ESP32
$headers = getallheaders();
$apiKey = $headers['X-API-KEY'] ?? $_POST['api_key'] ?? '';

if ($apiKey !== 'Deeptech_Secret_Key_9988') {
http_response_code(401);
echo json_encode(['status' => 'error', 'message' => 'API Key Invalid or Missing']);
exit;
}

// 3. Baca Payload Data JSON
$rawInput = file_get_contents('php://input');
$data = json_decode($rawInput, true);

$deviceUuid = $data['device_uuid'] ?? '';
$temperature = (float)($data['temperature'] ?? 0);
$humidity = (float)($data['humidity'] ?? 0);

if (empty($deviceUuid)) {
http_response_code(400);
echo json_encode(['status' => 'error', 'message' => 'device_uuid is required']);
exit;
}

// 4. Simpan ke Database MySQL menggunakan PDO
try {
$pdo = new PDO('mysql:host=127.0.0.1;dbname=esp_deeptech;charset=utf8mb4', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "INSERT INTO telemetry_logs (device_uuid, temperature, humidity, created_at)
VALUES (:uuid, :temp, :hum, NOW())";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':uuid' => $deviceUuid,
':temp' => $temperature,
':hum' => $humidity
]);

http_response_code(201);
echo json_encode([
'status' => 'success',
'message' => 'Data telemetry berhasil disimpan!',
'inserted_at' => date('Y-m-d H:i:s')
]);

} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['status' => 'error', 'message' => 'Database error: ' . $e->getMessage()]);
}



Latihan & Quiz Evaluasi Modul

Progres Quiz: 0 / 2 Soal
SOAL #1
Mengapa penggunaan **PDO Prepared Statements** (`$stmt->prepare()`) sangat diwajibkan saat menulis skrip PHP receiver data IoT ke MySQL?
SOAL #2
Header HTTP kustom apakah yang umum digunakan untuk membawa Token Rahasia (*API Key*) saat ESP32 mengirim data ke PHP Ingest Endpoint?

Kunci Jawaban & Pembahasan

Kunci Jawaban: 1. b. Mencegah SQL Injection, 2. b. X-API-KEY / Authorization.


Apakah Anda siap lanjut ke Modul 27: MySQL Database Schema Design untuk Telemetri Sensor & Logs?