Komunikasi Wemos Dengan Mosquitto Mqtt
by jq_rbp in Circuits > Arduino
117 Views, 0 Favorites, 0 Comments
Komunikasi Wemos Dengan Mosquitto Mqtt
Perangkat keras yang digunakan dalam percobaan ini:
- Satu Wemos d1 mini lite.
- Satu LED (opsional, di sini menggunakan LED bawaan dari wemos).
- 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.
- Satu Raspberry pi 3 untuk menjalankan mosquitto (bisa juga diganti dengan PC / perangkat keras lainnya yang mampu menjalankan OS linux.
Perangkat lunak yang digunakan:
- Arduino
- Mosquitto.
Tambahan:
- Koneksi internet untuk mengunduh library / source code yang diperlukan.
- Wifi Router / Hub untuk menghubungkan wemos dengan network mqtt.
Menyiapkan Arduino
Library / Base board yang perlu diinstal ke dalam Arduino terlebih dahulu:
- ESP8266:
- Sumber: https://github.com/esp8266/Arduino.
- Instalasi:
- Jalankan Arduino.
- Buka Jendela "Preferences".
-
Masukkan url: "http://arduino.esp8266.com/stable/package_esp8266com_index.json" (tanpa tanda petik) ke kolom "Additional Board Manager".
-
Buka "Boards Manager" dari menu Tools > Board.
-
Cari dan pilih "esp8266", lalu klik Install.
- Driver serial untuk wemos, CH340:
- Sumber: https://wiki.wemos.cc/downloads
- Fungsi: untuk membuka port serial (programming / debug) dari wemos d1 mini lite supaya dapat dikenali oleh Arduino.
- ArduinoJSON:
- Sumber: https://github.com/bblanchon/ArduinoJson
- Instalasi:
- Jalankan Arduino.
- Klik Sketch > Include Library > Manage Libraries
- Cari "ArduinoJson".
- Klik Install.
- PubSubClient:
- Sumber: https://github.com/knolleary/pubsubclient/
- Instalasi:
- Jalankan Arduino.
- Klik Sketch > Include Library > Manage Libraries.
- Cari "PubSubClient".
- Klik Install.
- Firmware yang digunakan dalam percobaan ini dapat diunduh di sini: wemos-mqtt-test
(opsional) Menyiapkan Sertifikat Untuk Mosquitto
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
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
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
Buat sertifikat klien menggunakan script generate-CA.sh:
$./generate-CA.sh client wemos
Ubah Sertifikat Wemos Menjadi Tipe DER
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
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
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
Sesuaikan konfigurasi wifi dan mqtt yang telah dibuat dalam program Arduino:
- Ubah variabel wifi_ssid dan wifi_password sesuai dengan konfigurasi wifi access point yang berada dalam satu network dengan mosquitto.
- 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
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:
- Untuk mengeset nilai ledState: "homebridge/from/set".
- 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
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
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 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}'