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

* 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


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

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

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

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