/* SIJA 2024 - Praktikum
Judul Aplikasi : ESP32 MQTT Subscriber - master
Versi : 0401
Deskripsi : menerima data dari publisher over internet menggunakan protokol MQTT
Author : Sugiarto
Referensi
ESP32 DevKit V1 - DoIt : https://randomnerdtutorials.com/esp32-pinout-reference-gpios/
--------------------------------------------------------- */
// mengakses file-file library
#include <WiFi.h> //library bekerja dengan wifi
#include <PubSubClient.h> //library MQTT
// data akun konek ke SSID
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// data akun MQTT server/broker
const char* mqttServer = "broker.hivemq.com";
int mqttPort = 1883;
const char* topicMQTT = "sija/iot/mqtt/LED";
// membuat object untuk mengelola koneksi wifi
WiFiClient espClient;
//membuat object untuk mengelola layanan MQTT
//diberi nama clientMQTT
PubSubClient clientMQTT(espClient);
// Mendeklarasikan function
void connectToInternet(); // function untuk melayani koneksi ke SSID
void setupMQTT(); // function seting data koneksi ke MQTT server
void reconnectMQTT(); // function koneksi ulang ke MQTT server, jika koneksi dengan MQTT server putus
// Konfigurasi umum
void setup() {
//konfigurasi Serial monitor
Serial.begin(115200);
// Konek ke Wifi - memanggil function connectToInternet()
connectToInternet();
// Konek ke MQTT Broker
setupMQTT();
// memanggil function callback()
clientMQTT.setCallback(callback); //perintah menghubungkan ke mqtt broker untuk subscribe data
}
void loop() {
// cek koneksi ke MQTT
if ( !clientMQTT.connected() ) {
//Konek ke MQTT server
reconnectMQTT();
}
clientMQTT.loop();
}
// Detil function
//------------------------------------------
// function connectToInternet()
// bertugas menjalankan tugas konek ke SSID
void connectToInternet(){
WiFi.begin(ssid, password); // Mencoba connect ke Wifi
// Melakukan pengecekan terhadap status koneksi ke WI-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Connected to Wi-Fi");
Serial.print("IP Address : ");
Serial.println(WiFi.localIP());
}
// ---------------------------------------------------------
// untuk melakukan koneksi ulang (reconnect) ke broker MQTT
// jika klien kehilangan koneksi dengan broker
// atau gagal melakukan koneksi saat pertama kali menjalankan program.
// ESP32 Reconnect to broker
void reconnectMQTT() {
Serial.println("Connecting to MQTT Broker...");
while (!clientMQTT.connected()) {
Serial.println("Reconnecting to MQTT Broker..");
//membuat Cliend ID untuk setiap device
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
// menampilkan pesan koneksi ke MTQQ broker sukses
if (clientMQTT.connect(clientId.c_str())) {
Serial.println("Connected.");
// publish
clientMQTT.publish(topicMQTT, "LED Ready to control");
// subscribe
clientMQTT.subscribe(topicMQTT);
}
else {
Serial.print("failed, rc=");
Serial.print(clientMQTT.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
//-------------------------------------------------
// mengatur dan menginisialisasi koneksi ke broker MQTT
void setupMQTT() {
clientMQTT.setServer(mqttServer, mqttPort); // Mengatur detail broker target yang digunakan
}
//---------------------------------------------------------
// function membaca data dari publisher
// membaca pesan yang masuk
// data yang diterima:
// topic bertipe string
// payload bertipe byte, pesan yang diterima
// length bertipe integer, panjang data
void callback(String topic, byte* payload, unsigned int length)
{
// variabel untuk menyimpan data sementara dalam tipe string
// nama variabel messageTemp
String messageTemp;
//menampilkan pesan di Serial
Serial.print("Pesan diterima di topic : ");
Serial.println(topic);
// Serial.print(" length is: ");
// Serial.println(length);
Serial.print("Isi pesan yang diterima dari broker: ");
for (int i = 0; i<length; i++)
{
Serial.print( (char)payload[i] );
}
Serial.println("");
}