IOT Basic Tutorial

Last updated: January 27 th, 2017

Geeknesia Microcontroller & IOT Starter Kit

Geeknesia Kit

Sebuah Starter Kit Lengkap dari Geeknesia untuk mempelajari IOT dan Micro Controller dengan mudah melalui praktek secara langsung.
Starter Kit ini menyediakan development board ESP 8266 tipe WeMos D1 yang compatible dengan board arduino sehingga mudah dipahami, muda diperlajari, dan mudah dimengerti. Dalam kit ini tersedia komponen elektronik lengkap untuk berbagai keperluan tutorial dan project real.

Read More or Buy Now !

Part 6 ESP8266 MQTT - MQTT Control with Response

Reading Requirement:

Pada project ini sama halnya dengan tutorial ESP8266 MQTT - Kontrol Mengunakan Geeknesia namun pada project ini telah dilengkapi dengan fitur feedback dari device ke cloud.

untuk mencoba project ini ikuti langkah-langkah berikut ini:

#include 
#include 
#include 


const char *ssid = "wifi-ssid"; // cannot be longer than 32 characters!

const char *pass = "wifi-password";

const int ledPin =  2; // pin for output



// device details

char *deviceId = "device-ac53d5613c42445e9fa0154399-----";

char *deviceTopic = "topic-ac53d5613c42445e9fa0154399-----";

char *deviceUsername = "daa364a0dce8075cd2ba891894-----";

char *devicePassword = "58ba26c9a98b6f3da58671240-----";

char *deviceApiKey = "4d291b91bf83b203b41a579c61-----";

String deviceCredential = String(deviceUsername) + ":" + String(devicePassword);



#define BUFFER_SIZE 100



WiFiClient wclient;

PubSubClient client(wclient, (String) "geeknesia.com", 1883); // inisiasi MQTT Client



void callback(const MQTT::Publish& pub) {

  Serial.print(pub.topic());

  Serial.print(" => ");

  Serial.println(pub.payload_string());

  String json_data = pub.payload_string(); // {"action":"counting","response_topic":"custom/response/topic"}

  StaticJsonBuffer<200> jsonBuffer;

  JsonObject& root = jsonBuffer.parseObject(json_data); // parsing json data

  String action = root["action"];

  String response_topic = root["response_topic"];

  Serial.println(action);

  Serial.println(response_topic);

  actions(action, response_topic); // panggil fungsi actions untuk melakukan aksi sesuai dengan perintah yang diterima

  Serial.println("End of callback");

}



void setup() {

  // Setup console

  Serial.begin(115200);

  delay(10);

  Serial.println();

  Serial.println();

  pinMode(ledPin, OUTPUT);

}



void loop() {

  if (WiFi.status() != WL_CONNECTED) {

    Serial.print("Connecting to ");

    Serial.print(ssid);

    Serial.println("...");

    WiFi.begin(ssid, pass);



    if (WiFi.waitForConnectResult() != WL_CONNECTED)

      return;

    Serial.println("WiFi connected");

  }



  if (WiFi.status() == WL_CONNECTED) {

    if (!client.connected()) {

      if (client.connect(deviceId, "iot/will",0,0,deviceId)) {

        client.set_callback(callback);

        client.subscribe(deviceTopic);

      }

    }



    if (client.connected())

      client.loop();

  }

}



void actions(String action, String topic) {

  // format response : {"topic":"topiknya","response":{"counter":10}}

  String lamp_status;

  if (action.equals("on")){

    digitalWrite(ledPin, HIGH);

    lamp_status = "\"Lampu di nyalakan\"";

  }

  if (action.equals("off")){

    digitalWrite(ledPin, LOW);

    lamp_status = "\"Lampu di matikan\"";

  }

  String res = "{\"topic\":\"" + topic + "\",\"response\":{\"lamp_status\":" + lamp_status +"}}";

  Serial.println(res);

  client.publish("iot/control/response",res); // kirim response ke pengirim perintah



}
  •  Install mqtt client pada chrome https://chrome.google.com/webstore/detail/mqtt-client-tcp-and-ws/kaajoficamnjijhkeomgfljpicifbkaf?utm_source=chrome-app-launcher-info-dialog.

  • Jika sudah terinstall buka aplikasi,kemudian pilih add connection dan isi connection setting seperti gambar di bawah ini.
     

  • Klik subcribe new topic untuk menampilkan hasil respon dari device, dan lihatlah gambar hasil percobaan ini.
    Pada kolom Message terlihat format pengiriman dan penerima data.
    {"action":"on","topic":"topic-ac53d5613c42445e9fa01543996e1015","response_topic":"response-topic-ac53d5613c42445e9fa01543996e1015"}
     

    "action":"on","topic":"topic-ac53d5613c42445e9fa01543996e1015" adalah format pengiriman perintah "on" pada device,sedangkan

    "response_topic":"response-topic-ac53d5613c42445e9fa01543996e1015" adalah format penerima atau feedback dari device.
    Terlihat pada tabel subscribe Topic-topic perintah yang dikirim berbentuk string "on" dan "off" untuk dibandingkan dengan code arduino dan memerintahkan lampu menyala, sedangkan pada tabel Topic-response terlihat bahwa device telah memberikan feedback ke cloud dengan format json dari device "Lampu di nyalakan" dan "Lampu di matikan".

 

Sebelum artikel ini selesai, sebaiknya saya merangkum kembali beberapa hal yang penting untuk melakukan hal di atas.

 

  • Format send control harus berupa JSON dan dengan 3 attribut utama yakni action, topic dan response_topic dimana topic adalah published topic dari gateway geeknesia sedangkan response_topic adalah topic yang dapat anda sesuaikan, semakin random semakin bagus.
    {
    
        "action":"kata_action",
    
        "topic":"topic-device-tujuan",
    
        "response_topic":"response-topic-yang-di-subscribe-oleh-pengirim"
    
    }

     

  • Format response data dari gateway yang dikontrol harus berupa JSON dengan 2 attribut utama yakni topic dan response dimana response dapat berupa object json yang isinya dapat disesuaikan dengan kebutuhan.
     
    {
    
        "topic":"response-topic-yang-di-subscribe-oleh-pengirim",
    
        "response":
    
            {
    
                "string-response":"error",
    
                "boolean-response":true,
    
                "integer-response":4,
    
                "other-attributes":"other-attributes-value"
    
            }
    
    }
     

     

  • Untuk memeriksa apakah format send dan response sudah benar, dapat menggunakan bantuan toolsJSONLint