Penjelasan Program Absensi RFID dan ESP32 (Uji Kompetensi Edition) - 6. reconnect
Tujuan Utama: Fungsi ini adalah mekanisme pemulihan otomatis (self-healing). Tugasnya adalah terus mencoba untuk menghubungkan kembali ke server MQTT jika koneksi terputus, tanpa harus me-restart seluruh perangkat.
Bayangkan ini seperti "dokter on-call" untuk koneksi MQTT Anda. Ia akan terus memeriksa dan mencoba menyembuhkan koneksi sampai kembali sehat.
Pembahasan Kode
Fungsi ini memiliki struktur while loop yang sangat penting.
void reconnect() {
while (!client.connected()) {
while (!client.connected()): Ini adalah jantung dari fungsi ini. Kode di dalam kurung kurawal akan diulang terus-menerus SELAMA klien MQTT tidak terhubung (!client.connected()). Ini adalah janji fungsi ini: "Saya tidak akan berhenti sampai saya berhasil terhubung."
Serial.print("Attempting MQTT connection...");
digitalWrite(LED1, LOW);
digitalWrite(BUZZER, HIGH);
delay(500);
digitalWrite(BUZZER, LOW);
delay(1500);
Serial.println(mqtt_server);
- Fungsi: Memberikan feedback kepada pengguna dan developer.
- Penjelasan:
Serial.print(...): Memberitahu developer di Serial Monitor bahwa ia sedang mencoba terhubung.digitalWrite(LED1, LOW): Mematikan LED indikator "koneksi OK".BuzzerLogic: Ini adalah sinyal peringatan audio. Buzzer akan berbunyi pendek (HIGHselama 0.5 detik), lalu diam (LOWselama 1.5 detik). Pola ini akan berulang selama proses reconnect berlangsung, memberi tahu pengguna secara fisik bahwa ada masalah koneksi.
if (client.connect(MAC_char, mqtt_user, mqtt_password)) {
- Fungsi: Ini adalah percobaan koneksi yang sesungguhnya.
- Penjelasan: Sama seperti di
setup(), fungsi ini mencoba terhubung ke server MQTT menggunakan Client ID (MAC_char), username, dan password.
Blok if (...) { ... } (Jika Koneksi Berhasil)
Jika client.connect() mengembalikan true, maka kode di dalamnya dijalankan.
Serial.println("connected");
digitalWrite(LED1, HIGH);
client.subscribe(mqtt_keywords2);
Serial.println("connected"): Memberitahu developer di Serial Monitor bahwa koneksi berhasil.digitalWrite(LED1, HIGH): Menyalakan kembali LED indikator "koneksi OK". Ini memberikan sinyal visual bahwa masalah telah teratasi.client.subscribe(mqtt_keywords2);: INI LANGKAH KRUSIAL! Setelah terhubung kembali, perangkat harus berlangganan ulang ke topik kontrol (absensi/control). Jika tidak, perangkat tidak akan bisa menerima perintah restart/reset lagi setelah putus koneksi.
Setelah blok ini selesai, karena while loop akan mengecek lagi kondisinya (!client.connected()), dan kali ini kondisinya adalah false (karena sudah terhubung), maka loop akan berhenti, dan fungsi reconnect() selesai.
Blok else { ... } (Jika Koneksi Gagal)
Jika client.connect() mengembalikan false, maka kode di dalam else dijalankan.
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
if (client.state() == 4) ESP.restart();
else {
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
Serial.print("failed, rc="); Serial.print(client.state());: Ini adalah penanganan kesalahan yang cerdas. Ia tidak hanya mengatakan "gagal", tetapi juga mencetak kode error (client.state()) untuk membantu developer mendiagnosis penyebabnya.if (client.state() == 4) ESP.restart();: Ini adalah penanganan untuk kesalahan fatal.- Kode state
4biasanya berarti koneksi ditolak, sering kali karena kredensial (username/password) yang salah. - Jika ini masalahnya, mencoba lagi dan lagi tidak akan berhasil. Jadi, program memutuskan untuk me-restart seluruh sistem sebagai upaya terakhir.
- Kode state
else { delay(5000); }: Ini adalah penanganan untuk kesalahan sementara.- Jika errornya bukan
4(misalnya timeout karena jaringan jelek), strategi terbaik adalah menunggu sebentar. delay(5000)membuat program menunggu 5 detik sebelumwhileloop melakukan percobaan koneksi berikutnya. Ini mencegah perangkat "membanjiri" server dengan permintaan koneksi yang terlalu cepat, yang bisa membuat server memblokirnya.
- Jika errornya bukan