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?
Apakah Anda siap lanjut ke Modul 27: MySQL Database Schema Design untuk Telemetri Sensor & Logs?