###### tags : `xirka` `documentation` `tutorial` # Implementasi IoT dengan Menggunakan ESP32 dan Xirka IoT Platform Oleh Yudi Aditya ## A. Pendahuluan - Teknologi IoT memiliki peran penting dalam mengembangkan industri 4.0. - Perangkat ESP32 merupakan alternatif untuk mengimplementasikan IoT. - ESP32 memiliki kemampuan untuk mengirimkan pesan baik melalui protokol HTTP, MQTT atau bluetooth. ## B. Komunikasi dengan Protokol MQTT > [MQTT (Message Queuing Telemetry)](https://mqtt.org/) adalah protokol komunikasi yang dirancang untuk pertukaran informasi M2M (machine to machine) di lingkungan bandwidth rendah. ### 1. Karakteristik MQTT : * Running on TCP/IP Layer, * Publish / Subscribe Model * Lightweight messaging * Low overhead * Fast in data transmission ### 2. Komponen MQTT ![](https://i.imgur.com/w5aWVgp.png) * Klien : Mengirimkan / Menerima pesan * Server : Verifikasi akun, meneruskan pesan * Pesan : data yang di transmit ### 3. Pustaka / Perangkat Lunak MQTT * MQTT Client * MQTT Server / Broker List pustaka / perangkat lunak yang mengimplementasikan protokol mqtt bisa dilihat di [sini](https://en.wikipedia.org/wiki/Comparison_of_MQTT_implementations). Salah satu alternatif MQTT server adalah [Xirka IoT Platform](http://202.148.1.57:8200). ### 4. Xirka IoT Platform > Layanan Internet of Things yang dikembangkan oleh PT Xirka Dama Persada. Fitur yang dimiliki layanan ini antara lain : * Broker server * Dashboard (application & device management) * Data visualization Untuk mendapatkan layanan ini secara gratis bisa mengunjungi [link berikut](http://202.148.1.57:8200). ## C. Studi Kasus 1 : Pengiriman data dari MQTTFx ke Xirka IoT Platform ### 1 Registrasi Akun, Aplikasi dan Perangkat di Xirka IoT Platform * Buat akun xirka IoT Platform pada link [berikut](http://202.148.1.57:8200/signup). Selesaikan proses registrasi dengan melakukan verifikasi melalui email. * Pada dashboard, buat aplikasi dengan memasukan nilai : ID Aplikasi, Nama Aplikasi, Ikon, dan Deskripsi. | Field | Contoh | | -------- | -------- | | App Id | Esp32Demo | | App Name | Aplikasi Demo ESP32 | | Deskripsi| Aplikasi Demo ESP32 | > App Key digenerate otomatis setelah aplikasi dibuat. * Pada aplikasi yang telah dibuat, daftarkan perangkat IoT anda : misalkan `perangkat001`. ### 2 Mengirim data menggunakan MQTTFx * Download dan install aplikasi MQTTFx di link [berikut](http://www.jensd.de/apps/mqttfx/1.7.1/). * Setup profile koneksi pada mqttfx dengan konfigurasi sebagai berikut: | Field | Deskripsi | Contoh | | -------- | -------- | -------- | | Broker Address | Alamat MQTT Broker | 202.148.1.57 | | Broker Port | Port MQTT Broker | 1883 | | Username | Username MQTT Client | - | | Password | Password MQTT Client | - | * Username dan password diambil dari AppKey. AppKey `app-Esp32Demo.oMXom2Oqfdfwff23`, memiliki `Username : app-Esp32Demo` dan `password : oMXom2Oqfdfwff23`. * Hubungkan MQTTFx sampai ikon koneksi berubah warna hijau. * Kirim pesan oleh MQTTFx dengan topik `<nama_perangkat>` dan pesan sebagai berikut : `{"payload": {"temp": 21, "hum": 32}}` * Lihat data masuk di dashboard Xirka IoT Platform ![](https://i.imgur.com/VVfrkKc.png) ![](https://i.imgur.com/I5vM6rh.png) ## D. Studi Kasus 2 : Pengiriman data dari ESP32 ke Xirka IoT Platform ### 1. Entitas | Entitas | Peran | | -------- | -------- | | Klien 1 | Esp32 | | Klien 2 | MQTTFx | | Server | Server Xirka IoT Platform | ### 2. Skenario #### Skenario 1 ```sequence Klien 1->Server: send data Server->Klien 2: forward Data ``` > Data yang dikirimkan adalah data dummy dengan format : `{"payload": {"temp": <temp>, "hum": <hum>}}` #### Skenario 2 ```sequence Klien 2->Server: send command Server->Klien 1: forward command Note right of Klien 1: turn on/off led ``` > Perintah yang dikirimkan : `{"payload":{"message":"on"}}` ### 3. Tools * ESP32 * Arduino IDE ### 4. Instalasi Dependensi * Install esp32 di arduino IDE. - Pada menu File > Preferences, tambahkan url : https://dl.espressif.com/dl/package_esp32_index.json pada additional managers. Gunakan separator tanda koma jika sudah ada url board lain. - Install board esp32 pada menu board manager di `Tools > Board > Boards Manager`. Pilih esp32 by Espressif systems, kemudian install. ![](https://i.imgur.com/qnDU5gp.png) - Setelah board esp32 telah diinstall, pilih board `Tools > Board > Boards Manager > esp32 > DOIT ESP32 DEV KIT V1`. Nama board disesuaikan dengan board yang digunakan. * Pada Tools > Manage Library, install PubSubClient oleh Nick O'Leary. ![](https://i.imgur.com/NyDoBQJ.png) ### 5. Kode Program Unduh kode lengkap di link [berikut](https://github.com/mraditya89/esp32_xirka_iot/blob/main/pub_sub_example.ino) #### 5.1 Variable Global ```gherkin=1 #include <WiFi.h> #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); // TODO // 1. Setup Wifi config // 2. Setup mqtt client config // 3. Setup mqtt broker config // 4. Change device & topic switch // 1. WIFI CONFIG const char* SSID = "<SSID>"; const char* SSID_PASSWORD = "<SSID_PASSWORD>"; // 2. MQTT CLIENT CONFIG char CLIENT[]= "<MQTT USERNAME>"; char CLIENT_PASSWORD[]="<MQTT PASSWORD>"; // 3. MQTT BROKER CONFIG const char* BROKER_SERVER = "202.148.1.57"; const int BROKER_PORT = 1883; // 4. DEVICE const char* DEVICE = "deviceABC"; const char* TOPIC_SWITCH = "deviceABC/switch"; // MISC long lastMsg = 0; // PAYLOAD char payload[512]; // LED PIN volatile byte ledState = LOW; ``` #### 5.2 Fungsi Setup ```gherkin=41 void setup() { Serial.begin(115200); setupWifi(); client.setServer(BROKER_SERVER, BROKER_PORT); client.setCallback(mqttCallback); pinMode(LED_BUILTIN, OUTPUT); } ``` #### 5.3 Fungsi Setup Wifi ```gherkin=49 void setupWifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(SSID); WiFi.begin(SSID, SSID_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } ``` #### 5.4 Fungsi MQTT Callback ```gherkin=68 void mqttCallback(char* topic, byte* message, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(messageTemp); if (String(topic) == TOPIC_SWITCH) { Serial.print("Changing output to "); if(messageTemp == "{\"payload\":{\"message\":\"on\"}}"){ Serial.println("on"); ledState = HIGH; } else if(messageTemp == "{\"payload\":{\"message\":\"off\"}}"){ Serial.println("off"); ledState = LOW; } } } ``` #### 5.5 Fungsi Menghubungkan ke Server ```gherkin=93 void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect("esp32client", CLIENT, CLIENT_PASSWORD)) { Serial.println("connected"); // Subscribe client.subscribe(TOPIC_SWITCH); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } ``` #### 5.6 Fungsi Pengulangan ```gherkin=111 void loop() { // TURN ON / OFF LED digitalWrite(LED_BUILTIN, ledState); // TRY TO CONNECT TO BROKER if (!client.connected()) { reconnect(); } client.loop(); // HANDLER MESSAGE long now = millis(); if (now - lastMsg > 10000) { lastMsg = now; int temperature = random(0, 30); int humidity = random(0, 20); sprintf(payload,"{\"payload\":{\"humidity\":%d, \"temperature\":%d}}", humidity, temperature); Serial.println(payload); client.publish(DEVICE, payload); } } ``` ### 6. Implementasi Program - Upload kode program ke perangkat ESP32 - Pantau serial monitor dengan nilai baudrate 115200. Pastikan esp32 terhubung ke internet, server mqtt, dan mengirimkan data setiap 10 detik. ![](https://i.imgur.com/gDMmgk2.png) - Perhatikan pada dashboard xirka IoT, data telah berhasil ditangkap dan disimpan dalam database. - Buka MQTTFx kemudian subscribe topik `<nama_device>`. Lihat perhatikan data masuk juga pada MQTTFx di waktu yang bersamaan - Pada MQTTFx, kirimkan pesan pada topik `<nama_device>/switch` dengan pesan : `{"payload":{"message":"on"}}`. Perhatikan LED pada ESP32 menyala. - Kirimkan pesan pada topik yang sama dengan perintah `{"payload":{"message":"off"}}` untuk mematikan LED. > Pesan untuk mematikan / menyalakan LED harus sama.