# MQTT Note ## Name : Christofel Rio Goenawan ## University : Bandung Institute of Technology (ITB) ## Date : 26/6/2020 ## Objectives: 1. Understand concept and work of MQTT Protocol. (What? How? Why ? ) 2. Understand Andvantage and Disadvantage of MQTT and Another Famous MQ Protocol. 3. Know some famous MQTT Platform and Andvantage and Disadvantage. 4. Simulating MQTT in Localhost. 5. Simulating MQTT in CloudMQTT. 6. Simulating MQTT Client using Python. ## 1. What is MQTT Protocol? Protokol ***Message Queuing Telemetry Transport*** ( biasa disebut MQTT ) adalah sebuah protokol pengiriman message ringan yang menyediakan cara sederhana untuk mengirimkan informasi telemetri **kepada klien yang memiliki koneksi dan resource yang tidak terlalu baik** . Protokol ini menggunakan **sistem komunikasi publish / subscribe**, dan biasa digunakan untuk komunikasi mesin ke mesin (M2M). Protokol MQTT disebut protokol ringan karena semua message nya memiliki ukuran kode kecil. Setiap message terdiri dari **fixed header** 2 byte , **variabel header** , isi message yang dibatasi hingga 256 MB informasi dan beberapa tingkat kualitas layanan (QoS). Saat ini protokol MQTT menjadi protokol utama untuk implementasi **Internet of Things ( IoT )** karena membutuhkan memori dan bandwith yang jauh lebih kecil dari protokol lainnya , seperti HTTP ,dsb. ## 2. How MQTT Protocol works? Protokol MQTT berhubungan dengan dua subjek yaitu **klien dan broker**. Broker adalah server sementara klien adalah perangkat yang terhubung. **Publish** adalah ketika sebuah perangkat atau klien ingin mengirim data ke server atau broker . Adapun **Subscribe** adalah ketika sebuah perangkat atau klien ingin mendapat data dari broker . Jika koneksi dari klien yang berlangganan ke broker terputus, maka broker akan menyimpan message sementara dan mengirim message ke klien ketika klien online. Jika koneksi dari klien penerbitan ke broker terputus tanpa pemberitahuan, maka broker dapat menutup koneksi dan mengirimkan pesan cache kepada pelanggan dengan instruksi dari publisher. ![](https://i.imgur.com/0Rk69jW.png) Protokol MQTT dibagi menjadi empat tahap yaitu **koneksi, otentikasi, komunikasi dan terminasi**. Klien memulai dengan membuat koneksi Transmission Control Protocol / Internet Protocol (TCP / IP) ke broker dengan menggunakan port standar atau port khusus yang ditentukan oleh operator broker. Port standar adalah **1883** untuk komunikasi yang tidak dienkripsi dan **8883** untuk komunikasi terenkripsi menggunakan Secure Sockets Layer (SSL) / Transport Layer Security (TLS). Selama "jabat tangan" SSL / TLS, klien memvalidasi sertifikat server dan mengotentikasi server. Beberapa message MQTT dapat dilihat sebagai berikut. ![](https://i.imgur.com/geuiPGD.jpg) ## 3. Why using MQTT Protocol? Seperti telah dijelaskan sebelumnya membutuhkan **memori dan bandwith yang jauh lebih kecil dari protokol lainnya** , seperti HTTP ,dsb sehingga sangat cocok untuk implementasi pada device dengan resource bandwith dan memori yang rendah , misalnya pada implementasi IoT . ## 4. Mosquitto ( MQTT ) VS RabbitMQ **Mosquitto** adalah open source MQTT broker yang paling sering digunakan saat ini. Mosquitto sangat ringan dan cocok untuk digunakan pada semua perangkat dari low power board hingga sebuah server besar. **RabbitMQ** adalah broker protokol MQ yang juga banyak digunakan. Awalnya dari Advanced Message Queuing Protocol (AMQP). Kemudian platform dimodifikasi untuk mendukung Transport Antrian Telemetri Pesan (MQTT), Streaming Text Oriented Messaging Protocol (STOMP), dan beberapa protokol umum lainnya. Beberapa perbandingan utama Mosquitto dan RabbitMQ adalah sebagai berikut. 1. MQTT dirancang untuk digunakan untuk perangkat yang lebih kecil yang mengirim pesan melalui jaringan dengan bandwidth rendah. Ini terkenal karena kesederhanaannya (Hanya 5 Apis) dan jejak kawat yang minimal. Di sisi lain, RabbitMQ telah dirancang untuk digunakan untuk berbagai skenario pengiriman pesan yang telah dikembangkan selama 25 tahun terakhir. Ini terkenal untuk Keandalan dan Interoperabilitas. Ini telah diimplementasikan dalam banyak bahasa; oleh karena itu, ini adalah salah satu pilihan terbaik untuk membangun infrastruktur perpesanan yang andal, berskala besar, berkelompok, dan tangguh. 2. MQTT hanya mendukung teknik perpesanan pub-sub. Ini berguna dalam kasus di mana pesan berumur pendek dan ada perutean aktif dari pelanggan dan penerbit yang terhubung. Dengan demikian, merepotkan untuk menggunakan MQTT untuk antrian pengiriman pesan lama yang klasik. Di sisi lain, RabbitMQ mendukung hampir semua bentuk pesan seperti pub-sub, round-robin, antrian pesan, dll. Ini juga mendukung pengelompokan pesan dan pesan idempoten. Ini mendukung banyak kontrol fine-grain dalam hal mengakses antrian. Seseorang dapat membatasi akses ke antrian tertentu, mengelola kedalaman dan banyak lagi. 3. MQTT tidak mendukung beberapa transaksi dan sertifikasi dasar . RabbitMQ tidak hanya mendukung berbagai ucapan terima kasih untuk berbagai kasus penggunaan tetapi juga mendukung transaksi di antrian pengiriman pesan. Ini juga memungkinkan pemisahan berbagai semantik transaksional jika diperlukan. 4. MQTT tidak dilengkapi dengan protokol keamanan apa pun di luar package. Jadi, kita perlu mengintegrasikan protokol keamanan tambahan. RabbitMQ memiliki beberapa keunggulan signifikan dibandingkan MQTT dalam hal keamanan koneksi. Itu keluar dari kotak dengan dukungan untuk SASL, TLS dan set RET IETF. Ini juga telah memperbarui dirinya untuk mendukung mekanisme SASL modern, seperti GS2 dan SCRAM-SHA. 5. Dalam implementasi kita membutuhkan fitur-fitur canggih dari AMQP serta kemampuan untuk bekerja dengan low power device pada jaringan bandwidth yang lebih kecil. RabbitMQ sangat cocok untuk kasus-kasus seperti itu karena mampu menggunakan AMQP dan MQTT bersama-sama. ## 5. Installing Mosquitto Mosquitto platform dapat diinstall pada PC melalui web di bawah ini. https://mosquitto.org/ Instalasi Mosquitto sangat mudah yaitu menjalankan executable file yang didownload dari web di atas. Kemudian aplikasi dapat dijalankan melalui mosquitto.exe pada file aplikasi. Kemudian mosquitto dapat dicek pada **menu services** untuk pengguna OS Windows. ![](https://i.imgur.com/1P7exEJ.png) Kemudian untuk menjalankan server , untuk pengguna OS Windows klik pada "Mosquitto" di menu service dan nyalakan server. Jika terdapat pesan error "application start and stop...." pada aktivasi pertama , silahkan reboot PC. Untuk dapat mengakses mosquitto di terminal dari mana saja , silahkan masukkan path folder Mosquitto ke **path variabel**. ## 6. Simulating MQTT in Localhost. Pertama , diuji sistem MQTT dalam sebuah PC ( **localhost** ) menggunakan software Mosquitto. Setelah memastikan Mosquitto Broker berjalan pada komputer , jalankan 2 buah terminal ( **cmd** untuk pengguna OS Windows ) untuk subscriber dan publisher. Untuk cmd yang menjadi subscriber , dituliskan kode sebagai berikut. ``` mosquitto_sub -h "localhost" -t "topic/#" ``` Dengan "-h" adalah alamat broker ( pada simulasi ini localhost ) dan "-t" adalah topik yang ingin diterima. Kemudian dapat dilihat bahwa cmd dalam kondisi menunggu , yaitu menunggu untuk menerima pesan dari broker. Kemudian untuk cmd yang menjadi publisher , dituliskan kode sebagai berikut. ``` mosquitto_pub -h "localhost" -m "< Pesan yang ingin dibagikan>" -t "topic/#" ``` Dengan "-m" adalah pesan yang ingin dibagikan. Kemudian Penulis melakukan simulasi dan dapat dilihat bahwa pesan dari cmd publisher diterima oleh cmd subscriber sebagai berikut. ![](https://i.imgur.com/NhfuGaO.png) Adapun jikan topik pada cmd publisher dan subscriber berbeda , maka pesan dari publisher tidak akan diterima sebagai berikut. ![](https://i.imgur.com/U2BkLfQ.png) ## 7. Simulating MQTT in CloudMQTT. Cloud MQTT adalah sebuah layanan cloud service untuk broker dan klien protokol MQTT. Pada awalnya terdapat layanan gratis , tetapi saat ini layanan gratis tidak dapat digunakan. Untuk simulasi pada CloudMQTT pertama dibuat instance baru untuk menjadi klien sebagai berikut. ![](https://i.imgur.com/7qg8xuk.png) Pada layar dapat diketahui alamat server , user, port dan password. Pertama dilakukan simulasi PC sebagai subscriber dan CloudMQTT sebagai publisher. Seperti sebelumnya dibuat kode sebagai berikut pada cmd. ``` mosquitto_sub -h "<server>" -p "<port>" -u "<user>" -P "<password>" -t "topic/#" ``` Sebagai berikut. ![](https://i.imgur.com/Zw2bC53.png) Kemudian dengan mengirimkan pesan dari CloudMQTT , dapat dilihat bahwa pesan diterima pada PC sebagai berikut. ![](https://i.imgur.com/BicvDxX.png) Kemudian dilakukan simulasi PC sebagai publisher dan CloudMQTT sebagai subscriber. Seperti sebelumnya dibuat kode sebagai berikut pada cmd. ``` mosquitto_pub -h "<server>" -m "< Pesan yang ingin dibagikan>" -p "<port>" -u "<user>" -P "<password>" -t "topic/#" ``` Kemudian dengan mengirimkan pesan dari PC , dapat dilihat bahwa pesan diterima pada CloudMQTT sebagai berikut. ![](https://i.imgur.com/yn4Ok3h.png) ## 8. Simulating MQTT Client using Python. Kemudian akan dilakukan simulasi klien MQTT menggunakan program. Terdapat banyak bahasa pemrograman yang mendukung penggunaan protokol MQTT , seperti C , C++ , Python , MATLAB , dsb. Bahasa pemrograman untuk klien MQTT yang populer adalah Python dan C , karena merupakan bahasa pemrograman utama untuk mikroprosesor RaspberryPi dan Arduino. Pada simulasi ini Penulis menggunakan bahasa pemrograman Python karena Penulis cukup familir dengan bahasa ini. Untuk membuat klien MQTT di Python , diperlukan package **Paho-mqtt**. Package ini dapat diinstall menggunakan command **pip**. Pada pegguna OS Windows install dapat dilakukan dengan kode pada cmd sebagai berikut. ``` python -m pip install paho-mqtt ``` Kemudian Penulis menggunakan kode klien publisher di bawah ini untuk menyimulasikan protokol MQTT dengan broker internal ( localhost ). ```python import paho.mqtt.client as mqtt #import the client1 broker_address="localhost" #broker_address="iot.eclipse.org" #use external broker client = mqtt.Client("P1") #create new instance client.connect(broker_address) #connect to broker client.publish("house/main-light","OFF")#publish ``` Kemudian Penulis membuka cmd lain sebagai subscriber , dan meng- subscribe server localhost dengan topik "house/main-light" seperti di kode sebagai berikut. ![](https://i.imgur.com/tTv4ulj.png) Kemudian Penulis menjalankan file python menggunakan cmd lainnya. Dapat dilihat bahwa pesan muncul ke cmd subscriber. ![](https://i.imgur.com/ZM6FpLa.png) Kemudian untuk simulasi kode subscriber dan publisher , Penulis menggunakan kode sebagai berikut. ```python import paho.mqtt.client as mqtt #import the client1 broker_address="localhost" #broker_address="iot.eclipse.org" print("creating new instance") client = mqtt.Client("P1") #create new instance print("connecting to broker") client.connect(broker_address) #connect to broker print("Subscribing to topic","house/bulbs/bulb1") client.subscribe("house/bulbs/bulb1") print("Publishing message to topic","house/bulbs/bulb1") client.publish("house/bulbs/bulb1","OFF") ``` Kemudian Penulis menjalankan kode pada cmd pertama , dan dapat dilihat bahwa message kembali masuk pada cmd kedua. ![](https://i.imgur.com/xVMP8AM.png) Tetapi dapat dilihat bahwa pada saat cmd kedua publish pesan , maka Pesan tidak masuk ke cmd pertama. Hal ini karena pada saat menjalankan program , program langsung ditutup setelah mengirimkan message ke cmd kedua. Agar kode klien dapat tetap menangkap pesan dari device lain , maka haruslah dibuat fungsi untuk mengurus **callback** dan **loop** dari kode program. Penjelasan tentang keduanyan dapat dilihat pada link sebagai berikut. http://www.steves-internet-guide.com/mqtt-python-callbacks/ Kemudian Penulis membuat fungsi "o_message" untuk mengurus message yang masuk ke program. ```python import paho.mqtt.client as mqtt #import the client1 import time ############ def on_message(client, userdata, message): print("message received " ,str(message.payload.decode("utf-8"))) print("message topic=",message.topic) print("message qos=",message.qos) print("message retain flag=",message.retain) ######################################## broker_address="localhost" #broker_address="iot.eclipse.org" print("creating new instance") client = mqtt.Client("P1") #create new instance client.on_message=on_message #attach function to callback print("connecting to broker") client.connect(broker_address) #connect to broker client.loop_start() #start the loop print("Subscribing to topic","house/bulbs/bulb1") client.subscribe("house/bulbs/bulb1") print("Publishing message to topic","house/bulbs/bulb1") client.publish("house/bulbs/bulb1","OFF") time.sleep(10) # wait for message in second client.loop_stop() #stop the loop ``` Kemudian Penulis menjalankan kode pada cmd pertama , dan dapat dilihat bahwa message kembali masuk pada cmd kedua. Begitu juga ketika Penulis mem- publish pesan dari cmd kedua , pesan masuk ke cmd pertama. ![](https://i.imgur.com/jXQXVch.png) ## Sources: 1. https://internetofthingsagenda.techtarget.com/definition/MQTT-MQ-Telemetry-Transport 2. https://www.youtube.com/watch?v=8y1lLEgNuUY&t=511s 3. https://www.stackshare.io/stackups/mosquitto-vs-rabbitmq 4. https://github.com/CloudMQTT/python-mqtt-example