---
# System prepended metadata

title: Implementasi IoT dengan Menggunakan ESP32 dan Xirka IoT Platform
tags: [documentation, tutorial, xirka]

---

###### 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.  
