Setelah berhasil memahami konsep PubSub melalui protokol MQTT, maka kini saatnya mengolah datanya menjadi tampilan yg lebih menarik dan dipahami oleh orang awam. Tentu saja keajaiban smartphone membuat IOT terasa lebih menarik karena gawai smartphone yg hampir 24 jam orang pegang, dapat dimanfaatkan melakukan kontrol se-isi rumah dari jauh melalui internet.
Lalu apa bedanya dengan Wemos yg sudah kita bahas sebelumnya kan sudah bisa digunakan sebagai webserver dan bisa diakses dari luar rumah ? Ada sesuatu yg kurang dari HTTP sebagai metode komunikasi IOT dibandingkan dengan MQTT.
MQTT adalah data-sentris sedangkan HTTP adalah dokumen-sentris. HTTP adalah protokol Request-response yg dikatakan "connectionless" untuk komputasi server-klien dan tidak selalu dioptimalkan untuk perangkat seluler. Keuntungan utama MQTT dalam sistem IOT ini adalah ringan (MQTT mentransfer data sebagai array byte) dan model Pub/Sub, yang membuatnya sempurna untuk perangkat dengan sumber daya terbatas dan membantu menghemat baterai.
Selain itu, model Pub/Sub menyediakan klien dengan keberadaan independen satu sama lain dan meningkatkan keandalan keseluruhan sistem. Ketika satu klien rusak, seluruh sistem dapat terus bekerja dengan baik. Menurut pengukuran di jaringan 3G, throughput MQTT 93 kali lebih cepat daripada HTTP.
Itulah sedikit cuap-cuap hasil googling mengenai perbedaan HTTP vs MQTT yg sekiranya mudah dipahami. Kini bagian yg mungkin sulit dipahami, jadi butuh kembali membaca pembahasan sebelumnya dari Part 1 - 4, dimana MQTT dalam platform arduino sudah dimudahkan dengan Library PubSubClient yang memudahkan penerjemahan text ke dalam byte array dan kemudian dikirimkan secara TCP ke MQTT broker.
Saya anggap pembaca sudah paham sampai praktek kirim data DHT 11 dan kontrol LED di Part 3 sehingga kelanjutannya kali ini saya tinggal membahas script Pub-Sub pada library pubsubclient. Scriptnya seperti dibawah ini :
#include <ESP8266WiFi.h> //jika menggunakan ESP32 #include <WiFi.h>
#include <PubSubClient.h> //library pubsub by o'leary
#include "DHT.h"
const char *ssid = "nama wifi"; // Gunakan sesuai wifi kamu
const char *pass = "passwordnya"; //
//inisialisasi broker
const char *mqtt_server = "broker.hivemq.com"; //BROKER GRATIS
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "namamu123456"; // Client connections random dan gak boleh sama
// Ubah nama topik biar unik gak nabrak sama rekan lainnya
#define SUHUTOPIC "/testyuk/suhu"
#define HUMITOPIC "/testyuk/humi"
#define LEDTOPIC "/testyuk/led"
//IO pin
const int dhtPin = 13; //pin DHT di wemos(I/O marking bawah)
#define LED_SCK 14 //LED SCK
#define LED_ESP 2 //LED ESP
#define DHTTYPE DHT11 //Sensor DHT11
DHT dht(dhtPin, DHTTYPE);
//Timer
unsigned long previousMillis = 0;
const long interval = 10000; // interval pengambilan dht 11
// broker gratis jangan cepet2
WiFiClient wclient; //wifi client terhubung lib pubsub
PubSubClient client(wclient);
void setup() {
pinMode(LED_SCK, OUTPUT); //inisialisasi LED
pinMode(LED_ESP, OUTPUT);
digitalWrite(LED_ESP,HIGH);
digitalWrite(LED_SCK,LOW);
//Inisialisasi broker & Callback sub message
client.setServer(mqtt_server, mqtt_port);
client.setCallback(mqtt_callback);
Serial.begin(9600);
delay(10);
Serial.println();
Serial.println();
setupwifi();
dht.begin();
}
void setupwifi()
{
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Terhubung Ke Wifi: ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi Terhubung");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
}
void reconnectmqtt() //function mengatur koneksi ke broker
{
Serial.println("Connecting to MQTT server..");
if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) {
Serial.println("Connected to MQTT server");
} else {
Serial.println("Could not connect to MQTT server");
}
if (client.connected()){
Serial.print("subscribe to topic: ");
Serial.println(LEDTOPIC);
client.subscribe(LEDTOPIC); //subscribe ke topic LED on off
}
}
// Non-Blocking delay agar gak ganggu proses utama
void SendTempHumid(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
// cek interval
previousMillis = currentMillis;
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" °C ");
String pubStringt = String(t);
String pubStringh = String(h);
//yg dibawah ini metode pengiriman PUB ke TOPIC
//dikirim perbyte message + header nya
//sudah dimudahkan oleh library pubsub
Serial.println("publish to topic: " );
Serial.print(SUHUTOPIC);
Serial.print(" : ");
Serial.println(pubStringt);
char message_bufft[pubStringt.length() + 1];
pubStringt.toCharArray(message_bufft, pubStringt.length() + 1);
client.publish(SUHUTOPIC,message_bufft );
Serial.println("publish to topic: " );
Serial.print(HUMITOPIC);
Serial.print(" : ");
Serial.println(pubStringh);
char message_buffh[pubStringh.length() + 1];
pubStringh.toCharArray(message_buffh, pubStringh.length() + 1);
client.publish(HUMITOPIC,message_buffh );
}
}
//function callback saat ada pesan SUB yg masuk
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
String message;
for (int i = 0; i < length; i++) {
message = message + (char)payload[i]; //Conver *byte to String
}
Serial.print(message);
if(message == "sckOn") {digitalWrite(LED_SCK,HIGH);} //LED SCK on
if (message == "sckOff") {digitalWrite(LED_SCK,LOW);} //LED SCK off
if (message == "espOn") {digitalWrite(LED_ESP,LOW);} //LED ESP on
if (message == "espOff") {digitalWrite(LED_ESP,HIGH);} //LED ESP off
Serial.println();
Serial.println("-----------------------");
}
void loop() {
if (!client.connected())
{
reconnectmqtt();
}
else client.loop(); //cek terus kalau ada data masuk
SendTempHumid();
}
String pubStringt = String(t);
char message_bufft[pubStringt.length() + 1];
pubStringt.toCharArray(message_bufft, pubStringt.length() + 1);
client.publish(SUHUTOPIC,message_bufft );
client.setCallback(mqtt_callback); //Di function Setup ======================= if (client.connected()){ client.subscribe(LEDTOPIC); //di function reconnect } ======================== void mqtt_callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived in topic: "); Serial.println(topic); Serial.print("Message:"); String message; for (int i = 0; i < length; i++) { message = message + (char)payload[i]; //Conver *byte to String } Serial.print(message); if(message == "sckOn") {digitalWrite(LED_SCK,HIGH);} //LED SCK on if (message == "sckOff") {digitalWrite(LED_SCK,LOW);} //LED SCK off if (message == "espOn") {digitalWrite(LED_ESP,LOW);} //LED ESP on if (message == "espOff") {digitalWrite(LED_ESP,HIGH);} //LED ESP off Serial.println(); Serial.println("-----------------------"); }