Logo Universitas

Universitas ASA Indonesia


Program Studi: Teknologi Informasi
Mata Kuliah: Internet of Things
SKS: 4 (2 teori, 2 praktikum)
Dosen Pengampu: Istiqomah Sumadikarta, S.T., M.Kom.
Beranda Mundur Maju

Pertemuan 12: MQTT (Message Queuing Telemetry Transport)

Tujuan Pembelajaran

1. Pengenalan MQTT

MQTT (Message Queuing Telemetry Transport) adalah protokol komunikasi pengiriman pesan yang dibentuk dengan TCP/IP berdasarkan model messaging publish-subscribe dan dirancang khusus untuk machine to machine yang tidak memiliki alamat khusus. Publisher mengirim pesan, subscriber menerima pesan yang dibutuhkan, dan broker akan menyampaikan pesan yang diminta, dari pengirim ke penerima. Publisher dan subscriber adalah klien MQTT yang hanya berkomunikasi dengan broker MQTT. Contoh publisher dan subscriber adalah mikrokontroller, komputer, smartphone, dll.

Simulasi ESP32 Wokwi

2. Sejarah MQTT

MQTT dikembangkan pada tahun 1999 oleh Andy Stanford-Clark (IBM) dan Arlen Nipper (Arcom). Protokol ini awalnya digunakan untuk memantau jaringan pipa minyak. Sekarang, MQTT menjadi standar terbuka (OASIS) dan digunakan luas dalam berbagai aplikasi IoT.
Sejak Internet of Things menjadi populer, MQTT juga melonjak.

Sejarah MQTT

3. Broker

Broker adalah server pusat yang menerima pesan dari publisher dan mendistribusikannya kepada subscriber. Broker memastikan pesan terkirim sesuai topic yang di-subscribe. Contoh broker populer: Mosquitto, HiveMQ, dan EMQX.

Sejarah MQTT

4. Publish

Publish merupakan cara suatu perangkat untuk mengirimkan datanya ke subscribers. Pengirim data tersebut dinamakan publisher. Biasanya pada publisher adalah sebuah device yang terhubung dengan sensor tertentu.
Contoh publisher adalah Arduino, ESP32, Raspberry Pi, Android, dll.

Sejarah MQTT

5. Subscribe

Subscribe merupakan cara suatu device untuk menerima berbagai macam data dari publisher melalui broker. Penerima data disebut subscriber. Subscriber dapat berupa aplikasi monitoring sensor dan sebagainya, subscriber ini yang nantinya akan meminta data dari publisher melalui broker.

Sejarah MQTT

6. Topic

Topic seperti halnya pengelompokan data disuatu kategori tertentu yang dibuat oleh user. Pada sistem kerja MQTT protokol ini, topic bersifat wajib untuk membedakan data satu dengan yang lainnya. Pada setiap transaksi data antara Publisher dan Subscriber harus memiliki suatu topic tertentu. Contoh penggunaan topic: “temperature”, “humidity“, dll.

Sejarah MQTT

7. Cara Kerja MQTT

  1. Klien melakukan koneksi ke broker.
  2. Publisher mengirim pesan ke sebuah topic.
  3. Broker menerima pesan dan mendistribusikannya.
  4. Subscriber yang berlangganan topic tersebut menerima pesan.
Cara Kerja MQTT

8. MQTT vs HTTP

Tabel Perbandingan MQTT dengan HTTP

Design Methodoloty
Aspek MQTT HTTP
Full Form Message Queue Telemetry Transport HyperText Transfer Protocol
Data Centric Document centric
Architecture Publish/Subscribe Request/Response
Complexity Simple More Complex
Message Size Small, with a compact binary header just 2 bytes in size Larger, partly because status detail in text-based
Service Levels 3 quality of service settings All messages get the same level of service
Data Distribution 1 to 0, 1 to 1, 1 to n 1 to 1 only
Data Security Yes No

9. Mosquitto

Mosquitto adalah broker MQTT open-source yang ringan dan populer, dikembangkan oleh Eclipse Foundation. Mendukung MQTT v3.1, 3.1.1, dan 5.0, serta bisa dijalankan di Linux, Windows, dan Raspberry Pi.

Website: https://mosquitto.org

Cara Kerja MQTT

Keamanan Pada Mosquitto

Mosquitto mendukung keamanan dengan mengenkripsi port yang digunakan dalam transmisi data. Beberapa port yang dapat digunakan yaitu:
• 1883 : MQTT, unencrypted, unauthenticated
• 1884 : MQTT, unencrypted, authenticated
• 8883 : MQTT, encrypted, unauthenticated
• 8884 : MQTT, encrypted, client certificate required
• 8885 : MQTT, encrypted, authenticated
• 8886 : MQTT, encrypted, unauthenticated
• 8887 : MQTT, encrypted, server certificate deliberately expired
• 8080 : MQTT over WebSockets, unencrypted, unauthenticated
• 8081 : MQTT over WebSockets, encrypted, unauthenticated
• 8090 : MQTT over WebSockets, unencrypted, authenticated
• 8091 : MQTT over WebSockets, encrypted, authenticated

10. Praktik MQTT dengan Mosquitto

1. Simulasi MQTT: Mengirim data dari ESP32 ke Mosquitto

2. Simulasi MQTT: Mengirim data dari ESP32 ke Mosquitto, kemudian ESP32 yang lain mengambil data dari Mosquitto.

    Kita buat 2 buah jendela Wokwi, 1 untuk Publisher dan 1 untuk Subscriber.

    PUBLISHER

  1. Buat Diagram ESP32 sebagai publisher pada Simulator Wokwi
  2. Tambahkan code pada scetch.ino
  3. #include <WiFi.h>
    #include <PubSubClient.h>
    
    // Update these with values suitable for your network.
    const char* ssid = "Wokwi-GUEST";
    const char* password = "";
    const char* mqtt_server = "test.mosquitto.org";
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    unsigned long lastMsg = 0;
    #define MSG_BUFFER_SIZE  (50)
    char msg[MSG_BUFFER_SIZE];
    int value = 0;
    
    void setup_wifi() {
      delay(10);
      // We start by connecting to a WiFi network
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
    
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    
      randomSeed(micros());
    
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }
    
    void callback(char* topic, byte* payload, unsigned int length) {
      Serial.print("Message arrived [");
      Serial.print(topic);
      Serial.print("] ");
      for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
      }
      Serial.println();
    
      // Switch on the LED if an 1 was received as first character
      if ((char)payload[0] == '1') {
        digitalWrite(2, LOW);   // Turn the LED on (Note that LOW is the voltage level
        // but actually the LED is on; this is because
        // it is active low on the ESP-01)
      } else {
        digitalWrite(2, HIGH);  // Turn the LED off by making the voltage HIGH
      }
    }
    
    void reconnect() {
      // Loop until we're reconnected
      while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        // Create a random client ID
        String clientId = "ESP8266Client-";
        clientId += String(random(0xffff), HEX);
        // Attempt to connect
        if (client.connect(clientId.c_str())) {
          Serial.println("Connected");
          // Once connected, publish an announcement...
          client.publish("/asaindo/mqtt", "Asaindo");
          // ... and resubscribe
          client.subscribe("/asaindo/mqtt");
        } else {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          // Wait 5 seconds before retrying
          delay(5000);
        }
      }
    }
    
    void setup() {
      pinMode(2, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
      Serial.begin(115200);
      setup_wifi();
      client.setServer(mqtt_server, 1883);
      client.setCallback(callback);
    }
    
    void loop() {
    
      if (!client.connected()) {
        reconnect();
      }
      client.loop();
    
      unsigned long now = millis();
      if (now - lastMsg > 2000) {
        lastMsg = now;
        ++value;
        snprintf (msg, MSG_BUFFER_SIZE, "Asaindo #%ld", value);
        Serial.print("Publish message: ");
        Serial.println(msg);
        client.publish("/asaindo/mqtt", msg);
      }
    }
    
            
  4. Tambahkan library PubSubClient pada Library Manager
  5. Jalankan simulasi
  6. Cara Kerja MQTT
  7. Pada serial output dapat dilihat ESP32 mengirim data dan menerima data
  8. SUBSCRIBER

  9. Buat Diagram ESP32 sebagai subscriber pada Simulator Wokwi
  10. Tambahkan code pada scetch.ino
  11. #include <WiFi.h>
    #include <PubSubClient.h>
    // Update these with values suitable for your network.
    const char* ssid = "Wokwi-GUEST";
    const char* password = "";
    const char* mqtt_server = "test.mosquitto.org";
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    unsigned long lastMsg = 0;
    #define MSG_BUFFER_SIZE  (50)
    char msg[MSG_BUFFER_SIZE];
    int value = 0;
    
    void setup_wifi() {
      delay(10);
      // We start by connecting to a WiFi network
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
    
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    
      randomSeed(micros());
    
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }
    
    void callback(char* topic, byte* payload, unsigned int length) {
      Serial.print("Message arrived [");
      Serial.print(topic);
      Serial.print("] ");
      for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
      }
      Serial.println();
      // Switch on the LED if an 1 was received as first character
      if ((char)payload[0] == '1') {
        digitalWrite(2, HIGH);   // Turn the LED on (Note that LOW is the voltage level
        // but actually the LED is on; this is because
        // it is active low on the ESP-01)
      } else {
        digitalWrite(2, LOW);  // Turn the LED off by making the voltage HIGH
      }
    }
    
    void reconnect() {
      // Loop until we're reconnected
      while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        // Create a random client ID
        String clientId = "ESP8266Client-";
        clientId += String(random(0xffff), HEX);
        // Attempt to connect
        if (client.connect(clientId.c_str())) {
          Serial.println("Terkoneksi");
          // Once connected, publish an announcement...
          client.publish("/asaindo/mqtt", "Terkoneksi");
          // ... and resubscribe
          client.subscribe("/asaindo/mqtt");
        } else {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          // Wait 5 seconds before retrying
          delay(5000);
        }
      }
    }
    
    void setup() {
      pinMode(2, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
      Serial.begin(115200);
      setup_wifi();
      client.setServer(mqtt_server, 1883);
      client.setCallback(callback);
    }
    
    void loop() {
      if (!client.connected()) {
        reconnect();
      }
      client.loop();
    }
            
  12. Tambahkan library PubSubClient pada Library Manager
  13. Jalankan simulasi
  14. Cara Kerja MQTT
  15. Pada serial output dapat dilihat ESP32 mengirim data dan menerima data

3. Simulasi MQTT: Pengiriman data ESP32 Mosquitto ke Smartphone.

Praktik pengiriman data dari ESP32 ke Mosquitto, kemudian smartohone mengambil data dari Mosquitto.

Cara Kerja MQTT

    PUBLISHER

  1. Buat Rangkaian ESP32 dan DHT22 sebagai publisher pada Simulator Wokwi
  2. Cara Kerja MQTT
  3. Tambahkan code pada scetch.ino
  4. #include <WiFi.h>
    #include <PubSubClient.h>
    #include "DHTesp.h"
    
    const int DHT_PIN = 15;
    DHTesp dhtSensor;
    
    const char* ssid = "Wokwi-GUEST";
    const char* password = "";
    const char* mqtt_server = "test.mosquitto.org";
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    unsigned long lastMsg = 0;
    #define MSG_BUFFER_SIZE	(50)
    float temp = 0;
    float hum = 0;
    int value = 0;
    
    void setup_wifi() {
      delay(10);
      // We start by connecting to a WiFi network
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
    
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    
      randomSeed(micros());
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }
    
    void callback(char* topic, byte* payload, unsigned int length) {
      Serial.print("Message arrived [");
      Serial.print(topic);
      Serial.print("] ");
      for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
      }
      Serial.println();
      // Switch on the LED if an 1 was received as first character
      if ((char)payload[0] == '1') {
        digitalWrite(2, LOW);   // Turn the LED on (Note that LOW is the voltage level
        // but actually the LED is on; this is because
        // it is active low on the ESP-01)
      } else {
        digitalWrite(2, HIGH);  // Turn the LED off by making the voltage HIGH
      }
    }
    
    void reconnect() {
      // Loop until we're reconnected
      while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        // Create a random client ID
        String clientId = "ESP8266Client-";
        clientId += String(random(0xffff), HEX);
        // Attempt to connect
        if (client.connect(clientId.c_str())) {
          Serial.println("Connected");
          // Once connected, publish an announcement...
          client.publish("/asaindo", "Connected");
          // ... and resubscribe
          client.subscribe("/asaindo");
        } else {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          // Wait 5 seconds before retrying
          delay(5000);
        }
      }
    }
    
    void setup() {
      pinMode(2, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
      Serial.begin(115200);
      setup_wifi();
      client.setServer(mqtt_server, 1883);
      client.setCallback(callback);
      dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
    }
    
    void loop() {
      if (!client.connected()) {
        reconnect();
      }
      client.loop();
    
      unsigned long now = millis();
      if (now - lastMsg > 2000) {
        lastMsg = now;
        TempAndHumidity  data = dhtSensor.getTempAndHumidity();
    
        String temp = String(data.temperature, 2);
        Serial.print("Temperature: ");
        Serial.println(temp);
        client.publish("/asaindo/temp", temp.c_str());
        
        String hum = String(data.humidity, 1);
        Serial.print("Humidity: ");
        Serial.println(hum);
        client.publish("/asaindo/hum", hum.c_str());
      }
    }
            
  5. Tambahkan library PubSubClient, dan DHTesp pada Library Manager
  6. Jalankan simulasi
  7. Cara Kerja MQTT
  8. Pada serial output dapat dilihat ESP32 mengirim data
  9. SUBSCRIBER

  10. Instal aplikasi MQTT Dashboard
  11. Cara Kerja MQTT
  12. Tambahkan Broker - Use Demo Credential (id bisa berbeda-beda)
  13. Cara Kerja MQTT
  14. Jalankan Broker, tap broker yang baru saja dibuat (Connected)
  15. Cara Kerja MQTT
  16. Tambahkan Subscriber
  17. Cara Kerja MQTT
  18. Lihat Messages
  19. Cara Kerja MQTT

Daftar Pustaka

  1. OASIS. (2019). MQTT Version 5.0. OASIS Standard.
  2. Eclipse Mosquitto
  3. HiveMQ - MQTT Essentials

Glosarium Istilah

MQTT
Protokol komunikasi publish-subscribe ringan untuk IoT.
Broker
Server yang mengatur distribusi pesan dari publisher ke subscriber.
Topic
Kanal komunikasi dalam MQTT yang menjadi jalur pesan.
Subscriber
Klien yang menerima pesan dari broker berdasarkan topic.
Beranda Mundur Maju