MQTT প্রোটোকল কেন এবং কিভাবে কাজ করে?
MQTT (Message Queuing Telemetry Transport) বর্তমানে IoT বা ইন্টারনেট অফ থিংসের জন্য সবচেয়ে জনপ্রিয় এবং দক্ষ একটি প্রোটোকল।
ইন্টারনেট অফ থিংস বা IoT নিয়ে কাজ করতে গেলে একটা প্রশ্ন প্রায়ই মাথায় আসে— “আমার সেন্সর ডেটা ইন্টারনেটে পাঠাবো, কিন্তু কোন নিয়মে?”
আমরা সাধারণত ওয়েব ব্রাউজিংয়ের জন্য HTTP ব্যবহার করি। তাহলে সেন্সরের ডেটা পাঠানোর জন্যও কি HTTP ব্যবহার করা যায় না? যায়, তবে ব্যাপারটা অনেকটা একটা ছোট পিঁপড়াকে দিয়ে বিশাল ভারী পাথর বহন করানোর মতো!
মাইক্রোকন্ট্রোলারগুলোর (যেমন ESP32) মেমোরি কম থাকে এবং অনেক সময় এগুলো ব্যাটারিতে চলে। HTTP প্রোটোকল অনেক ভারী, এর হেডারে প্রচুর অপ্রয়োজনীয় ডেটা থাকে। এখানেই ত্রাতা হিসেবে হাজির হয় MQTT (Message Queuing Telemetry Transport)।
চলো, আজ একদম সহজ ভাষায় জেনে নিই এই MQTT আসলে কী এবং এটি কীভাবে জাদুর মতো কাজ করে।
১। MQTT কী? সহজ ভাষায় পরিচয়
MQTT হলো খুব হালকা (Lightweight) একটি মেসেজিং প্রোটোকল। এটি এমনভাবে ডিজাইন করা হয়েছে যেন খুব কম ইন্টারনেট স্পিড বা ব্যান্ডউইথেও সেন্সর বা ডিভাইসগুলো নিজেদের মধ্যে একদম রিয়েল-টাইমে ডেটা আদান-প্রদান করতে পারে।
সহজ কথায়, এটি হলো স্মার্ট ডিভাইসদের নিজেদের মধ্যে কথা বলার সবচেয়ে ইফিশিয়েন্ট ভাষা।
২। কীভাবে কাজ করে? (Publish-Subscribe মডেল)
MQTT সাধারণ ওয়েব সার্ভারের মতো কাজ করে না। এটি কাজ করে পাবলিশ-সাবস্ক্রাইব (Publish-Subscribe) মডেলে।
বাস্তব জীবনের উদাহরণ:
ধরো, ইউটিউবের কথা। তুমি একটা চ্যানেলে সাবস্ক্রাইব করে রাখলে। এখন ওই চ্যানেলের মালিক যখনই কোনো নতুন ভিডিও আপলোড (Publish) করবে, ইউটিউব সাথে সাথে তোমার কাছে নোটিফিকেশন পাঠিয়ে দেবে।
এখানে তিনটি জিনিস কাজ করছে:
- Publisher (ভিডিও ক্রিয়েটর): যে ডেটা তৈরি করছে বা সেন্সর থেকে রিড করছে।
- Subscriber (তুমি): যে ডেটা গ্রহণ করতে চায়।
- Broker (ইউটিউব): মাঝখানের মধ্যস্থতাকারী, যে পাবলিশারের কাছ থেকে ডেটা নিয়ে সাবস্ক্রাইবারদের কাছে পৌঁছে দেয়।
MQTT-তেও ঠিক একই ঘটনা ঘটে। তোমার টেম্পারেচার সেন্সর হলো পাবলিশার, তোমার মোবাইল অ্যাপ হলো সাবস্ক্রাইবার, আর মাঝখানে ইন্টারনেটে বসে থাকা সার্ভারটি হলো ব্রোকার। সেন্সর আর মোবাইলের মধ্যে সরাসরি কোনো কানেকশন থাকে না, সবকিছু ব্রোকারের মাধ্যমেই হয়।
৩। কিছু কারিগরি শব্দ যা জানা জরুরি
MQTT নিয়ে কাজ করতে গেলে এই শব্দগুলো বারবার শুনবে:
- ব্রোকার (Broker): এটি ট্রাফিক পুলিশের মতো কাজ করে। Mosquitto বা HiveMQ হলো খুব জনপ্রিয় কিছু ব্রোকার। এটি কে কোন ডেটা চাচ্ছে তার হিসাব রাখে।
- টপিক (Topic): ব্রোকার কীভাবে বুঝবে কোন ডেটা কাকে দিতে হবে? এজন্য টপিক ব্যবহার করা হয়। টপিক দেখতে অনেকটা ফোল্ডার লিঙ্কের মতো। যেমন: lab/room1/temperature। সেন্সর এই টপিকে ডেটা পাবলিশ করবে, আর যে অ্যাপ এই টপিকে সাবস্ক্রাইব করবে, সে-ই ডেটা পাবে।
QoS (Quality of Service): মেসেজ পৌঁছানোর গ্যারান্টি।
- QoS 0: মেসেজ একবার পাঠাবে, পৌঁছালো কি না তার কোনো গ্যারান্টি নেই (Fire and forget)।
- QoS 1: মেসেজ পৌঁছানোর কনফার্মেশন না পাওয়া পর্যন্ত পাঠাতেই থাকবে।
- QoS 2: মেসেজ ঠিক একবারই পৌঁছাবে, ডুপ্লিকেট হবে না (সবচেয়ে নিরাপদ, তবে একটু ধীর)।
LWT (Last Will and Testament): ধরো তোমার সেন্সরটির পাওয়ার হঠাৎ চলে গেলো। ব্রোকার তখন সাবস্ক্রাইবারদের একটি “উইল” বা শেষ মেসেজ পাঠিয়ে জানিয়ে দেয়, “ডিভাইসটি অফলাইন হয়ে গেছে।“
৪। বাস্তবমুখী ব্যবহার: প্রোজেক্টে কীভাবে কাজে লাগাবে?
ধরো, তুমি একটি স্মার্ট ল্যাব রুম ডিজাইন করছো। ল্যাবের বিভিন্ন জায়গায় সেন্সর লাগানো আছে। তুমি যখন প্রফেশনাল লেভেলে ESP32 এবং ESP-IDF ব্যবহার করে FreeRTOS এর সাহায্যে মাল্টিটাস্কিং কোড লিখবে, তখন MQTT তোমার জীবনকে অনেক সহজ করে দেবে।
তুমি ল্যাবের টেম্পারেচার সেন্সরকে নির্দেশ দিলে, “প্রতি ৫ সেকেন্ড পর পর lab/environment/temp টপিকে ডেটা পাবলিশ করো।” এরপর তুমি তোমার ল্যাপটপে এবং মোবাইলে একটি ড্যাশবোর্ড বানিয়ে ওই টপিকে সাবস্ক্রাইব করে রাখলে। ব্যস! সেন্সর ডেটা ব্রোকারে পাঠাবে, আর ব্রোকার মুহূর্তের মধ্যে তোমার ল্যাপটপ ও মোবাইলে সেটা লাইভ আপডেট করে দেবে।
৫। কেন আমরা MQTT ব্যবহার করবো? (সুবিধা)
- খুবই হালকা: HTTP এর তুলনায় এতে ডেটা খরচ হয় নামমাত্র।
- রিয়েল-টাইম: ডেটা আদান-প্রদান হয় মিলি-সেকেন্ডের মধ্যে।
- ব্যাটারি সাশ্রয়ী: যেহেতু মেসেজ খুব ছোট, তাই মাইক্রোকন্ট্রোলারের প্রসেসিং পাওয়ার ও ব্যাটারি দুটোই বাঁচে।
- নির্ভরযোগ্য: ইন্টারনেট কানেকশন দুর্বল থাকলেও ব্রোকার ডেটা ম্যানেজ করতে পারে।
৬। প্র্যাকটিক্যাল কোড: ESP32-এ কীভাবে MQTT সেটআপ করবে?
তত্ত্ব তো অনেক হলো, চলো এবার একটু প্র্যাকটিক্যাল কাজ দেখা যাক! নিচে আর্ডুইনো ফ্রেমওয়ার্ক ব্যবহার করে ESP32-এর জন্য একটি বেসিক MQTT ক্লায়েন্টের কোড দেওয়া হলো। এখানে আমরা জনপ্রিয় PubSubClient লাইব্রেরি এবং ফ্রি পাবলিক ব্রোকার (HiveMQ) ব্যবহার করেছি।
সবচেয়ে মজার ব্যাপার হলো— এখানে আমরা কোনো delay() ব্যবহার করিনি। আগের ব্লগের শিক্ষা কাজে লাগিয়ে millis() দিয়ে একটি নন-ব্লকিং ডেটা পাবলিশিং সিস্টেম তৈরি করেছি!
#include <WiFi.h>
#include <PubSubClient.h>
// তোমার ওয়াইফাই এর নাম ও পাসওয়ার্ড
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// HiveMQ এর একটি ফ্রি পাবলিক ব্রোকার
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long previousMillis = 0;
const long interval = 5000; // প্রতি ৫ সেকেন্ড পর পর ডেটা পাঠাবো
void setup() {
Serial.begin(115200);
// ওয়াইফাই কানেক্ট করা
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500); // শুধু সেটআপের সময় একটু ডিলে মেনে নেওয়া যায়!
Serial.print(".");
}
Serial.println("
WiFi Connected!");
// MQTT ব্রোকার সেটআপ
client.setServer(mqtt_server, 1883);
client.setCallback(callback); // ব্রোকার থেকে মেসেজ আসলে এই ফাংশন কাজ করবে
}
// ব্রোকার থেকে কোনো মেসেজ (সাবস্ক্রাইব করা টপিক থেকে) রিসিভ করলে এখানে আসবে
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.println(topic);
}
// ব্রোকারের সাথে কানেকশন বিচ্ছিন্ন হলে আবার কানেক্ট করার ফাংশন
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
// কানেক্ট করার চেষ্টা (একটি র্যান্ডম ক্লায়েন্ট আইডি দিয়ে)
if (client.connect("ESP32_Lab_Client_123")) {
Serial.println("connected");
// কানেক্ট হওয়ার পর সাবস্ক্রাইব করা
client.subscribe("lab/control/light");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
delay(2000);
}
}
}
void loop() {
// যদি কানেকশন না থাকে, তবে রিকানেক্ট করো
if (!client.connected()) {
reconnect();
}
// এটি কল করে রাখতেই হয়, যাতে ব্রোকারের সাথে যোগাযোগ সচল থাকে এবং নতুন মেসেজ রিসিভ হয়
client.loop();
// নন-ব্লকিং পাবলিশ: millis() ব্যবহার করে প্রতি ৫ সেকেন্ড পর পর ডেটা পাঠানো
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// "lab/environment/temp" টপিকে একটি ডামি টেম্পারেচার ডেটা পাবলিশ করা
String tempStr = "25.5";
client.publish("lab/environment/temp", tempStr.c_str());
Serial.println("Temperature Data Published: " + tempStr);
}
} কোডটি কীভাবে কাজ করছে?
- সেটআপ: প্রথমে ESP32 ওয়াইফাইয়ের সাথে কানেক্ট হচ্ছে এবং এরপর HiveMQ এর ব্রোকারের (পোর্ট ১৮৮৩) সাথে যুক্ত হচ্ছে।
- পাবলিশ (Publish): loop() এর ভেতর millis() ব্যবহার করে ঠিক ৫ সেকেন্ড পর পর lab/environment/temp টপিকে “25.5” ডেটাটি পাঠানো হচ্ছে।
- সাবস্ক্রাইব (Subscribe): reconnect() ফাংশনের ভেতর দেখো, আমরা lab/control/light নামক একটি টপিকে সাবস্ক্রাইব করে রেখেছি। অর্থাৎ, এই টপিকে কেউ কোনো মেসেজ দিলে আমাদের ESP32 সেটা রিসিভ করবে এবং callback ফাংশনে সেটা প্রিন্ট করবে।
- client.loop(): এটি খুব গুরুত্বপূর্ণ! এটি ব্রোকারের সাথে ESP32-এর কানেকশন লাইভ রাখে এবং কোনো নতুন মেসেজ আসলে তা রিসিভ করতে সাহায্য করে।
এই ছোট্ট কোডটি রান করেই তুমি MQTT এর ম্যাজিক নিজের চোখে দেখতে পারবে। এরপর আস্তে আস্তে তুমি চাইলে একে ESP-IDF এবং FreeRTOS এর টাস্কে রূপান্তর করে একদম প্রফেশনাল লেভেলে নিয়ে যেতে পারো!