Pada tulisan sebelumnya, kita melakukan eksperimen pemrograman dengan library Paho MQTT C Client untuk mem-PUBLISH data ke MQTT Broker shiftr.io. Data berhasil di-PUBLISH dengan baik oleh program dengan menghasilkan animasi yang menarik.

Kali ini kita akan mencoba melakukan SUBSCRIBE dan membaca data dari MQTT Broker.

Masih seperti eksperimen sebelumnya, kita akan menggunakan MQTT Broker/Cloud shiftr.io, Instance: telinks dengan alamat telinks.cloud.shiftr.io dengan sebuah token seperti ditampilkan pada screenshot berikut ini.

Program kita nantinya bertugas untuk membuka koneksi ke Instance telinks dengan alamat tcp://telinks.cloud.shiftr.io port 1883. Dan setelah koneksi terjalin, program akan melakukan SUBSCRIBE ke Topic: paho-pellesc-testing dan membaca data yang di-PUBLISH oleh program yang kita buat pada eksperimen sebelumnya.

Jika kita tuliskan urutan tugas program adalah sebagai berikut:

  1. Connect (buka koneksi) ke tcp://telinks.cloud.shiftr.io
  2. Jika koneksi terjalin maka lanjut ke langkah 3, jika tidak maka tampilkan error dan Selesai
  3. Subscribe ke topic: #
  4. Jika ada data, maka baca dan tampilkan
  5. Selesai

Topic dan Payload

Untuk Instance: telinks dengan Token: paho-pellesc-testing, terdapat beberapa topic, yakni:

  • alive – sekedar untuk menyatakan bahwa MQTT Client aktif
  • room1/temp – suhu ruangan room1
  • room2/temp – suhu ruangan room2

Untuk membaca data suhu ruangan room1, maka program harus melakukan SUBSCRIBE ke:

paho-pellesc-testing/room1/temp

Untuk membaca data suhu ruangan room1 dan room2, maka program harus melakukan SUBSCRIBE ke:

paho-pellesc-testing/+/temp

Untuk membaca semua data dari topic yang ada, maka program harus melakukan SUBSCRIBE ke:

#

Kode Program

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"

#define ADDRESS     "tcp://telinks.cloud.shiftr.io:1883"
#define CLIENTID    "USBINOV"
#define TOPIC       "#"
#define QOS         1
#define TIMEOUT     10000L

volatile MQTTClient_deliveryToken deliveredtoken;

void delivered(void *context, MQTTClient_deliveryToken dt)
{
    printf("Pesan dengan nomor token %d terkirim.\n", dt);
    deliveredtoken = dt;
}

int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
    printf("PESAN MASUK!\n");
    printf(" - topic  : %s\n", topicName);
    printf(" - payload: %.*s\n", message->payloadlen, (char*)message->payload);
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;
}

void connlost(void *context, char *cause)
{
    printf("\nKoneksi terputus. Info: %s\n", cause);
}

//program utama
int main(void)
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc;

    if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to create client, return code %d\n", rc);
        rc = EXIT_FAILURE;
        goto exit;
    }

    if ((rc = MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to set callbacks, return code %d\n", rc);
        rc = EXIT_FAILURE;
        goto destroy_exit;
    }

    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
	conn_opts.username = "telinks";
	conn_opts.password = "yPQURweLcU8cJSCR";

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        rc = EXIT_FAILURE;
        goto destroy_exit;
    }

    printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n"
           "Press Q<Enter> to quit\n\n", TOPIC, CLIENTID, QOS);
    if ((rc = MQTTClient_subscribe(client, TOPIC, QOS)) != MQTTCLIENT_SUCCESS)
    {
    	printf("Failed to subscribe, return code %d\n", rc);
    	rc = EXIT_FAILURE;
    }
    else
    {
    	int ch;
    	do
    	{
        	ch = getchar();
    	} while (ch!='Q' && ch != 'q');

        if ((rc = MQTTClient_unsubscribe(client, TOPIC)) != MQTTCLIENT_SUCCESS)
        {
        	printf("Failed to unsubscribe, return code %d\n", rc);
        	rc = EXIT_FAILURE;
        }
    }

    if ((rc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS)
    {
    	printf("Failed to disconnect, return code %d\n", rc);
    	rc = EXIT_FAILURE;
    }
destroy_exit:
    MQTTClient_destroy(&client);
exit:
    return rc;
}

Untuk kompiler C yang digunakan dalam eksperimen ini adalah Pelles C.

Hasil Eksekusi

Ketika dijalankan, program akan mencoba untuk terhubung ke tcp://telinks.cloud.shiftr.io:1883.

Jika berhasil terhubung, maka program akan menanti adanya data yang masuk dari program PUBLISHER, yakni program yang kita buat pada eksperimen sebelumnya.

Berikut adalah tampilan programnya.

Selanjutnya, kita jalankan program PUBLISHER.

Dan seketika setelah data sampai di MQTT Broker, maka program yang melakukan SUBSCRIBE akan menerima data.

Screenshot di atas ini menampilkan data suhu room1 dan room2. Sedangkan data alive tidak muncul karena program melakukan SUBSCRIBE ke: paho-pellesc-tesing/+/temp.

Simbol + digunakan untuk melakukan SUBSCRIBE ke semua cabang dari paho-pellesc-testing yang memiliki data temp. Dalam hal ini terdapat 2 cabang yakni: room1/temp dan room2/temp.

Selanjutnya, kita ubah program agar melakukan SUBSCRIBE ke #.

define TOPIC "#"

Hasilnya adalah sebagai berikut.

Dan berikut ini adalah tampilan pada halaman telinks.cloud.shiftr.io.

Kesimpulan

Dengan library Paho MQTT C Client, kita dapat dengan mudah membuat program aplikasi MQTT dengan operasi PUBLISH dan SUBSCRIBE.

Namun demikian, eksperimen yang kita lakukan ini hanyalah sekedar membuktikan bahwa library Paho MQTT C Client memang bekerja dengan baik. Kita belum membuat aplikasi apapun. Selanjutnya, kita bisa gunakan library ini untuk membuat aplikasi sederhana, antara lain:

  • MQTT-to-Serial Bridge – dengan program ini, kita bisa mengubah piranti serial menjadi IoT Connected Device
  • MQTT-to-USB Bridge – dengan program ini, kita bisa mengontrol modul-modul USB Relay melalui internet dengan perantaraan MQTT Broker
  • Ide program lain bisa Anda sampaikan pada kolom Komentar

Nah, sekian dulu, sampai jumpa pada eksperimen-eksperimen selanjutnya. Semoga bermanfaat.

Pelatihan PRIVAT Online

Simak Artikel Menarik Lainnya