Anda di halaman 1dari 31

MQTT(Message Queuing Telemetry Transport), Protokol Komunikasi Untuk IoT

PENGANTAR

Pengertian MQTT

MQTT singkatan dari Message Queuing Telemetry Transport adalah protokol komunikasi ringan
berbasis publish/subscribe yang diracang khusus untuk komunikasi antar perangkat berdaya rendah.
Protokol ini dirancang oleh Andy Standford – Clark (IBM) dan Arlen Nipper di tahun 1999, yang semula
dibuat untuk menghubungkan sistem telemetri jalur pipa minyak melalui satelit.

Meskipun awalnya MQTT adalah protokol yang bersifat proprietary, namun pada 2010 dirilis
dengan lisensi Royalty free, Dan pada 2014 menjadi standar OASIS

MQTT berjalan di atas Transmission Control Protocol / Internet Protocol (TCP/IP)


sebagaimana digambar dalam skema berikut (Gambar 1).

Gambar 1. Lapisan protokol mqtt

MQTT lebih ringan dibandingkan dengan protokol HTTP 1.1 sehingga sangat cocok untuk
digunakan pada perangkat berdaya rendah yang diharuskan mengirimkan dan menerima data dengan
ukuran sekecil mugkin.

Paradigma Publish Subscribe

Paradigma yang digunakan oleh MQTT adalah publish/subscribe yang serupa jika anda belajar
mengenai sistem komunikasi utama pada Robot Operating System. Hal ini tentu berlawanan dengan
sistem komunikasi TCP/IP yang menggunakan paradigma Request/Response.

Di dalam paradigma publish-subscribe, client yang mengirimkan sebuah pesan (publish)


dipisahkan dengan client yang berfungsi menerima pesan (subscribe). Client tidak perlu mengetahui
keberadaan client yang lain, client hanya mempublikasikan sebuah pesan dengan tipe data tertentu
(yang kemudian disebut topic) hanya kepada client yang berminat menerima publikasi topic tersebut.
Paradigma tersebut dapat dianalogikan, sebagai penerbitan surat kabar/majalah, dan orang yang
berminat berlangganan surat kabar/majalah tersebut.

Sistem komunikasi dengan paradigma publish–subscribe ini memerlukan semacam


agen distribusi majalah, atau di dalam mqtt disebut sebagai broker, atau bisa juga dinamai server.
Semua client harus memiliki koneksi dengan broker. Client yang mengirim pesan kepada broker,
disebut sebagai publisher. Broker akan memfilter pesan–pesan yang masuk dan mendistribusikannya
kepada client yang tertarik menerima pesan tersebut. Client yang tertarik menerima pesan tersebut,
sebelumnya telah mendaftarkan diri kepada broker, mereka disebut sebagai subscriber.

Misalkan terdapat sebuah rancangan sistem, yang terdiri dari Raspberry Pi, yang terhubung
dengan sebuah sensor (sebut saja, detektor radiasi nuklir). Raspberry Pi terhubung dengan broker,
dan mengirimkan pesan berupa data data cacahan radiasi nuklir terkini kepada broker (publiaher). Di
ujung yang lain, terdapat smartphone dengan sistem Operasi Android dan iOS yang menjadi
subscriber dan terhubung kepada broker. (Gambar 2)

Gambar 2. Contoh rancangan komunikasi dengan MQTT

Pada Gambar 2, board Raspberry Pi dengan detektor GM terhubung dengan broker sebagai
sebuah publisher, sedangkan ponsel pintar iOS dan Tablet Android adalah dua subscriber yang
terhubung dengan broker. Ketika ponsel pintar iOS memberikan permintaan ke broker untuk
men-subscribe semua message yang dimiliki oleh topic sensor1/radiation. Tablet android juga
melakukan hal yang sama kepada broker. Keduanya melakukan subscribe ke topic sensor1/radiation.

Pada gambar, diilustrasikan Raspberry Pi mem-publish sebuah pesan dengan 100Bq sebagai
payload dan sensor1/radiation sebagai topic. Broker menerima permintaan publikasi dari publisher,
dan mendistribusikan topic sensor1/radiation ke ponsel pintar iOS dan tablet android.
Publisher dan subscriber tidak harus berjalan pada waktu yang sama. Publisher bisa mempublish
sebuah message, baru kemudian, subscriber dijalankan belakangan. Operasi ini bersifat asinkronus,
maksudnya, publisher tidak perlu menunggu sebuah message diterima oleh subscriber, untuk bisa
melakukan pengiriman data berikutnya.

Paket Kontrol MQTT

Pesan MQTT didistribusikan secara asinkron melalui arsitektur publish-subscribe. Protokol MQTT
bekerja dengan pertukaran seri paket kontrol MQTT dengan berbagai cara. Masing-masing paket
kontrol mempunyai tujuan khusus dan setiap bit dalam paket dibuat dengan hati-hati untuk
mengurangi data yang dikirimkan melalui jaringan. Topologi MQTT memiliki server MQTT dan client
MQTT. MQTT client dan server berkomunikasi melalui paket kontrol yang berbeda. Tabel 1 dibawah
menunjukkan masing-masing paket kontrol.

Tabel 1. Paket kontrol pada MQTT

Paket Kontrol Arah Aliran Deskripsi

CONNECT Client -> Server Permintaan client untuk menyambung ke server

CONNACK Server -> Client Pengakuan penyambungan

PUBLISH Client -> Server Menerbitkan pesan

Server -> Client

PUBACK Client -> Server Pengakuan (acknowledgment) penerbitan

Server -> Client

PUBREC Client -> Server Penerbitan diterima (menjamin pengiriman bagian 1)

Server -> Client

PUBREL Client -> Server Penerbitan dilepaskan (menjamin pengiriman bagian2)

Server -> Client

PUBCOMP Client -> Server Penerbitan selesai (menjakin pengiriman bagian 3)

Server -> Client

SUBSCRIBE Client -> Server Permintaan langganan oleh client

SUBACK Server -> Client Pengakuan (acknowledgment) langganan


UNSUBSCRIBE Client -> Server Permintaan berhenti langganan

UNSUBACK Server -> Client Pengakuan (acknowledgment) berhenti langganan

PINGREQ Client -> Server Permintaan PING

PINGRESP Server -> Client Tanggapan PING

DISCONNECT Client -> Server Client diputus

Masing-masing paket kontrol MQTT terdiri dari tiga bagian: header tetap, header variabel dan
payload (Gambar 3). Setiap paket kontrol MQTT memiliki 2 byte header tetap.Tidak semua paket
kontrol mempunyai header variabel dan payload (Gambar 4). Sebuah variabel header berisi
identifikasi paket apabila digunakan oleh paket kontrol. Sebuah payload dengan kapasitas sampai
dengan 256 MB dapat disertakan dalam paket. Dengan memiliki overhead header yang kecil
membuat protokol ini sesuai untuk IoT dengan menurunkan jumlah data yang dikirim melalui jaringan
terbatas.

Gambar 3. Struktur paket standar MQTT

Nama topik, ID Client, Nama user dan password di kodekan dengan format UTF-8 string. Payload
tidak termasuk informasi protokol MQTT, seperti ID Client dan sebagainya berupa data biner, dan isi
dan formatnya berupa aplikasi spesifik.

Kolom fixed header terdiri dari bidang kontrol dan panjang variabel paket. Ukuran minimum dari
panjang paket adalah 1 byte dengan panjang total kurang dari 127 byte (tidak termasuk kontrol dan
panjang kolom). Ukuran maksimum paket adalah 256MB. Paket terkecil yang berukuran kurang dari
127 byte memiliki 1 byte kolom panjang paket. Paket yang lebih besar dari 127 byte dan kurang dari
16383 menggunakan 2 byte, dst. Ukuran paket minimum hanya 2 byte dengan bidang kontrol byte
tunggal dan bidang panjang paket byte tunggal. (Misal: pesan diskonek hanya berukuran 2 byte).
Gambar 4. Struktur paket minimum MQTT

Kolom Kontrol MQTT

Bidang kontrol berukuran 8 bit yang merupakan byte pertama pada 2 byte fixed header. Ini
dibagi kedalam 2 kolom berukuran 4 bit, dan berisi semua perintah protokol dan tanggapan. Empat
bit pertama yang paling berpengaruh adalah perintah atau bidang pesan dan 4 bit lainnya digunakan
sebagai penanda kontrol (Gambar 5).

Gambar 5. Struktur bidang kontrol MQTT

Gambar berikut adalah contoh pesan kontrol pada MQTT

Gambar 6. Contoh pesan kontrol MQTT

Atribut Publish MQTT

Client MQTT dapat mempublikasikan pesan segera setelah terhubung ke broker. MQTT
menggunakan pemfilteran berdasarkan topik dari pesan pada broker. Setiap pesan harus berisi topik
yang dapat digunakan broker untuk meneruskan pesan ke client yang tertarik. Biasanya, setiap pesan
memiliki muatan yang mengandung data yang akan dikirim dalam format byte. MQTT adalah
data-agnostik. Kasus penggunaan client menentukan bagaimana payload disusun. Client pengirim
(publisher) memutuskan apakah ingin mengirim data biner, data teks, atau bahkan data lengkap XML
atau JSON. Pesan PUBLISH di MQTT memiliki beberapa atribut antara lain (Gambar 7):

Gambar 7. Atribut publish MQTT

a) Topic Name : Nama Topik Nama topik adalah string sederhana yang terstruktur secara hierarkis
dengan garis miring ke depan sebagai pembatas. Misalnya, "myhome / livingroom /
temperature" atau "Germany / Munich / Octoberfest / people".

b) QoS : Nomor ini menunjukkan Kualitas Tingkat Layanan (QoS) pesan. Ada tiga tingkatan: 0,1, dan
2. Tingkat layanan menentukan jenis jaminan yang dimiliki pesan untuk mencapai penerima yang
dituju (client atau broker).

c) Retain Flag : Penanda ini menentukan apakah pesan disimpan oleh broker sebagai nilai bagus
terakhir yang diketahui untuk topik tertentu. Ketika client baru berlangganan suatu topik,
mereka menerima pesan terakhir yang dipertahankan pada topik itu.

d) Payload : adalah isi pesan yang sebenarnya. MQTT adalah data-agnostik. Dimungkinkan untuk
mengirim gambar, teks dalam penyandian, data terenkripsi, dan hampir setiap data dalam biner.

e) Packet Identifier : Pengidentifikasi paket secara unik mengidentifikasi pesan ketika mengalir
antara client dan broker. Pengidentifikasi paket hanya relevan untuk level QoS yang lebih besar
dari nol. Pustaka client dan / atau broker bertanggung jawab untuk mengatur pengidentifikasi
MQTT internal ini.

f) DUP Flag : Penanda ini menunjukkan bahwa pesan tersebut merupakan duplikat dan dikirim
ulang karena penerima yang dituju (client atau broker) tidak mengakui pesan asli. Ini hanya
relevan untuk QoS lebih besar dari 0. Biasanya, mekanisme kirim ulang / duplikat ditangani oleh
pustaka client MQTT atau broker sebagai detail implementasi.
Atribut Subscribe MQTT

Menerbitkan pesan tidak masuk akal jika tidak ada yang pernah menerimanya. Dengan kata lain,
jika tidak ada client untuk berlangganan ke topik pesan. Untuk menerima pesan tentang topik yang
diminati, klien mengirim pesan SUBSCRIBE ke broker MQTT. Pesan berlangganan ini sangat sederhana,
berisi pengidentifikasi paket unik dan daftar langganan (Gambar 8).

Gambar 8. Atribut subscribe MQTT

a) Packet Identifier : Pengidentifikasi paket secara unik mengidentifikasi pesan ketika mengalir
antara client dan broker. Pustaka client dan / atau broker bertanggung jawab untuk mengatur
pengidentifikasi MQTT internal ini.

b) List of Subscriptions : SUBSCRIBE dapat berisi beberapa langganan untuk client. Setiap langganan
terdiri dari topik dan tingkat QoS. Topik dalam pesan berlangganan dapat berisi wildcard yang
memungkinkan untuk berlangganan ke pola topik daripada topik tertentu. Jika ada langganan
yang tumpang tindih untuk satu client, broker mengirimkan pesan yang memiliki tingkat QoS
tertinggi untuk topik itu.

Atribut Suback MQTT

Untuk mengkonfirmasi setiap langganan, broker mengirim pesan pengakuan SUBACK ke client.
Pesan ini berisi pengidentifikasi paket dari pesan berlangganan asli (untuk mengidentifikasi pesan
dengan jelas) dan daftar kode pengembalian (Gambar 9).
Gambar 9. Atribut suback MQTT

a) Packet Identifier : Pengidentifikasi paket adalah pengidentifikasi unik yang digunakan untuk
mengidentifikasi pesan. Itu sama dengan di pesan SUBSCRIBE.

b) Return Code: broker mengirimkan satu kode pengembalian untuk setiap topik / pasangan QoS
yang diterimanya dalam pesan SUBSCRIBE. Misalnya, jika pesan SUBSCRIBE memiliki lima
langganan, pesan SUBACK berisi lima kode pengembalian. Kode pengembalian mengakui setiap
topik dan menunjukkan tingkat QoS yang diberikan oleh broker. Jika broker menolak
berlangganan, pesan SUBACK berisi kode pengembalian gagal untuk topik tertentu. Misalnya,
jika client memiliki izin yang tidak memadai untuk berlangganan topik atau topik salah (Tabel 2).

Tabel 2. Tanggapan return code

Return Code Tanggapan

0 Sukses - QoS max 0

1 Sukses - QoS max 1

2 Sukses - QoS max 2

128 Gagal

Setelah klien berhasil mengirim pesan SUBSCRIBE dan menerima pesan SUBACK, setiap pesan
yang diterbitkan cocok dengan topik dalam langganan yang berisi pesan SUBSCRIBE (Gambar 10)
Gambar 10. Aliran subscribe-publish pada MQTT

Atribut Unsubscribe MQTT

Kebalikan dari pesan SUBSCRIBE adalah pesan UNSUBSCRIBE. Pesan ini menghapus langganan
client yang ada di broker. Pesan UNSUBSCRIBE mirip dengan pesan SUBSCRIBE dan memiliki
pengidentifikasi paket dan daftar topik (Gambar 11).

Gambar 11. Atribut unsubscribe MQTT

a) Packet Identifier: Pengidentifikasi paket secara unik mengidentifikasi pesan ketika mengalir
antara client dan broker. Pustaka client dan / atau broker bertanggung jawab untuk mengatur
pengidentifikasi MQTT internal ini.

b) List of Topic : Daftar topik dapat berisi banyak topik dari mana client ingin berhenti berlangganan.
Anda hanya perlu mengirim topik (tanpa QoS). Broker berhenti berlangganan topik, terlepas dari
tingkat QoS yang menjadi topik berlangganannya.

Atribut Unsuback MQTT

Untuk mengonfirmasi berhenti berlangganan, broker mengirim pesan pengakuan UNSUBACK


kepada client. Pesan ini hanya berisi pengenal paket dari pesan UNSUBSCRIBE asli (untuk
mengidentifikasi pesan dengan jelas) (Gambar 12).
Gambar 12. Atribut unsuback MQTT

a) Packet Identifier: Pengidentifikasi paket secara unik mengidentifikasi pesan. Seperti yang telah
disebutkan, ini adalah pengidentifikasi paket yang sama yang ada di pesan UNSUBSCRIBE.

Setelah menerima UNSUBACK dari broker, client dapat berasumsi bahwa langganan dalam pesan
UNSUBSCRIBE dihapus (Gambar 13).

Gambar 13. Aliran unsubscribe-unsuback pada MQTT


INSTALASI

Instalasi Server

Server yang digunakan adalah Linux Ubuntu Server 18.04.1.0 LTS, berikut langkah instalasinya :

1) Memilih bahasa

2) Memilih layout keyboard yang digunakan


3) Pilih tipe instalasi
4) Konfigurasi jaringan yang digunakan
5) Konfigurasi alamat proxy server (jika ada)

6) Konfigurasi alamat mirror penginstalan


7) Pilih jenis partisi penginstalan
8) Pilih tempat/media penginstalan
9) Finalisasi partisi boot penginstalan

10) Konfirmasi instal pada disk


11) Mengisi nama komputer dan password

12) Pemilihan paket instalasi tambahan (SNAPS)


13) Proses instalasi dimulai
14) Instalasi selesai dan permintaan booting ulang

15) Instalasi berhasil dan masuk ke prompt login


16) Update instalan, ketik perintah berikut:

$sudo apt-get update && sudo apt-get upgrade

Membuka port ssh

1) Masuk ke konfigurasi file ssh

$sudo nano /etc/ssh/sshd_config

2) Hilangkan tanda # pada #Port 22 dalam konfigurasi file

3) Simpan (Ctrl+O) dan keluar (Ctrl+X)

4) Restart service ssh

$service ssh restart

Menghilangkan cloud-init

Jika Anda mencoba untuk memulai VM Ubuntu berbasis cloud-init dengan KVM, Anda akan
mengalami waktu boot yang lama dan output yang membingungkan pada terminal. Jika Anda ingin
menghilangkannya, Anda perlu menghapus cloud-init, langkahnya sbb:

1) Tunggu sampai VM booting


2) Login

3) Ketik perintah berikut

$echo 'datasource_list: [ None ]' | sudo -s tee


/etc/cloud/cloud.cfg.d/90_dpkg.cfg

$sudo apt-get purge cloud-init

sudo rm -rf /etc/cloud/; sudo rm -rf /var/lib/cloud/

4) Reboot sistem

Menambahkan GUI

Secara default Ubuntu Server tidak disertai GUI pada saat instalasi, namun kita bisa
menambahkan GUI pada instalasi Ubuntu Server dengan cara sbb:

1) Instal aplikasi tasksel

$sudo apt-get install tasksel

2) Jalankan aplikasi

$sudo tasksel

3) Pilih paket Ubuntu Desktop dengan tombol [space] dan pilih Ok


4) Proses Instalasi
Static IP

Untuk melakukan konfigurasi IP statis pada ubuntu server 18.04 LTS dilakukan langkah sebagai
berikut:

1) Cek list default network:

$ls /etc/netplan

50-cloud-init.yaml

2) Masuk ke file network :

$sudo nano /etc/netplan/50-cloud-init.yaml

3) Konfigurasi file :

network:

ethernets:

enp3s0:

dhcp4: true

ens3:

dhcp4: true

version: 2

Diganti menjadi

network:

ethernets:

enp3s0:

dhcp4: true

ens3:
dhcp4: no

addresses: [10.10.64.10/24]

gateway4: 10.10.64.254

nameservers:

addresses: [10.10.180.1,10.2.41.99]

version: 2

4) Restart servis netplan:

$sudo netlpan apply

5) Jika terdapat masalah:

$sudo netplan --debug apply

Instalasi Mosquitto

Beberapa port yang dikenal pada Mosquitto server adalah sebagai berikut:

▪ 1883 : MQTT, unencrypted

▪ 8883 : MQTT, encrypted

▪ 8884 : MQTT, encrypted, client certificate required

▪ 8080 : MQTT over WebSockets, unencrypted

▪ 8081 : MQTT over WebSockets, encrypted

Langkah penginstalan adalah sbb:

$sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa

$sudo apt-get update

$sudo apt-get install mosquitto

$sudo apt-get install mosquitto-clients

Setelah melakukan instalasi diatas selanjutnya mosquitto akan start secara otomatis, untuk
start/stop servis dilakukan dengan perintah berikut:
1) Untuk memulai servis:

$sudo service stop mosquitto

2) Untuk mmemberhentikan servis:

$sudo service start mosquitto

Atau

$sudo /etc/init.d/mosquitto stop


PEMROGRAMAN MQTT Client

Instalasi

Setelah melakukan instalasi python, lakukan add path pada environtment variables untuk
directory instalasi python dan scripts (pip) dengan langkah sbb:

1) Buka environtment variables

2) Edit system variables Path dan tambahkan path ke directory instalasi python dan directory
scripts:

3) Install paket paho-mqtt

python -m install paho-mqtt

Membuat koneksi ke MQTT broker

Kelas paho-mqtt memiliki beberapa metode yangdapat digunakan, yaitu:

 connect() dan disconnect()


 subscribe() dan unsubscribe()

 publish()

Untuk memanggil kelas mqtt client dapat dilakukan dengan perintah berikut:

Import paho.mqtt.client as mqtt

Sedangkan untuk membuat koneksi ke MQTT broker dapat dilakukan seperti contoh script
berikut :

import paho.mqtt.client as mqtt

broker_address = "iot.eclipse.org"

broker_portno = 1883

client = mqtt.Client()

client.connect(broker_address, broker_portno)

Pada contoh script diatas alamat broker adalah “iot.eclipse.org” dengan port “1883”.
Selanjutnya membuat konstruktor MQTT yaitu client. Berikutnya adalah memanggil fungsi
conncet() untuk menghubungkan dengan broker. Jika koneksi sukses, maka akan tampil output
“0” di layar.

Konstruktor Client

Konstruktor client untuk membuat client MQTT, yang terdiri dari 4 (empat) parameter
opsional sebagai berikut:

client(client_id=””, clean_session=True, userdata=None,


protocol=MQTTv311, transport=”tcp”)

a) Client_id : sebuah string unik yang diberikan oleh client untuk koneksi ke broker

Setiap client harus memiliki ID client yang unik. Jika 2 client memiliki ID client yang sama
untuk koneksi ke broker, maka client yang terkoneksi pertama ke broker akan di-disconnect
dari broker. Jika ID client tidak dideklarasi, maka broker akan memberikan ID client.
b) clean_session : adalah nilai boolean yang di set True secara default. Jika di-set true, broker
akan menghapus semua informasi mengenai client selama pemutusan (disconnect) dan
penyambungan kembali (reconnection).

Jika di-set false, broker akan mempertahankan informasi pelanggan dan antrian pesan
dalam memori selama pemutusan dan penyambungan kembali (bukan ketika restart).

c) userdata : adalah data yang dapat dikirim sebagai parameter untuk dipanggil kembali.

d) protocol : dapat di-set MQTTv31 atau MQTTv311 tergantung versi yang akan digunakan

e) transport : default bernilai “tcp”. Jika menginginkan pesan yang dikirim melalui Websockets,
maka di-set menjadi “websockets”.

Contoh penggunaan konstruktor adalah sebagai berikut:

import paho.mqtt.client as mqtt

mqttc = mqtt.Client()

Reinitialise()

Fungsi ini mengeset ulang klien ke status awal seolah-olah baru saja dibuat. Fungsi ini
memiliki argument yang sama dengan konstruktor klien. Contoh penggunaannya adalah sebagai
berikut:

mqttc.reinitialise()

Sedangkan untuk memutus koneksi ke broker secara bersih, cukup gunakan fungsi perintah
berikut :

disconnect()

Penerbitan Pesan

Untuk menerbitkan pesan dapat digunakan fungsi publish(), yang memiliki 4 buah
parameter:
client.publish(topic, payload = None, qos = 0, retain = False)

a) topic : variabel string yang berisi nama topik. Nama topik ini bersifat case-sensitive.

b) payload : sebuah string yang berisi pesan yang akan diterbitkan pada topik. Banyak klien
berlangganan pada topik akan melihat pesan payload ini.

c) qos: Tingkat kualitas layanan (QoS) menentukan bagaimana setiap pesan MQTT dikirimkan
dan harus ditentukan untuk setiap pesan yang dikirim melalui MQTT. Penting untuk memilih
nilai QoS yang tepat untuk setiap pesan, karena nilai ini menentukan bagaimana klien dan
server berkomunikasi untuk menyampaikan pesan. Tiga QoS untuk pengiriman pesan dapat
dicapai menggunakan MQTT:

▪ QoS 0 (Paling banyak sekali) - di mana pesan dikirim sesuai dengan upaya terbaik dari
lingkungan operasi. Kehilangan pesan bisa terjadi.

▪ QoS 1 (Setidaknya satu kali) - di mana pesan dipastikan datang tetapi duplikat dapat
terjadi.

▪ QoS 2 (Tepat sekali) - di mana pesan dipastikan tiba tepat sekali.

d) Retain : adalah nilai boolean yang default ke False. Jika disetel ke True, maka itu
memberitahu broker untuk menyimpan pesan itu pada topik sebagai "pesan terakhir yang
bagus".

Referensi

[1]. https://embeddednesia.com/v1/mengenal-mqtt-protokol-komunikasi-untuk-iot/

[2]. https://www.ibm.com/developerworks/community/blogs/5things/entry/5_things_to_know_ab
out_mqtt_the_protocol_for_internet_of_things?lang=en_us

[3]. http://www.steves-internet-guide.com/mqtt-protocol-messages-overview/
[4]. https://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe/

[5]. https://www.virtualizationhowto.com/2018/09/installing-and-configuring-ubuntu-server-18-04-l
ts/

[6]. https://makandracards.com/operations/42688-how-to-remove-cloud-init-from-ubuntu

[7]. https://mntolia.com/mqtt-python-with-paho-mqtt-client/

[8]. https://pypi.org/project/paho-mqtt/

Anda mungkin juga menyukai