Penulis: Evan Purnama
Saat ini dunia teknologi sedang berkembang sangat pesat. Hampir semua orang di dunia modern sekarang ini sudah mengenal internet, baik melalui web browser di laptop atau komputernya, ataupun melalui ponsel pintar mereka.
Perkembangan dunia teknologi dan internet tidak hanya terbatas oleh jejaring web melalui browser saja, melainkan saat ini kita bisa menggunakan berbagai macam teknologi untuk membantu kehidupan sehari-hari. Paling tidak, semua dari kita (yang punya akses untuk membaca ini), pasti pernah atau malah sering melakukan komunikasi dengan orang lain menggunakan internet. Biasanya menggunakan layanan email atau chatting (saya yakin, terutama dalam 3 tahun terakhir ini, chatting jauh lebih sering).
...
Hal yang terlihat luar biasa sekarang ini adalah misalnya kita bayangkan apabila kita menunggu kereta, lalu kereta tersebut terlambat 15 menit, kemudian alarm ataupun jadwal kita di ponsel bisa dengan otomatis menyesuaikan waktu untuk mundur 15 menit. Atau misalnya AC rumah yang bisa menyala sendiri ketika kita sudah mau sampai ke rumah sehingga rumah sudah dingin ketika kita sampai.
Cerita tersebut seolah-olah cuma ada di teknologi masa depan, padahal hal-hal seperti disebutkan tadi sudah bisa dicapai dengan teknologi yang kita punya sekarang. Tentunya dengan menggabungkan berbagai teknologi seperti sensor, komunikasi tepat waktu (realtime), ataupun teknologi yang lain. Secara umum, istilah teknologi dengan memanfaatkan internet dan perangkat keras atau fisik biasa disebut Internet of Things (IoT).
Secara spesifik, tulisan ini akan mengenalkan tentang bagian spesifik dari ilustrasi teknologi-teknologi di atas khususnya di bagian komunikasi-nya. Dari berbagai teknologi komunikasi ataupun protocol yang ada, MQTT termasuk yang paling populer ketika kita membicarakan tentang saluran komunikasi yang ringan (light weight) dan cocok digunakan pada perangkat keras dengan spesifikasi ala kadarnya.
Asal Muasal MQTT
MQTT awalnya dikembangkan oleh IBM pada tahun 1999 untuk melakukan monitoring terhadap sebuah pipa minyak yang ada di suatu tempat yang jauh dan sulit dijangkau. Tujuan dari proyek ini adalah untuk mempunyai sebuah protocol, yang sangat bandwidth-efficient dan mengonsumsi tenaga batere se-sedikit mungkin, hal ini karena perangkat terkoneksi melalui jaringan satelit yang sangat mahal pada jaman itu.
Protocol ini menggunakan konsep publish/subscribe. Berbeda dengan HTTP yang menggunakan konsep request/response. Pubsub adalah event-driven dan memungkinkan dari server untuk mengirim pesan ke client kapanpun dibutuhkan. Pusat komunikasi ada di MQTT broker, broker ini bertanggung jawab atas terkirimnya semua pesan termasuk jalur distribusinya. Setiap client yang mengirim pesan ke broker, termasuk juga mengirimkan topic ke dalam pesan tersebut. Topic merupakan bagian dari routing information untuk broker-nya. Tiap klien yang menginginkan menerima pesan, bisa meng-subscribe ke suatu topic tertentu dan broker akan mengirimkan semua message yang cocok dengan pola (pattern) topic tersebut kepada client yang sesuai. Mekanisme tersebut membuat klien tidak perlu untuk tau satu sama lain untuk bisa berkomunikasi, melainkan mereka cukup berkomunikasi menggunakan topic. Arsitektur semacam ini membuat solusi percakapan bisa dikembangkan dengan skala besar (scalable) karena tidak memerlukan dependencies antara data producers dan data consumers.
Komponen Dalam MQTT
Mari kita bahas komponen-komponen utama yang ada dalam MQTT untuk memahami lebih lanjut.
Publisher dan Subscriber
Komponen paling jelas terlihat dalam sebuah pubsub system adalah subject yang melakukan publisher dan subscriber. Dalam MQTT, kita memerlukan mqtt client untuk bisa melakukan publish ataupun subscribe. Library client MQTT sudah banyak tersedia di berbagai bahasa pemrograman. Salah satu yang paling terkenal adalah Paho, yang dikembangkan oleh Eclipse, tersedia dalam berbagai macam platform ataupun bahasa pemrograman.
Misalnya di Ruby, kita bisa menginstall MQTT client dengan seperti ini:
gem install paho-mqtt
Kemudian untuk ilustrasi berbagai macam fitur utamanya adalah sebagai berikut:
require 'paho-mqtt'
### Create a simple client with default attributes
client = PahoMqtt::Client.new
### Register a callback on message event to display messages
message_counter = 0
client.on_message do |message|
puts "Message recieved on topic: #{message.topic}\n>>> #{message.payload}"
message_counter += 1
end
### Register a callback on suback to assert the subcription
waiting_suback = true
client.on_suback do
waiting_suback = false
puts "Subscribed"
end
### Register a callback for puback event when receiving a puback
waiting_puback = true
client.on_puback do
waiting_puback = false
puts "Message Acknowledged"
end
### Connect to the eclipse test server on port 1883 (Unencrypted mode)
client.connect('iot.eclipse.org', 1883)
### Subscribe to a topic
client.subscribe(['paho/ruby/test', 2])
### Waiting for the suback answer and execute the previously set on_suback callback
while waiting_suback do
sleep 0.001
end
### Publlish a message on the topic "paho/ruby/test" with "retain == false" and "qos == 1"
client.publish("paho/ruby/test", "Hello there!", false, 1)
while waiting_puback do
sleep 0.001
end
### Waiting to assert that the message is displayed by on_message callback
sleep 1
### Calling an explicit disconnect
client.disconnect
Dalam ilustrasi contoh source code di atas adalah menekankan tentang cara melakukan publish
dan juga subscribe
, beserta cara mendapatkan callback ketika berhasil melakukan publish
dan juga subscribe
.
Message
Dalam contoh yang sama di atas, message dikirim melalui publisher dengan nilai Hello there!
. Message ini kemudian akan diterima oleh client yang melakukan subscribe, dan suatu callback on_message
akan dipanggil. Sehingga kita bisa melakukan penanganan terhadap nilai dari pesan tersebut.
client.on_message do |message|
puts "Message recieved on topic: #{message.topic}\n>>> #{message.payload}"
message_counter += 1
end
Dalam contoh ini, penanganan yang kita lakukan adalah menuliskan isi dari pesan tersebut.
Apabila diamati lebih dalam, nilai dari message yang dikirim mengandung nilai dari topic. Seperti yang sudah dijelaskan di atas, MQTT client akan mengirim message dan topic kepada broker sehingga broker MQTT akan melakukan penanganan terhadap routing pesan tersebut sesuai dengan topic yang dimiliki.
Topic
Dalam contoh di atas, topic mempunyai nilai paho/ruby/test
. Di MQTT, topic merupakan string akan tetapi ada beberapa character yang mempunyai arti khusus. Seperti misalnya character /
mempunyai arti seperti halnya directory. Kemudian ada lagi character +
yang merupakan character wildcard dalam 1 level directory dan juga #
yang merupakan character wildcard dalam multiple level directory.
Contohnya,
Apabila kita meng-subscribe suatu topic paho/ruby/+
, artinya kita akan bisa menerima berbagai macam message dari topic paho/ruby/test
, paho/ruby/abc
, paho/ruby/def
, dan lain sebagainya.
Apabila kita meng-subscribe suatu topic paho/+/test
, artinya kita akan bisa menerima berbagai macam message dari topic paho/ruby/test
, paho/python/test
, paho/javascript/test
, dan lain sebagainya.
Apabila kita meng-subscribe suatu topic paho/#
, artinya kita akan bisa menerima berbagai macam message dari topic paho/ruby/test
, paho/python/abc
, paho/javascript/def
, dan lain sebagainya.
Sebagai info tambahan, topic di MQTT ini sangat murah apabila dibandingkan dengan topic di Pub/Sub sistem yang lain. Bahkan publisher tidak perlu untuk membuat topic terlebih dahulu untuk bisa mengirimkan pesan ke topic tersebut.
QoS
QoS mempunyai singkatan Quality of Service (kualitas pelayanan). Dalam MQTT, ada 3 macam QoS, yaitu 0
, 1
, atau 2
.
Dalam QoS 0
: Sama dengan halnya kita melakukan fire-and-forget. Artinya tidak ada jaminan kalau pengiriman pesan tersebut akan sampai ke subscriber.
Dalam QoS 1
: Pesan akan dijamin untuk sampai di minimal 1x ke subscriber yang sedang meng-subscribe.
Dalam QoS 2
: Pesan akan dijamin untuk sampai tepat 1x ke subscriber yang sedang meng-subscribe.
Broker
Bisa dikatakan broker merupakan bagian paling fundamental dalam MQTT, karena tanpa adanya broker, semua hal di atas tidak akan bisa dilakukan.
MQTT broker sudah diimplementasi oleh banyak orang sesuai dengan kebutuhan masing-masing. Ada banyak open-sourced implementasi yang bisa kita nikmati untuk bisa menjalankan MQTT broker di server kita. Ada pula enterprise version atau managed service MQTT apabila kita tidak mau repot untuk mengurus MQTT tersebut.
Tautan dari Wikipedia berikut mempunyai beberapa daftar implementasi MQTT. Beberapa broker implementasi yang populer di antaranya: Mosquitto (C based), EMQ (Erlang based), Mosca (Javascript based), VerneMQ (Erlang based), HiveMQ (Java based), dll.
Apabila hanya untuk mencoba mencicipi MQTT, kita bisa saja menggunakan free online MQTT yang bisa langsung digunakan. Seperti misal contoh di source code di atas, kita menggunakan iot.eclipse.org
. Ada beberapa online broker yang lain:
Port yang biasa digunakan broker MQTT adalah 1883, dan 1885 (untuk TLS). Kemudian beberapa broker MQTT juga sudah mendukung integrasi langsung ke protocol Websocket, sehingga bisa lebih mudah kompatibel dengan aplikasi web. Biasanya yang digunakan adalah port websocket tersebut misalnya 8080, atau 8000, atau bahkan bisa 1884 dan 1886 (untuk TLS) agar mirip dengan protocol yang umum di MQTT, tergantung selera.
...
Demikian tulisan tentang Berkenalan dengan MQTT, hal-hal yang lebih mendalam seperti komponen-komponen lebih detail ataupun trick and tips dalam memilih broker ataupun melakukan scaling akan dibahas lebih lanjut dalam tulisan selanjutnya.
Discussion