পাইথন ব্যবহার করে আইওটি-র জন্য এমকিউটিটি প্রোটোকল আয়ত্ত করুন। এই নির্দেশিকায় নীতি, Paho-MQTT লাইব্রেরি, নিরাপত্তা এবং বাস্তব-বিশ্বের প্রকল্প বাস্তবায়ন কভার করা হয়েছে।
পাইথন ফর আইওটি: এমকিউটিটি বাস্তবায়নের একটি ব্যাপক নির্দেশিকা
সংযুক্ত বিশ্ব: কেন আইওটি প্রোটোকল গুরুত্বপূর্ণ
আমরা অভূতপূর্ব সংযোগের এক যুগে বাস করছি। ইন্টারনেট অফ থিংস (আইওটি) আর কোনো ভবিষ্যৎ ধারণা নয়; এটি একটি বৈশ্বিক বাস্তবতা, যা নীরবে কোটি কোটি স্মার্ট ডিভাইসের একটি নেটওয়ার্ক তৈরি করছে যা আমাদের পরিবেশ পর্যবেক্ষণ করে, আমাদের বাড়িগুলিকে স্বয়ংক্রিয় করে, আমাদের শিল্পগুলিকে অপ্টিমাইজ করে এবং আমাদের শহরগুলিকে সুগম করে। সিউলের একটি বাড়ির স্মার্ট থার্মোস্ট্যাট থেকে শুরু করে কেনিয়ার প্রত্যন্ত অঞ্চলের একটি ক্ষেত্রের কৃষি সেন্সর পর্যন্ত, এই ডিভাইসগুলি বিপুল পরিমাণ ডেটা তৈরি করছে। কিন্তু তারা সবাই একে অপরের সাথে এবং ক্লাউডের সাথে কীভাবে যোগাযোগ করে, বিশেষ করে যখন তারা প্রায়শই ছোট, কম-ক্ষমতাসম্পন্ন এবং অনির্ভরযোগ্য নেটওয়ার্কে কাজ করে? এর উত্তর বিশেষ যোগাযোগ প্রোটোকলের মধ্যে নিহিত।
যদিও HTTP প্রোটোকল আমাদের দৈনন্দিন ওয়েবের বেশিরভাগ অংশকে শক্তিশালী করে, এটি প্রায়শই আইওটি-র সীমাবদ্ধ বিশ্বের জন্য খুব বেশি ভারী এবং শক্তি-ক্ষয়কারী। এখানেই মেশিন-টু-মেশিন (M2M) যোগাযোগের জন্য বিশেষভাবে ডিজাইন করা প্রোটোকলগুলি উজ্জ্বল হয়। তাদের মধ্যে, একটি প্রভাবশালী শক্তি হিসাবে আবির্ভূত হয়েছে: এমকিউটিটি।
এই ব্যাপক নির্দেশিকাটি বিশ্বজুড়ে ডেভেলপার, প্রকৌশলী এবং শৌখিন ব্যক্তিদের জন্য ডিজাইন করা হয়েছে যারা পাইথন ব্যবহার করে এমকিউটিটি-র শক্তিকে কাজে লাগাতে চান, যা আইওটি ক্ষেত্রে সবচেয়ে বহুমুখী এবং জনপ্রিয় প্রোগ্রামিং ভাষাগুলির মধ্যে একটি। আমরা এমকিউটিটি-র মৌলিক ধারণা থেকে শুরু করে সুরক্ষিত, শক্তিশালী এবং পরিমাপযোগ্য আইওটি অ্যাপ্লিকেশন তৈরির যাত্রা করব।
এমকিউটিটি কী? সীমাবদ্ধতার জন্য নির্মিত একটি প্রোটোকল
এমকিউটিটি-র পুরো নাম মেসেজ কিউইং টেলিমেট্রি ট্রান্সপোর্ট। এটি ১৯৯৯ সালে IBM-এর ডঃ অ্যান্ডি স্ট্যানফোর্ড-ক্লার্ক এবং Arcom-এর আরলেন নিপার (বর্তমানে Cirrus Link) দ্বারা অনির্ভরযোগ্য স্যাটেলাইট নেটওয়ার্কের মাধ্যমে তেল পাইপলাইন পর্যবেক্ষণের জন্য উদ্ভাবিত হয়েছিল। এর উৎস গল্প নিখুঁতভাবে এর উদ্দেশ্যকে অন্তর্ভুক্ত করে: উল্লেখযোগ্য সীমাবদ্ধতার অধীনে চালিত ডিভাইসগুলির জন্য একটি হালকা, নির্ভরযোগ্য এবং দক্ষ মেসেজিং প্রোটোকল হওয়া।
প্রকাশ/সাবস্ক্রাইব (Pub/Sub) মডেল ব্যাখ্যা করা হয়েছে
এমকিউটিটি-র কেন্দ্রবিন্দুতে রয়েছে মার্জিত প্রকাশ/সাবস্ক্রাইব আর্কিটেকচারাল প্যাটার্ন। এটি HTTP-র রিকোয়েস্ট/রেসপন্স মডেল থেকে একটি মৌলিক প্রস্থান যা অনেক ডেভেলপার পরিচিত। ক্লায়েন্ট সার্ভার থেকে সরাসরি তথ্য অনুরোধ করার পরিবর্তে, যোগাযোগটি বিচ্ছিন্ন।
একটি বিশ্বব্যাপী সংবাদ সংস্থা কল্পনা করুন। সাংবাদিকরা (প্রকাশক) তাদের গল্প সরাসরি প্রতিটি পাঠকের কাছে পাঠান না। পরিবর্তে, তারা তাদের গল্প এজেন্সির কেন্দ্রীয় হাবে (ব্রোকার) পাঠান এবং সেগুলিকে নির্দিষ্ট বিষয় যেমন "বিশ্ব রাজনীতি" বা "প্রযুক্তি" এর অধীনে শ্রেণীবদ্ধ করেন। পাঠকরা (গ্রাহক) সাংবাদিকদের কাছ থেকে আপডেটের জন্য জিজ্ঞাসা করার প্রয়োজন নেই; তারা কেবল এজেন্সিকে বলে যে তারা কোন বিষয়ে আগ্রহী। তারপর এজেন্সি স্বয়ংক্রিয়ভাবে সেই বিষয়গুলির উপর যেকোনো নতুন গল্প আগ্রহী পাঠকদের কাছে ফরোয়ার্ড করে। সাংবাদিক এবং পাঠকদের একে অপরের অস্তিত্ব, অবস্থান বা অবস্থা জানার প্রয়োজন নেই।
এমকিউটিটি-তে, এই মডেল ডেটা পাঠানো ডিভাইস (প্রকাশক) এবং এটি গ্রহণকারী ডিভাইস বা অ্যাপ্লিকেশন (গ্রাহক) কে বিচ্ছিন্ন করে। এটি আইওটি-র জন্য অবিশ্বাস্যভাবে শক্তিশালী কারণ:
- স্পেস ডিকাপলিং: প্রকাশক এবং গ্রাহককে একে অপরের আইপি ঠিকানা বা অবস্থান জানার প্রয়োজন নেই।
- টাইম ডিকাপলিং: তাদের একই সময়ে চলতে হবে না। একটি সেন্সর একটি রিডিং প্রকাশ করতে পারে, এবং যদি সিস্টেমটি এমনভাবে ডিজাইন করা হয় তবে একটি অ্যাপ্লিকেশন কয়েক ঘন্টা পরে এটি গ্রহণ করতে পারে।
- সিঙ্ক্রোনাইজেশন ডিকাপলিং: উভয় পক্ষের অপারেশনগুলি বার্তা বিনিময় সম্পন্ন করার জন্য অপেক্ষা করার জন্য স্থগিত করার প্রয়োজন নেই।
এমকিউটিটি ইকোসিস্টেমের মূল উপাদান
এমকিউটিটি আর্কিটেকচার কয়েকটি মূল উপাদানের উপর নির্মিত:
- ব্রোকার: কেন্দ্রীয় হাব বা সার্ভার। এটি এমকিউটিটি বিশ্বের পোস্ট অফিস। ব্রোকার প্রকাশকদের কাছ থেকে সমস্ত বার্তা গ্রহণ, বিষয় অনুসারে ফিল্টার করা এবং উপযুক্ত গ্রাহকদের কাছে পাঠানোর জন্য দায়ী। জনপ্রিয় ব্রোকারগুলির মধ্যে ওপেন-সোর্স বিকল্প যেমন Mosquitto এবং VerneMQ, এবং পরিচালিত ক্লাউড পরিষেবা যেমন AWS IoT Core, Azure IoT Hub, এবং Google Cloud IoT Core অন্তর্ভুক্ত।
- ক্লায়েন্ট: ব্রোকারের সাথে সংযোগ স্থাপনকারী যেকোনো ডিভাইস বা অ্যাপ্লিকেশন। একটি ক্লায়েন্ট একটি প্রকাশক, একটি গ্রাহক, বা উভয়ই হতে পারে। একটি আইওটি সেন্সর একটি ক্লায়েন্ট, এবং সেন্সর ডেটা প্রক্রিয়াকরণকারী একটি সার্ভার অ্যাপ্লিকেশনও একটি ক্লায়েন্ট।
- বিষয়: একটি UTF-8 স্ট্রিং যা বার্তাগুলির জন্য একটি ঠিকানা বা লেবেল হিসাবে কাজ করে। ব্রোকার বার্তাগুলি রুট করার জন্য বিষয়গুলি ব্যবহার করে। বিষয়গুলি একটি ফাইল সিস্টেম পথের মতো, ডিলিমিটার হিসাবে ফরওয়ার্ড স্ল্যাশ ব্যবহার করে, অনুক্রমিক। উদাহরণস্বরূপ, একটি বিল্ডিং-এ একটি লিভিং রুমে একটি তাপমাত্রা সেন্সরের জন্য একটি ভাল বিষয় হতে পারে:
UK/London/Building-A/Floor-1/LivingRoom/Temperature। - পেলোড: এটি বার্তার প্রকৃত ডেটা কন্টেন্ট। এমকিউটিটি ডেটা-অজ্ঞেয়বাদী, যার মানে পেলোড যেকোনো কিছু হতে পারে: একটি সাধারণ স্ট্রিং, একটি পূর্ণসংখ্যা, JSON, XML, বা এমনকি এনক্রিপ্ট করা বাইনারি ডেটা। JSON তার নমনীয়তা এবং পঠনযোগ্যতার জন্য একটি খুব সাধারণ পছন্দ।
কেন এমকিউটিটি আইওটি যোগাযোগে আধিপত্য বিস্তার করে
এমকিউটিটি-র ডিজাইন নীতিগুলি এটিকে আইওটি-র চ্যালেঞ্জগুলির জন্য ব্যতিক্রমীভাবে উপযুক্ত করে তোলে:
- হালকা: এমকিউটিটি বার্তাগুলিতে খুব ছোট হেডার (মাত্র ২ বাইট) থাকে, যা নেটওয়ার্ক ব্যান্ডউইথ ব্যবহার হ্রাস করে। এটি ব্যয়বহুল সেলুলার প্ল্যান বা LoRaWAN-এর মতো লো-ব্যান্ডউইথ নেটওয়ার্কগুলির ডিভাইসগুলির জন্য গুরুত্বপূর্ণ।
- দক্ষ: প্রোটোকলের কম ওভারহেড সরাসরি কম পাওয়ার খরচে অনুবাদ হয়, যা ব্যাটারি-চালিত ডিভাইসগুলিকে মাস বা এমনকি বছর ধরে চালানোর অনুমতি দেয়।
- নির্ভরযোগ্য: এটি ফ্ল্যাকি, উচ্চ-ল্যাটেন্সি নেটওয়ার্কের উপরেও বার্তা সরবরাহ নিশ্চিত করার বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করে। এটি কোয়ালিটি অফ সার্ভিস স্তরের মাধ্যমে পরিচালিত হয়।
- পরিমাপযোগ্য: একটি একক ব্রোকার হাজার হাজার বা লক্ষ লক্ষ ক্লায়েন্টের সংযোগ একই সাথে পরিচালনা করতে পারে, যা এটিকে বৃহৎ-মাপের স্থাপনার জন্য উপযুক্ত করে তোলে।
- দ্বিমুখী: এমকিউটিটি ডিভাইস-থেকে-ক্লাউড (টেলিম্যাট্রি) এবং ক্লাউড-থেকে-ডিভাইস (কমান্ড) উভয় যোগাযোগকে অনুমতি দেয়, যা দূরবর্তীভাবে ডিভাইসগুলি নিয়ন্ত্রণের জন্য একটি অপরিহার্য প্রয়োজন।
কোয়ালিটি অফ সার্ভিস (QoS) বোঝা
এমকিউটিটি তাদের নির্দিষ্ট ব্যবহারের ক্ষেত্রে নির্ভরযোগ্যতা এবং ওভারহেডের মধ্যে সঠিক ভারসাম্য বেছে নেওয়ার জন্য তিনটি কোয়ালিটি অফ সার্ভিস (QoS) স্তর সরবরাহ করে।
- QoS 0 (সর্বাধিক একবার): এটি একটি "ফায়ার অ্যান্ড ফোরগেট" স্তর। বার্তাটি একবার পাঠানো হয়, ব্রোকার বা চূড়ান্ত গ্রাহকের কাছ থেকে প্রাপ্তির কোনো নিশ্চিতকরণ ছাড়াই। এটি দ্রুততম পদ্ধতি কিন্তু সরবরাহের কোনো গ্যারান্টি দেয় না। ব্যবহারের ক্ষেত্র: অ-গুরুত্বপূর্ণ, উচ্চ-ফ্রিকোয়েন্সি সেন্সর ডেটা, যেমন প্রতি ১০ সেকেন্ডে পাঠানো পরিবেষ্টিত ঘরের তাপমাত্রা রিডিং। একটি রিডিং হারানো কোনো সমস্যা নয়।
- QoS 1 (কমপক্ষে একবার): এই স্তরটি নিশ্চিত করে যে বার্তাটি কমপক্ষে একবার সরবরাহ করা হবে। প্রেরক ACKNOWLEDGEMENT (একটি PUBACK প্যাকেট) প্রাপ্ত না হওয়া পর্যন্ত বার্তাটি সংরক্ষণ করে। যদি কোনো ACKNOWLEDGEMENT প্রাপ্ত না হয়, তবে বার্তাটি পুনরায় পাঠানো হয়। ACKNOWLEDGEMENT হারিয়ে গেলে এটি কখনও কখনও ডুপ্লিকেট বার্তার কারণ হতে পারে। ব্যবহারের ক্ষেত্র: একটি স্মার্ট লাইট চালু করার কমান্ড। আপনাকে নিশ্চিত করতে হবে যে কমান্ডটি প্রাপ্ত হয়েছে, এবং এটি দুবার গ্রহণ করা কোনো ক্ষতি করে না।
- QoS 2 (ঠিক একবার): এটি সবচেয়ে নির্ভরযোগ্য কিন্তু ধীরতম স্তরও। এটি নিশ্চিত করার জন্য একটি চার-অংশের হ্যান্ডশেক ব্যবহার করে যে বার্তাটি ঠিক একবার সরবরাহ করা হয়, কোনো ডুপ্লিকেট ছাড়াই। ব্যবহারের ক্ষেত্র: গুরুতর অপারেশন যেখানে ডুপ্লিকেটগুলি বিপর্যয়কর হতে পারে, যেমন একটি আর্থিক লেনদেন, একটি ঔষধের নির্দিষ্ট পরিমাণ বিতরণের কমান্ড, বা একটি কারখানার রোবোটিক আর্ম নিয়ন্ত্রণ করা।
আপনার পাইথন এমকিউটিটি পরিবেশ সেটআপ করা
এখন, ব্যবহারিক হওয়া যাক। পাইথন দিয়ে এমকিউটিটি অ্যাপ্লিকেশন তৈরি শুরু করতে, আপনার দুটি জিনিস দরকার: এমকিউটিটি ক্লায়েন্টের জন্য একটি পাইথন লাইব্রেরি এবং যোগাযোগ করার জন্য একটি এমকিউটিটি ব্রোকার।
একটি পাইথন এমকিউটিটি লাইব্রেরি নির্বাচন করা: Paho-MQTT
পাইথনের জন্য সবচেয়ে বহুল ব্যবহৃত এবং পরিপক্ক এমকিউটিটি লাইব্রেরি হল Paho-MQTT, Eclipse Foundation থেকে। এটি একটি শক্তিশালী, বৈশিষ্ট্য-সমৃদ্ধ লাইব্রেরি যা একটি ব্রোকারের সাথে সংযোগ স্থাপন এবং বিষয়গুলিতে প্রকাশ বা সাবস্ক্রাইব করার জন্য একটি ক্লায়েন্ট ক্লাস সরবরাহ করে। পিআইপি, পাইথনের প্যাকেজ ম্যানেজার ব্যবহার করে এটি ইনস্টল করা সহজ।
আপনার টার্মিনাল বা কমান্ড প্রম্পট খুলুন এবং চালান:
pip install paho-mqtt
এই একক কমান্ডটি পাইথনে এমকিউটিটি ক্লায়েন্ট লেখা শুরু করার জন্য আপনার যা প্রয়োজন তা ইনস্টল করে।
একটি এমকিউটিটি ব্রোকার সেটআপ করা
আপনার কাছে একটি ব্রোকারের জন্য একাধিক বিকল্প রয়েছে, আপনার স্থানীয় মেশিনে উন্নয়নের জন্য একটি চালানো থেকে শুরু করে উৎপাদনের জন্য একটি শক্তিশালী ক্লাউড পরিষেবা ব্যবহার করা পর্যন্ত।
- স্থানীয় ব্রোকার (উন্নয়ন এবং শেখার জন্য): একটি স্থানীয় ব্রোকারের জন্য সবচেয়ে জনপ্রিয় পছন্দ হল Mosquitto, আরেকটি Eclipse প্রকল্প। এটি হালকা, ওপেন-সোর্স এবং ইনস্টল করা সহজ।
- Debian-ভিত্তিক লিনাক্সে (যেমন Ubuntu, Raspberry Pi OS):
sudo apt-get update && sudo apt-get install mosquitto mosquitto-clients - macOS-এ (Homebrew ব্যবহার করে):
brew install mosquitto - Windows-এ: Mosquitto ওয়েবসাইট থেকে নেটিভ ইনস্টলার ডাউনলোড করুন।
127.0.0.1বাlocalhost) উল্লেখ করে এটি ব্যবহার করতে পারেন। - Debian-ভিত্তিক লিনাক্সে (যেমন Ubuntu, Raspberry Pi OS):
- পাবলিক/ক্লাউড ব্রোকার (দ্রুত পরীক্ষার জন্য): কিছু ইনস্টল না করে প্রাথমিক পরীক্ষা-নিরীক্ষার জন্য, আপনি একটি বিনামূল্যে, পাবলিক ব্রোকার ব্যবহার করতে পারেন। দুটি জনপ্রিয় হল
test.mosquitto.orgএবংbroker.hivemq.com। গুরুত্বপূর্ণ: এগুলি পাবলিক এবং এনক্রিপ্ট করা নয়। এগুলিতে কোনো সংবেদনশীল বা ব্যক্তিগত ডেটা পাঠাবেন না। এগুলি শুধুমাত্র শেখা এবং পরীক্ষার উদ্দেশ্যে।
হ্যান্ডস-অন: পাইথন দিয়ে প্রকাশ এবং সাবস্ক্রাইব করা
আসুন আমাদের প্রথম পাইথন এমকিউটিটি অ্যাপ্লিকেশন লিখি। আমরা দুটি পৃথক স্ক্রিপ্ট তৈরি করব: একটি প্রকাশক যা বার্তা পাঠায় এবং একটি গ্রাহক যা সেগুলি গ্রহণ করে। এই উদাহরণের জন্য, আমরা ধরে নেব যে আপনি একটি স্থানীয় Mosquitto ব্রোকার চালাচ্ছেন।
একটি সাধারণ এমকিউটিটি প্রকাশক তৈরি করা (publisher.py)
এই স্ক্রিপ্টটি ব্রোকারের সাথে সংযোগ স্থাপন করবে এবং প্রতি দুই সেকেন্ডে `python/mqtt/test` টপিকে "Hello, MQTT!" বার্তা প্রকাশ করবে।
`publisher.py` নামে একটি ফাইল তৈরি করুন এবং নিম্নলিখিত কোডটি যুক্ত করুন:
import paho.mqtt.client as mqtt
import time
# --- কনফিগারেশন ---
BROKER_ADDRESS = "localhost" # একটি পাবলিক ব্রোকারের জন্য 'test.mosquitto.org' ব্যবহার করুন
PORT = 1883
TOPIC = "python/mqtt/test"
# --- সংযোগের জন্য কলব্যাক ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("MQTT Broker-এর সাথে সংযুক্ত!")
else:
print(f"সংযোগ করতে ব্যর্থ, রিটার্ন কোড {rc}")
# --- মূল স্ক্রিপ্ট ---
# 1. একটি ক্লায়েন্ট ইনস্ট্যান্স তৈরি করুন
client = mqtt.Client("PublisherClient")
# 2. on_connect কলব্যাক বরাদ্দ করুন
client.on_connect = on_connect
# 3. ব্রোকারের সাথে সংযোগ করুন
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. নেটওয়ার্ক লুপের জন্য একটি ব্যাকগ্রাউন্ড থ্রেড শুরু করুন
client.loop_start()
try:
count = 0
while True:
count += 1
message = f"Hello, MQTT! Message #{count}"
# 5. একটি বার্তা প্রকাশ করুন
result = client.publish(TOPIC, message)
# প্রকাশ সফল হয়েছে কিনা তা পরীক্ষা করুন
status = result[0]
if status == 0:
print(f"'{message}' টপিকে '{TOPIC}' এ পাঠানো হয়েছে")
else:
print(f"টপিকে '{TOPIC}' বার্তা পাঠাতে ব্যর্থ হয়েছে")
time.sleep(2)
except KeyboardInterrupt:
print("প্রকাশ বন্ধ হয়েছে।")
finally:
# 6. নেটওয়ার্ক লুপ বন্ধ করুন এবং সংযোগ বিচ্ছিন্ন করুন
client.loop_stop()
client.disconnect()
print("ব্রোকার থেকে সংযোগ বিচ্ছিন্ন।")
একটি সাধারণ এমকিউটিটি গ্রাহক তৈরি করা (subscriber.py)
এই স্ক্রিপ্টটি একই ব্রোকারের সাথে সংযোগ স্থাপন করবে, `python/mqtt/test` টপিকে সাবস্ক্রাইব করবে এবং প্রাপ্ত যেকোনো বার্তা প্রিন্ট করবে।
`subscriber.py` নামে আরেকটি ফাইল তৈরি করুন:
import paho.mqtt.client as mqtt
# --- কনফিগারেশন ---
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "python/mqtt/test"
# --- কলব্যাক ফাংশন ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("MQTT Broker-এর সাথে সংযুক্ত!")
# সফল সংযোগের পর টপিকে সাবস্ক্রাইব করুন
client.subscribe(TOPIC)
else:
print(f"সংযোগ করতে ব্যর্থ, রিটার্ন কোড {rc}")
def on_message(client, userdata, msg):
# বার্তা পেলোডকে বাইট থেকে স্ট্রিং-এ ডিকোড করুন
payload = msg.payload.decode()
print(f"প্রাপ্ত বার্তা: `{payload}` টপিকে `{msg.topic}`")
# --- মূল স্ক্রিপ্ট ---
# 1. একটি ক্লায়েন্ট ইনস্ট্যান্স তৈরি করুন
client = mqtt.Client("SubscriberClient")
# 2. কলব্যাকগুলি বরাদ্দ করুন
client.on_connect = on_connect
client.on_message = on_message
# 3. ব্রোকারের সাথে সংযোগ করুন
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. নেটওয়ার্ক লুপ শুরু করুন (ব্লকিং কল)
# এই ফাংশনটি স্বয়ংক্রিয়ভাবে পুনরায় সংযোগ এবং বার্তা প্রক্রিয়াকরণ পরিচালনা করে।
print("গ্রাহক শুনছে...")
client.loop_forever()
উদাহরণ চালানো
- দুটি পৃথক টার্মিনাল উইন্ডো খুলুন।
- প্রথম টার্মিনালে, গ্রাহক স্ক্রিপ্টটি চালান:
python subscriber.py - আপনি "গ্রাহক শুনছে..." বার্তা দেখতে পাবেন। এটি এখন বার্তাগুলির জন্য অপেক্ষা করছে।
- দ্বিতীয় টার্মিনালে, প্রকাশক স্ক্রিপ্টটি চালান:
python publisher.py - আপনি প্রতি দুই সেকেন্ডে বার্তা পাঠানো প্রকাশক দেখতে পাবেন। একই সময়ে, এই বার্তাগুলি গ্রাহকের টার্মিনাল উইন্ডোতে উপস্থিত হবে।
অভিনন্দন! আপনি পাইথন ব্যবহার করে একটি সম্পূর্ণ, কার্যকর এমকিউটিটি যোগাযোগ ব্যবস্থা তৈরি করেছেন।
বেসিকের বাইরে: উন্নত Paho-MQTT বৈশিষ্ট্য
বাস্তব-বিশ্বের আইওটি সিস্টেমগুলির জন্য আমাদের সাধারণ উদাহরণের চেয়ে বেশি শক্তিশালীতা প্রয়োজন। আসুন এমকিউটিটি-র কিছু উন্নত বৈশিষ্ট্যগুলি অন্বেষণ করি যা প্রোডাকশন-রেডি অ্যাপ্লিকেশন তৈরির জন্য অপরিহার্য।
শেষ ইচ্ছা এবং সাক্ষ্য (LWT)
একটি গুরুত্বপূর্ণ ডিভাইস, যেমন একটি নিরাপত্তা ক্যামেরা বা হার্ট মনিটর, বিদ্যুৎ বিভ্রাট বা নেটওয়ার্ক হারানোর কারণে অপ্রত্যাশিতভাবে সংযোগ বিচ্ছিন্ন হলে কী হয়? LWT বৈশিষ্ট্য হল এমকিউটিটি-র সমাধান। যখন একটি ক্লায়েন্ট সংযোগ স্থাপন করে, তখন এটি ব্রোকারের সাথে একটি "শেষ ইচ্ছা" বার্তা নিবন্ধন করতে পারে। যদি ক্লায়েন্ট অ-আনুকম্পাভাবে সংযোগ বিচ্ছিন্ন করে (একটি DISCONNECT প্যাকেট পাঠানোর আগে), ব্রোকার স্বয়ংক্রিয়ভাবে এই শেষ ইচ্ছা বার্তাটি তার পক্ষে একটি নির্দিষ্ট টপিকে প্রকাশ করবে।
এটি ডিভাইস স্ট্যাটাস পর্যবেক্ষণের জন্য অমূল্য। আপনি একটি ডিভাইস সংযোগ করার সময় devices/device-123/status টপিকে "online" পেলোড সহ একটি অনলাইন বার্তা প্রকাশ করতে পারেন, এবং একই টপিকে "offline" পেলোড সহ একটি LWT বার্তা নিবন্ধন করতে পারেন। এই টপিকে সাবস্ক্রাইব করা যেকোনো পর্যবেক্ষণ পরিষেবা তাৎক্ষণিকভাবে ডিভাইসের স্ট্যাটাস জানতে পারবে।
Paho-MQTT-তে LWT বাস্তবায়ন করতে, আপনি সংযোগ করার আগে এটি সেট করেন:
client.will_set('devices/device-123/status', payload='offline', qos=1, retain=True)
client.connect(BROKER_ADDRESS, PORT, 60)
রিটেইন করা বার্তা
সাধারণত, যদি একজন গ্রাহক একটি টপিকে সংযোগ স্থাপন করে, তবে এটি কেবল সাবস্ক্রাইব করার পরে প্রকাশিত বার্তাগুলিই পাবে। কিন্তু আপনি যদি সম্প্রতি সবচেয়ে সাম্প্রতিক মান পাওয়ার প্রয়োজন হয়? রিটেইন করা বার্তাগুলির জন্য এটিই। যখন একটি বার্তা retain ফ্ল্যাগ `True` তে সেট করে প্রকাশ করা হয়, তখন ব্রোকার সেই নির্দিষ্ট টপিকের জন্য সেই বার্তাটি সংরক্ষণ করে। যে কোনো সময় একটি নতুন ক্লায়েন্ট সেই টপিকে সাবস্ক্রাইব করে, এটি তাৎক্ষণিকভাবে সর্বশেষ রিটেইন করা বার্তাটি পাবে।
এটি স্ট্যাটাস তথ্যের জন্য উপযুক্ত। একটি ডিভাইস তার অবস্থা (যেমন, {"state": "ON"}) retain=True সহ প্রকাশ করতে পারে। স্টার্ট-আপ হওয়া এবং সাবস্ক্রাইব করা যেকোনো অ্যাপ্লিকেশন পরবর্তী আপডেটের জন্য অপেক্ষা না করেই ডিভাইসের বর্তমান অবস্থা অবিলম্বে জানতে পারবে।
Paho-MQTT-তে, আপনি কেবল আপনার প্রকাশ কলে retain ফ্ল্যাগটি যুক্ত করুন:
client.publish(TOPIC, payload, qos=1, retain=True)
পার্সিস্টেন্ট সেশন এবং ক্লিন সেশন
ক্লায়েন্টের সংযোগ অনুরোধে clean_session ফ্ল্যাগ ব্রোকার ক্লায়েন্টের সেশন কীভাবে পরিচালনা করে তা নিয়ন্ত্রণ করে।
- ক্লিন সেশন (
clean_session=True, ডিফল্ট): যখন ক্লায়েন্ট সংযোগ বিচ্ছিন্ন করে, ব্রোকার এটি সম্পর্কে সমস্ত তথ্য, তার সাবস্ক্রিপশন এবং যেকোনো কিউ করা QoS 1 বা 2 বার্তাগুলি ফেলে দেয়। যখন এটি পুনরায় সংযোগ করে, এটি একটি একেবারে নতুন ক্লায়েন্টের মতো। - পার্সিস্টেন্ট সেশন (
clean_session=False): যখন একটি অনন্য ক্লায়েন্ট আইডি সহ একটি ক্লায়েন্ট এই উপায়ে সংযোগ করে, ব্রোকার সংযোগ বিচ্ছিন্ন হওয়ার পরে তার সেশন বজায় রাখে। এর মধ্যে তার সাবস্ক্রিপশন এবং যেকোনো QoS 1 বা 2 বার্তা অন্তর্ভুক্ত যা এটি অফলাইনে থাকার সময় প্রকাশিত হয়েছিল। যখন ক্লায়েন্ট পুনরায় সংযোগ করে, ব্রোকার সমস্ত মিস করা বার্তাগুলি পাঠায়। সমালোচনামূলক কমান্ড হারানোর সামর্থ্য নেই এমন ডিভাইসগুলির জন্য এটি অপরিহার্য।
একটি পার্সিস্টেন্ট সেশন স্থাপন করতে, আপনাকে অবশ্যই একটি স্থিতিশীল, অনন্য ক্লায়েন্ট আইডি সরবরাহ করতে হবে এবং ক্লায়েন্ট ইনস্ট্যান্স তৈরি করার সময় clean_session=False সেট করতে হবে:
client = mqtt.Client(client_id="my-persistent-device-001", clean_session=False)
নিরাপত্তা একটি বিকল্প নয়: পাইথন সহ এমকিউটিটি সুরক্ষিত করা
যেকোনো বাস্তব-বিশ্বের অ্যাপ্লিকেশনে, নিরাপত্তা অপরিহার্য। একটি অসুরক্ষিত এমকিউটিটি ব্রোকার হল সাইবার আক্রমণকারীদের আপনার ডেটা শোনার, আপনার ডিভাইসগুলিতে মিথ্যা কমান্ড পাঠানোর বা ডিনাইয়াল-অফ-সার্ভিস আক্রমণ চালানোর জন্য একটি খোলা আমন্ত্রণ। এমকিউটিটি সুরক্ষিত করার জন্য তিনটি মূল স্তম্ভ জড়িত: প্রমাণীকরণ, এনক্রিপশন এবং অনুমোদন।
প্রমাণীকরণ: আপনি কে?
প্রমাণীকরণ ব্রোকারের সাথে সংযোগ স্থাপনকারী ক্লায়েন্টের পরিচয় যাচাই করে। সবচেয়ে সহজ পদ্ধতি হল একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড ব্যবহার করা। আপনি আপনার Mosquitto ব্রোকারকে শংসাপত্রের প্রয়োজনীয়তা কনফিগার করতে পারেন এবং তারপর আপনার পাইথন ক্লায়েন্টে সেগুলি সরবরাহ করতে পারেন।
আপনার পাইথন ক্লায়েন্টে, `username_pw_set()` পদ্ধতিটি ব্যবহার করুন:
client.username_pw_set(username="myuser", password="mypassword")
client.connect(BROKER_ADDRESS, PORT, 60)
এনক্রিপশন: TLS/SSL দিয়ে ট্রানজিটে ডেটা রক্ষা করা
ব্যবহারকারীর নাম এবং পাসওয়ার্ড নেটওয়ার্ক জুড়ে প্লেইন টেক্সটে পাঠানো হলে খুব বেশি উপকারী হয় না। এনক্রিপশন নিশ্চিত করে যে ক্লায়েন্ট এবং ব্রোকারের মধ্যে সমস্ত যোগাযোগ স্ক্র্যাম্বল করা হয়েছে এবং নেটওয়ার্কে স্নিপিং করা কারো কাছে অপঠনযোগ্য। এটি ট্রান্সপোর্ট লেয়ার সিকিউরিটি (TLS) ব্যবহার করে অর্জন করা হয়, একই প্রযুক্তি যা ওয়েবসাইটগুলিকে সুরক্ষিত করে (HTTPS)।
এমকিউটিটি (প্রায়শই MQTTS বলা হয়) দিয়ে TLS ব্যবহার করার জন্য, আপনাকে এটিকে সমর্থন করার জন্য আপনার ব্রোকারকে কনফিগার করতে হবে (সাধারণত পোর্ট 8883-এ) এবং আপনার ক্লায়েন্টকে প্রয়োজনীয় সার্টিফিকেট সরবরাহ করতে হবে। এর মধ্যে সাধারণত ব্রোকারের পরিচয় যাচাই করার জন্য একটি সার্টিফিকেট অথরিটি (CA) সার্টিফিকেট জড়িত থাকে।
Paho-MQTT-তে, আপনি `tls_set()` পদ্ধতিটি ব্যবহার করেন:
client.tls_set(ca_certs="path/to/ca.crt")
client.connect(BROKER_ADDRESS, 8883, 60)
অনুমোদন: আপনি কী করার অনুমতিপ্রাপ্ত?
একবার একটি ক্লায়েন্ট প্রমাণীকৃত হয়ে গেলে, অনুমোদন নির্ধারণ করে যে এটি কী করার অনুমতিপ্রাপ্ত। উদাহরণস্বরূপ, একটি তাপমাত্রা সেন্সর কেবল তার নিজের টপিকে (যেমন, sensors/temp-A/data) প্রকাশ করার অনুমতি পাবে, কিন্তু একটি কারখানার মেশিনারি নিয়ন্ত্রণের জন্য ব্যবহৃত টপিকে (যেমন, factory/floor-1/robot-arm/command) নয়। এটি সাধারণত অ্যাক্সেস কন্ট্রোল লিস্ট (ACLs) ব্যবহার করে ব্রোকারে পরিচালনা করা হয়। আপনি ব্রোকারকে নিয়মাবলী সহ কনফিগার করেন যা সংজ্ঞায়িত করে যে কোন ব্যবহারকারীরা নির্দিষ্ট টপিক প্যাটার্নে `পঠন` (সাবস্ক্রাইব) বা `লেখা` (প্রকাশ) করতে পারে।
সবকিছু একসাথে রাখা: একটি সাধারণ স্মার্ট পরিবেশ মনিটর প্রকল্প
এই ধারণাগুলিকে একত্রিত করার জন্য, আসুন একটু বেশি বাস্তবসম্মত প্রকল্প তৈরি করি। আমরা একটি সেন্সর ডিভাইস অনুকরণ করব যা JSON অবজেক্ট হিসাবে পরিবেশগত ডেটা প্রকাশ করে, এবং একটি পর্যবেক্ষণ অ্যাপ্লিকেশন যা এই ডেটাতে সাবস্ক্রাইব করে এবং এটি প্রদর্শন করে।
প্রকল্পের সংক্ষিপ্ত বিবরণ
- সেন্সর (প্রকাশক): একটি পাইথন স্ক্রিপ্ট যা তাপমাত্রা এবং আর্দ্রতা সেন্সর রিডিং অনুকরণ করে। এটি এই ডেটাটিকে একটি JSON পেলোডে প্যাক করবে এবং প্রতি ৫ সেকেন্ডে
smart_env/device01/telemetryটপিকে প্রকাশ করবে। - মনিটর (গ্রাহক): একটি পাইথন স্ক্রিপ্ট যা
smart_env/device01/telemetry-এ সাবস্ক্রাইব করে, JSON ডেটা গ্রহণ করে, এটি পার্স করে এবং একটি ব্যবহারকারী-বান্ধব স্ট্যাটাস আপডেট প্রিন্ট করে।
সেন্সর কোড (sensor_publisher.py)
import paho.mqtt.client as mqtt
import time
import json
import random
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "smart_env/device01/telemetry"
client = mqtt.Client("SensorDevice01")
client.connect(BROKER_ADDRESS, PORT, 60)
client.loop_start()
print("সেন্সর প্রকাশক শুরু হয়েছে...")
try:
while True:
# সেন্সর রিডিং অনুকরণ করুন
temperature = round(random.uniform(20.0, 30.0), 2)
humidity = round(random.uniform(40.0, 60.0), 2)
# একটি JSON পেলোড তৈরি করুন
payload = {
"timestamp": time.time(),
"temperature": temperature,
"humidity": humidity
}
payload_str = json.dumps(payload)
# QoS 1 সহ বার্তা প্রকাশ করুন
result = client.publish(TOPIC, payload_str, qos=1)
result.wait_for_publish() # প্রকাশ নিশ্চিত না হওয়া পর্যন্ত ব্লক করুন
print(f"প্রকাশিত: {payload_str}")
time.sleep(5)
except KeyboardInterrupt:
print("সেন্সর প্রকাশক বন্ধ হচ্ছে...")
finally:
client.loop_stop()
client.disconnect()
মনিটরিং ড্যাশবোর্ড কোড (monitor_subscriber.py)
import paho.mqtt.client as mqtt
import json
import datetime
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "smart_env/device01/telemetry"
def on_connect(client, userdata, flags, rc):
print(f"ফলাফল কোড {rc} সহ সংযুক্ত")
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
print("--- নতুন বার্তা প্রাপ্ত ---")
try:
# পেলোড স্ট্রিং ডিকোড করুন এবং JSON হিসাবে পার্স করুন
payload = json.loads(msg.payload.decode())
timestamp = datetime.datetime.fromtimestamp(payload.get('timestamp'))
temperature = payload.get('temperature')
humidity = payload.get('humidity')
print(f"ডিভাইস: {msg.topic}")
print(f"সময়: {timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"তাপমাত্রা: {temperature}°C")
print(f"আর্দ্রতা: {humidity}%")
except json.JSONDecodeError:
print("JSON পেলোড ডিকোড করতে ত্রুটি।")
except Exception as e:
print(f"একটি ত্রুটি ঘটেছে: {e}")
client = mqtt.Client("MonitoringDashboard")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS, PORT, 60)
print("মনিটরিং ড্যাশবোর্ড চলছে...")
client.loop_forever()
প্রোটোটাইপ থেকে উৎপাদন পর্যন্ত: এমকিউটিটি সেরা অভ্যাস
আপনার প্রকল্পকে একটি সাধারণ স্ক্রিপ্ট থেকে একটি শক্তিশালী, পরিমাপযোগ্য উৎপাদন সিস্টেমে সরানো সতর্ক পরিকল্পনা প্রয়োজন। এখানে কিছু অপরিহার্য সেরা অভ্যাস রয়েছে:
- একটি স্পষ্ট টপিক হায়ারার্কি ডিজাইন করুন: শুরু থেকেই আপনার টপিক গঠনটি সাবধানে পরিকল্পনা করুন। একটি ভাল হায়ারার্কি বর্ণনামূলক, পরিমাপযোগ্য এবং ওয়াইল্ডকার্ড ব্যবহার করে নমনীয় সাবস্ক্রিপশনগুলির অনুমতি দেয়। একটি সাধারণ প্যাটার্ন হল
<site>/<area>/<device_type>/<device_id>/<measurement>। - নেটওয়ার্ক সংযোগ বিচ্ছিন্নতা সাবধানে পরিচালনা করুন: নেটওয়ার্কগুলি অনির্ভরযোগ্য। আপনার ক্লায়েন্ট কোডে শক্তিশালী পুনরায় সংযোগ যুক্তি প্রয়োগ করা উচিত। Paho-MQTT-তে `on_disconnect` কলব্যাকটি এটিকে শুরু করার জন্য উপযুক্ত স্থান, পুনর্সংযোগের প্রচেষ্টা দ্বারা নেটওয়ার্ককে বন্যা করা এড়াতে এক্সপোনেনশিয়াল ব্যাকঅফ-এর মতো একটি কৌশল প্রয়োগ করে।
- গঠিত ডেটা পেলোড ব্যবহার করুন: সর্বদা আপনার বার্তা পেলোডগুলির জন্য JSON বা Protocol Buffers-এর মতো একটি গঠিত ডেটা ফর্ম্যাট ব্যবহার করুন। এটি আপনার ডেটাকে স্ব-বর্ণনামূলক, সংস্করণযোগ্য এবং বিভিন্ন অ্যাপ্লিকেশনের (যেকোনো ভাষায় লেখা) পার্স করার জন্য সহজ করে তোলে।
- ডিফল্টরূপে সবকিছু সুরক্ষিত করুন: নিরাপত্তা ছাড়া কোনো আইওটি সিস্টেম স্থাপন করবেন না। কমপক্ষে, ব্যবহারকারীর নাম/পাসওয়ার্ড প্রমাণীকরণ এবং TLS এনক্রিপশন ব্যবহার করুন। উচ্চতর নিরাপত্তা প্রয়োজনের জন্য, ক্লায়েন্ট সার্টিফিকেট-ভিত্তিক প্রমাণীকরণ অন্বেষণ করুন।
- আপনার ব্রোকার পর্যবেক্ষণ করুন: একটি উৎপাদন পরিবেশে, আপনার এমকিউটিটি ব্রোকার একটি সমালোচনামূলক অবকাঠামো। সিপিইউ/মেমরি ব্যবহার, সংযুক্ত ক্লায়েন্টগুলির সংখ্যা, বার্তা হার এবং বাদ পড়া বার্তাগুলি সহ এর স্বাস্থ্য ট্র্যাক করতে পর্যবেক্ষণ সরঞ্জামগুলি ব্যবহার করুন। অনেক ব্রোকার এই স্ট্যাটাস তথ্য সরবরাহ করে এমন একটি বিশেষ `$SYS` টপিক হায়ারার্কি উন্মুক্ত করে।
উপসংহার: পাইথন এবং এমকিউটিটি সহ আপনার যাত্রা
আমরা মৌলিক "কেন" এমকিউটিটি থেকে শুরু করে পাইথন দিয়ে এটি বাস্তবায়নের "কীভাবে" পর্যন্ত যাত্রা করেছি। আপনি প্রকাশ/সাবস্ক্রাইব মডেলের শক্তি, QoS-এর গুরুত্ব এবং নিরাপত্তার সমালোচনামূলক ভূমিকা শিখেছেন। আপনি দেখেছেন কিভাবে Paho-MQTT লাইব্রেরি সেন্সর ডেটা প্রকাশ করতে এবং কমান্ড সাবস্ক্রাইব করতে পারে এমন অত্যাধুনিক ক্লায়েন্ট তৈরি করাকে উল্লেখযোগ্যভাবে সহজ করে তোলে।
এমকিউটিটি কেবল একটি প্রোটোকল নয়; এটি ইন্টারনেট অফ থিংস-এর একটি ভিত্তি প্রযুক্তি। এর হালকা প্রকৃতি এবং শক্তিশালী বৈশিষ্ট্যগুলি এটিকে বিশ্বজুড়ে লক্ষ লক্ষ ডিভাইসের জন্য পছন্দের পছন্দ করে তুলেছে, স্মার্ট শহরগুলি থেকে সংযুক্ত কৃষি থেকে শিল্প অটোমেশন পর্যন্ত।
যাত্রা এখানে শেষ হয় না। পরবর্তী পদক্ষেপ হল এই ধারণাগুলি নেওয়া এবং বাস্তব হার্ডওয়্যারে প্রয়োগ করা। একটি রাস্পবেরি পাই, একটি ESP32, বা অন্যান্য মাইক্রোকন্ট্রোলার দিয়ে পরীক্ষা করুন। ফিজিক্যাল সেন্সরগুলি সংযুক্ত করুন, ক্লাউড আইওটি প্ল্যাটফর্মগুলির সাথে একীভূত করুন এবং ফিজিক্যাল বিশ্বের সাথে ইন্টারঅ্যাক্ট করা অ্যাপ্লিকেশন তৈরি করুন। পাইথন এবং এমকিউটিটি সহ, আপনার কাছে সংযুক্ত সমাধানের পরবর্তী প্রজন্ম তৈরি করার জন্য একটি শক্তিশালী টুলকিট রয়েছে।