Komunikasi Wemos Dengan Mosquitto Mqtt

by jq_rbp in Circuits > Arduino

117 Views, 0 Favorites, 0 Comments

Komunikasi Wemos Dengan Mosquitto Mqtt

IMG_0169.JPG

Perangkat keras yang digunakan dalam percobaan ini:

  1. Satu Wemos d1 mini lite.
  2. Satu LED (opsional, di sini menggunakan LED bawaan dari wemos).
  3. Satu Sensor Analog (opsional, untuk demonstrasi publish sensor ke broker). Output sensor dihubungkan dengan pin A0, ADC dari wemos d1 mini lite. Dalam contoh ini menggunakan sensor pressure transducer yang dihubungkan dengan 3.3V, GND, dan pin A0 dari wemos d1 mini lite.
  4. Satu Raspberry pi 3 untuk menjalankan mosquitto (bisa juga diganti dengan PC / perangkat keras lainnya yang mampu menjalankan OS linux.

Perangkat lunak yang digunakan:

  1. Arduino
  2. Mosquitto.

Tambahan:

  1. Koneksi internet untuk mengunduh library / source code yang diperlukan.
  2. Wifi Router / Hub untuk menghubungkan wemos dengan network mqtt.

Menyiapkan Arduino

esp8266 board_manager.png

Library / Base board yang perlu diinstal ke dalam Arduino terlebih dahulu:

  1. ESP8266:
    • Sumber: https://github.com/esp8266/Arduino.
    • Instalasi:
      1. Jalankan Arduino.
      2. Buka Jendela "Preferences".
      3. Masukkan url: "http://arduino.esp8266.com/stable/package_esp8266com_index.json" (tanpa tanda petik) ke kolom "Additional Board Manager".

      4. Buka "Boards Manager" dari menu Tools > Board.

      5. Cari dan pilih "esp8266", lalu klik Install.

  2. Driver serial untuk wemos, CH340:
  3. ArduinoJSON:
  4. PubSubClient:
  5. Firmware yang digunakan dalam percobaan ini dapat diunduh di sini: wemos-mqtt-test

(opsional)​ Menyiapkan Sertifikat Untuk Mosquitto

generate-CA.png

Langkah ini dapat dilewati bagi yang telah berhasil membuat sertifikat untuk mosquitto (lebih jelasnya dapat dilihat di: Membuat Mqtt Broker Memakai Mosquitto.

Berikut adalah cara membuat sertifikatnya:

Unduh script file generate-CA.sh:

$wget https://raw.githubusercontent.com/owntracks/tools/master/TLS/generate-CA.sh

Atur shell environment variables:

$export IPLIST="192.168.1.1 127.0.0.1"
$export HOSTLIST="localhost 192.168.1.1 127.0.0.1 raspberrypi raspberrypi.local"

*Catatan ganti IPLIST dan HOSTLIST ini sesuai dengan konfigurasi ip dan hostname dari OS dimana mosquitto akan dijalankan. Di sini ip address yang digunakan oleh raspberry pi adalah 192.168.1.1

Ganti properti akses generate-CA.sh:

$chmod a+rx generate-CA.sh

Jalankan script file generate-CA.sh:

$./generate-CA.sh

Jika berhasil, maka dalam folder generate-CA ini, akan terdapat ca.crt dan sertifikat untuk mosquitto server.

Di sini sertifikat tersebut bernama raspberrypi.crt dan raspberrypi.key

(opsional)​ Mengatur Sertifikat Mosquitto

cp_cert_mosquitto.png

Langkah ini dapat dilewati bagi yang sudah berhasil membuat sertifikat untuk mosquitto.

Copy sertifikat ca dan mosquitto yang telah dibuat ke dalam folder konfigurasi mosquitto:

$sudo cp ca.crt /etc/mosquitto/ca_certificates/

Kemudian untuk sertifikat moquittonya:

$sudo cp raspberrypi.* /etc/mosquitto/certs/

Ganti owner sertifikat yang ada di folder konfigurasi mosquitto:

$sudo chown root:root /etc/mosquitto/ca_certificates/*
$sudo chown root:root /etc/mosquitto/certs/*

(opsional) Buat file password untuk mosquitto, dalam konfigurasi di sini:

username: admin

password: adminpass:

$sudo mosquitto_passwd -c /etc/mosquitto/passwd admin

(opsional)​ Mengatur Konfigurasi Mosquitto

konfig_mosquitto.png

Buka nano untuk membuat file konfigurasi mosquitto:

$sudo nano /etc/mosquitto/conf.d/default.conf

Ketik konfigurasi berikut ini ke dalam nano:

allow_anonymous false
password_file /etc/mosquitto/passwd
listener 8883
cafile /etc/mosquitto/ca_certificates/ca.crt
certfile /etc/mosquitto/certs/raspberrypi.crt
keyfile /etc/mosquitto/certs/raspberrypi.key
require_certificate true
tls_version tlsv1.1

*Catatan: ganti cafile, certfile, dan keyfile sesuai dengan alamat file sertifikat yang telah di-copy pada langkah sebelumnya.

Simpan, lalu keluar dari nano dengan menekan Ctrl-x dan yes.

Restart mosquitto:

$sudo systemctl restart mosquitto

Membuat Sertifikat Untuk Wemos

make_wemos_cert.png

Buat sertifikat klien menggunakan script generate-CA.sh:

$./generate-CA.sh client wemos

Ubah Sertifikat Wemos Menjadi Tipe DER

change_to_der_cert.png

Dasar perintah untuk file crt:

$openssl x509 -in <crt file> -out <der out file> -outform DER

Dasar perintah untuk file key:

$openssl rsa -in <key file> -out <der key out file> -outform DER

Di sini file sertifikat untuk wemos yang dibutuhkan dan sudah dibuat adalah: ca.crt, wemos.crt, dan wemos.key, sehingga perintah di atas menjadi:

$openssl x509 -in ca.crt -out ca.crt.der -outform DER
$openssl x509 -in wemos.crt -out wemos.crt.der -outform DER
$openssl rsa -in wemos.key -out wemos.key.der -outform DER

Masukkan Semua Sertifikat Ke Dalam File Arduino

cert der to variable array

Apabila belum diunduh di langkah sebelumnya, unduh firmware / source code wemos yang terdapat di sini: wemos-mqtt-test, lalu buka file cert.c.

Di file cert.c ini terdapat variabel array yang dibuat berdasarkan sertifikat mqtt klien tipe DER, perintah:

$xxd -i <input file>

Lalu copy hasil keluaran program ini ke dalam file cert.c.

Dalam langkah sebelumnya, file der yang telah dibuat adalah ca.crt.der, wemos.crt.der, dan wemos.key.der, sehingga perintah yang digunakan menjadi:

$xxd -i ca.crt.der
$xxd -i wemos.crt.der
$xxd -i wemos.key.der

Perlu diperhatikan bahwa dalam program Arduino ini, nama variabel sertifikat yang digunakan adalah:

ca_crt_der_len;
ca_crt_der;
wemos_crt_der;
wemos_key_der;

Jika file sertifikat DER untuk wemos yang dibuat dalam langkah sebelumnya memiliki nama yang lain, maka nama variabel array keluaran ini harus disesuaikan / diganti dengan nama variabel di atas. Jika tidak, maka akan terjadi galat ketika proses kompilasi dan/atau verifikasi antara wemos dan mosquitto.

Ubah Variabel Fingerprint Dalam Program Arduino

fingerprint with arduino.png

Untuk melakukan verifikasi tls, program Arduino ini memerlukan fingerprint dari sertifikat mosquitto.

Dasar perintah untuk melihat fingerprint ini adalah:

$openssl x509 -in <mosquitto crt file> -sha1 -noout -fingerprint

Di sini, sertifikat crt yang digunakan mosquitto adalah raspberrypi.crt, sehingga perintah di atas menjadi:

$openssl x509 -in raspberrypi.crt -sha1 -noout -fingerprint

Setelah itu, masukkan variabel fingerprint ini ke dalam file wemos-mqtt-test.ino, variabel fingerprint, dan ubah karakter ":" menjadi spasi

Ubah Konfigurasi Wifi Dan Mqtt Dalam Program Arduino

wifi_mqtt_config.png

Sesuaikan konfigurasi wifi dan mqtt yang telah dibuat dalam program Arduino:

  1. Ubah variabel wifi_ssid dan wifi_password sesuai dengan konfigurasi wifi access point yang berada dalam satu network dengan mosquitto.
  2. Ubah variabel mqtt_server sesuai dengan alamat ip dari raspberry pi / mosquitto, termasuk juga port, username, dan password yang digunakan.

Ubah Id Dan Topik Mqtt Sesuai Dengan Yang Diinginkan

mqtt_id_topic.png

Topik yang digunakan program Arduino untuk wemos di sini, dibuat berdasarkan daftar topik yang digunakan pada proyek homebridge-mqtt.

Dalam program Arduino ini, wemos akan men-subscribe kepada dua topik:

  1. Untuk mengeset nilai ledState: "homebridge/from/set".
  2. Untuk mem-publish nilai sensor dan/atau ledState: "homebridge/from/get".

Kemudian pesan mqtt yang dikirim ke dalam topik "homebridge/from/set" ini, harus berbentuk variabel json dengan format:

{"name":"wemos-01-led-01","value":false} 

atau

 {"name":"wemos-01-led-01","value":true}

dimana "wemos-01-led-01" adalah nilai dari variabel wemos_led_name yang telah diset sebelumnya yang dapat diganti sesuai dengan kebutuhan.

Untuk topik homebridge/from/get, wemos akan merespon ke topik "homebridge/to/set" dengan mengirimkan nilai sensor atau ledState, sesuai dengan nilai variabel json, "name" dari pesan yang diterimanya.

Selain itu, setiap ~500ms, wemos akan mem-publish nilai sensor yang terbaca oleh ADC ke dalam topik "homebridge/to/set" dengan format pesan dalam bentuk json.

Contoh pesan yang dipublish:

{"name":"wemos-01-sensor-01","value":1005}

Dimana wemos-01-sensor-01 adalah nilai dari variabel wemos_sensor_name dalam file wemos-mqtt-test.ino.

Tes Koneksi

koneksi wemos berhasil

Apabila semua variabel: sertifikat, wifi, dan mqtt, sudah sesuai dengan kondisi network yang ada, program Arduino ini pun dituliskan ke dalam board wemos d1.

Kemudian lewat serial monitor, dapat dilihat proses komunikasi mqtt yang dilakukan oleh wemos kepada mosquitto. Bila koneksi berhasil dilakukan dan verifikasi sertifikat pun berhasil dengan informasi: certificate matches, maka wemos pun siap untuk menerima pesan di topik mqtt yang telah diset.

Tes Subscribe Nilai Sensor

klien_cert.png
sensor_publish.png

Untuk melakukan tes pengiriman pesan ke wemos, diperlukan program klien mqtt yang mampu berinteraksi dengan mosquitto. Untuk itu, dibutuhkan juga sebuah sertifikat yang dapat digunakan oleh program tersebut untuk dapat masuk dalam topik yang telah ditentukan dalam program Arduino pada langkah sebelum ini.

Oleh karena itu, script generate-CA.sh pun perlu dijalankan kembali:

$./generate-CA.sh client klien

Kemudian, untuk dapat melihat nilai sensor yang di-publish oleh wemos setiap ~500ms, mqtt klien dapat mendengarkan pesan dalam topik "homebridge/to/set".

Dengan menggunakan aplikasi mosquitto_sub, hal ini dapat dilakukan dengan perintah:

$mosquitto_sub -h 127.0.0.1 -p 8883 --cert klien.crt --key klien.key --cafile ca.crt --tls-version tlsv1.1 -u admin -P adminpass -t "homebridge/to/set"

Tes Pengiriman Pesan

tes pengiriman pesan mqtt

Tes pengiriman pesan di sini dapat dilakukan dengan aplikasi mosquitto_pub melalui topik "homebridge/from/set". Di sini pesan dalam bentuk json, dapat ditargetkan ke arah ledState yang langsung terhubung dengan output lampu LED pada board wemos d1 mini lite.

Perintah yang dijalankan adalah sebagai berikut:

1. Untuk mengeset ledState menjadi HIGH

$mosquitto_pub -h 127.0.0.1 -p 8883 --cert klien.crt --key klien.key --cafile ca.crt --tls-version tlsv1.1 -u admin -P adminpass -t "homebridge/from/set" -m '{"name":"wemos-01-led-01","value":true}'

2. Untuk mengeset ledState menjadi LOW

$mosquitto_pub -h 127.0.0.1 -p 8883 --cert klien.crt --key klien.key --cafile ca.crt --tls-version tlsv1.1 -u admin -P adminpass -t "homebridge/from/set" -m '{"name":"wemos-01-led-01","value":false}'