بر پروتکل MQTT برای اینترنت اشیا با استفاده از پایتون مسلط شوید. این راهنمای عمیق، اصول، کتابخانه Paho-MQTT، امنیت و پیادهسازی پروژههای واقعی را پوشش میدهد.
پایتون برای اینترنت اشیا: راهنمای جامع پیادهسازی MQTT
دنیای متصل: چرا پروتکلهای اینترنت اشیا اهمیت دارند
ما در عصر اتصال بیسابقهای زندگی میکنیم. اینترنت اشیا (IoT) دیگر یک مفهوم آیندهنگرانه نیست؛ بلکه یک واقعیت جهانی است که در سکوت، شبکهای از میلیاردها دستگاه هوشمند را میبافد که محیط ما را نظارت میکنند، خانههای ما را خودکار میسازند، صنایع ما را بهینه میکنند و شهرهای ما را سادهتر میسازند. از یک ترموستات هوشمند در خانهای در سئول تا یک سنسور کشاورزی در مزرعهای در روستایی در کنیا، این دستگاهها در حال تولید حجم عظیمی از دادهها هستند. اما چگونه همه آنها با یکدیگر و با ابر (cloud) صحبت میکنند، به خصوص زمانی که اغلب کوچک، کممصرف و در شبکههای غیرقابل اعتماد کار میکنند؟ پاسخ در پروتکلهای ارتباطی تخصصی نهفته است.
در حالی که پروتکل HTTP بیشتر وبسایتی را که روزانه استفاده میکنیم، قدرت میبخشد، اغلب برای دنیای محدود اینترنت اشیا بسیار سنگین و پرمصرف است. اینجاست که پروتکلهایی که به طور خاص برای ارتباط ماشین به ماشین (M2M) طراحی شدهاند، میدرخشند. در میان آنها، یکی به عنوان یک نیروی غالب ظهور کرده است: MQTT.
این راهنمای جامع برای توسعهدهندگان، مهندسان و علاقهمندان در سراسر جهان طراحی شده است که میخواهند از قدرت MQTT با استفاده از پایتون، یکی از همهکارهترین و محبوبترین زبانهای برنامهنویسی در فضای اینترنت اشیا، بهرهمند شوند. ما از مفاهیم بنیادی MQTT سفر خواهیم کرد تا به ساخت برنامههای کاربردی اینترنت اشیای امن، قوی و مقیاسپذیر برسیم.
MQTT چیست؟ پروتکلی ساخته شده برای محدودیتها
MQTT مخفف Message Queuing Telemetry Transport (انتقال تلهمتری در صف پیام) است. این پروتکل در سال ۱۹۹۹ توسط دکتر اندی استنفورد-کلارک از IBM و آرلن نیپر از Arcom (اکنون Cirrus Link) برای نظارت بر خطوط لوله نفت از طریق شبکههای ماهوارهای غیرقابل اعتماد اختراع شد. داستان پیدایش آن به طور کامل هدف آن را خلاصه میکند: یک پروتکل پیامرسانی سبک، قابل اعتماد و کارآمد برای دستگاههایی که تحت محدودیتهای قابل توجهی کار میکنند.
توضیح مدل انتشار/اشتراک (Pub/Sub)
در قلب MQTT، الگوی معماری ظریف انتشار/اشتراک قرار دارد. این یک تفاوت اساسی با مدل درخواست/پاسخ HTTP است که بسیاری از توسعهدهندگان با آن آشنا هستند. به جای اینکه یک کلاینت مستقیماً اطلاعات را از یک سرور درخواست کند، ارتباطات از هم جدا (decoupled) میشوند.
یک خبرگزاری جهانی را تصور کنید. روزنامهنگاران (ناشران) داستانهای خود را مستقیماً برای تک تک خوانندگان ارسال نمیکنند. در عوض، آنها داستانهای خود را به مرکز اصلی آژانس (بروکر) میفرستند و آنها را تحت موضوعات خاصی مانند «سیاست جهانی» یا «فناوری» دستهبندی میکنند. خوانندگان (مشترکین) نیازی به درخواست بهروزرسانی از روزنامهنگاران ندارند؛ آنها به سادگی به آژانس میگویند که به چه موضوعاتی علاقهمند هستند. سپس آژانس به طور خودکار هر داستان جدید در آن موضوعات را برای خوانندگان علاقهمند ارسال میکند. روزنامهنگاران و خوانندگان هرگز نیازی به دانستن وجود، مکان یا وضعیت یکدیگر ندارند.
در MQTT، این مدل دستگاه ارسالکننده داده (ناشر) را از دستگاه یا برنامه دریافتکننده آن (مشترک) جدا میکند. این برای اینترنت اشیا فوقالعاده قدرتمند است زیرا:
- جداسازی مکانی: ناشر و مشترک نیازی به دانستن آدرس IP یا مکان یکدیگر ندارند.
- جداسازی زمانی: آنها نیازی به اجرا شدن همزمان ندارند. یک سنسور میتواند یک قرائت را منتشر کند و یک برنامه میتواند ساعتها بعد آن را دریافت کند اگر سیستم برای این کار طراحی شده باشد.
- جداسازی همگامسازی: عملیات در هر دو طرف نیازی به متوقف شدن برای انتظار تکمیل تبادل پیام توسط طرف دیگر ندارد.
اجزای کلیدی اکوسیستم MQTT
معماری MQTT بر روی چند جزء اصلی ساخته شده است:
- بروکر (Broker): هاب یا سرور مرکزی. این دفتر پست دنیای MQTT است. بروکر مسئول دریافت تمام پیامها از ناشران، فیلتر کردن آنها بر اساس موضوع و ارسال آنها به مشترکین مناسب است. بروکرهای محبوب شامل گزینههای منبعباز مانند Mosquitto و VerneMQ و خدمات ابری مدیریتشده مانند AWS IoT Core، Azure IoT Hub و Google Cloud IoT Core هستند.
- کلاینت (Client): هر دستگاه یا برنامهای که به بروکر متصل میشود. یک کلاینت میتواند ناشر، مشترک یا هر دو باشد. یک سنسور اینترنت اشیا یک کلاینت است و یک برنامه سرور که دادههای سنسور را پردازش میکند نیز یک کلاینت است.
- موضوع (Topic): یک رشته UTF-8 که به عنوان آدرس یا برچسب برای پیامها عمل میکند. بروکر از موضوعات برای مسیریابی پیامها استفاده میکند. موضوعات سلسلهمراتبی هستند و از اسلش رو به جلو به عنوان جداکننده استفاده میکنند، بسیار شبیه به مسیر یک سیستم فایل. به عنوان مثال، یک موضوع خوب برای یک سنسور دما در اتاق نشیمن در ساختمانی در لندن ممکن است این باشد:
UK/London/Building-A/Floor-1/LivingRoom/Temperature. - پیام (Payload): این محتوای داده واقعی پیام است. MQTT نسبت به دادهها بیتفاوت است، به این معنی که پیام میتواند هر چیزی باشد: یک رشته ساده، یک عدد صحیح، JSON، XML یا حتی دادههای باینری رمزگذاری شده. JSON به دلیل انعطافپذیری و خوانایی، یک انتخاب بسیار رایج است.
چرا MQTT بر ارتباطات اینترنت اشیا مسلط است
اصول طراحی MQTT آن را به طور استثنایی برای چالشهای اینترنت اشیا مناسب میسازد:
- سبک: پیامهای MQTT دارای هدر بسیار کوچکی هستند (حداقل ۲ بایت) که استفاده از پهنای باند شبکه را به حداقل میرساند. این برای دستگاههایی که از طرحهای تلفن همراه گرانقیمت یا شبکههای با پهنای باند کم مانند LoRaWAN استفاده میکنند، حیاتی است.
- کارآمد: سربار کم پروتکل مستقیماً به مصرف انرژی کمتر منجر میشود و به دستگاههای با باتری اجازه میدهد ماهها یا حتی سالها کار کنند.
- قابل اعتماد: این پروتکل شامل ویژگیهایی برای تضمین تحویل پیام، حتی بر روی شبکههای ناپایدار و با تأخیر بالا است. این از طریق سطوح کیفیت خدمات (Quality of Service) مدیریت میشود.
- مقیاسپذیر: یک بروکر واحد میتواند اتصالات از هزاران یا حتی میلیونها کلاینت را به طور همزمان مدیریت کند، که آن را برای استقرارهای در مقیاس بزرگ مناسب میسازد.
- دو طرفه: MQTT امکان ارتباط از دستگاه به ابر (تلهمتری) و از ابر به دستگاه (دستورات) را فراهم میکند، که یک نیاز حیاتی برای کنترل دستگاهها از راه دور است.
درک کیفیت خدمات (QoS)
MQTT سه سطح کیفیت خدمات (QoS) را ارائه میدهد تا به توسعهدهندگان اجازه دهد تعادل مناسبی بین قابلیت اطمینان و سربار برای مورد استفاده خاص خود انتخاب کنند.
- QoS 0 (حداکثر یک بار): این یک سطح «شلیک کن و فراموش کن» است. پیام یک بار ارسال میشود، بدون تأیید دریافت از سوی بروکر یا مشترک نهایی. این سریعترین روش است اما هیچ تضمینی برای تحویل ارائه نمیدهد. مورد استفاده: دادههای سنسور غیرحیاتی و با فرکانس بالا، مانند قرائت دمای محیط اتاق که هر ۱۰ ثانیه ارسال میشود. از دست دادن یک قرائت مشکلی ایجاد نمیکند.
- QoS 1 (حداقل یک بار): این سطح تضمین میکند که پیام حداقل یک بار تحویل داده خواهد شد. فرستنده پیام را تا زمانی که تأییدیهای (یک بسته PUBACK) از گیرنده دریافت کند، ذخیره میکند. اگر تأییدیهای دریافت نشود، پیام دوباره ارسال میشود. این گاهی اوقات میتواند منجر به پیامهای تکراری شود اگر تأییدیه از بین برود. مورد استفاده: دستوری برای روشن کردن یک چراغ هوشمند. شما باید مطمئن شوید که دستور دریافت میشود و دریافت دوباره آن آسیبی نمیرساند.
- QoS 2 (دقیقاً یک بار): این قابل اعتمادترین اما همچنین کندترین سطح است. از یک دستدهی چهار قسمتی برای اطمینان از اینکه پیام دقیقاً یک بار و بدون تکرار تحویل داده میشود، استفاده میکند. مورد استفاده: عملیات حیاتی که تکرار آنها میتواند فاجعهبار باشد، مانند یک تراکنش مالی، دستوری برای توزیع مقدار دقیقی از دارو، یا کنترل یک بازوی رباتیک در یک کارخانه.
راهاندازی محیط MQTT پایتون شما
حالا بیایید عملی کار کنیم. برای شروع ساخت برنامههای MQTT با پایتون، به دو چیز نیاز دارید: یک کتابخانه پایتون برای کلاینت MQTT و یک بروکر MQTT برای برقراری ارتباط با آن.
انتخاب یک کتابخانه MQTT برای پایتون: Paho-MQTT
پرکاربردترین و بالغترین کتابخانه MQTT برای پایتون Paho-MQTT از بنیاد Eclipse است. این یک کتابخانه قوی و پر از ویژگی است که یک کلاس کلاینت برای اتصال به بروکر و انتشار یا اشتراک در موضوعات فراهم میکند. نصب آن با استفاده از pip، مدیر بسته پایتون، ساده است.
ترمینال یا خط فرمان خود را باز کنید و اجرا کنید:
pip install paho-mqtt
این دستور واحد همه چیزهایی را که برای شروع نوشتن کلاینتهای MQTT در پایتون نیاز دارید، نصب میکند.
راهاندازی یک بروکر MQTT
شما چندین گزینه برای بروکر دارید، از اجرای یکی بر روی ماشین محلی خود برای توسعه تا استفاده از یک سرویس ابری قدرتمند برای تولید.
- بروکر محلی (برای توسعه و یادگیری): محبوبترین انتخاب برای یک بروکر محلی Mosquitto است، پروژه دیگری از Eclipse. این بروکر سبک، منبعباز و نصب آن آسان است.
- در لینوکسهای مبتنی بر دبیان (مانند اوبونتو، سیستم عامل رزبری پای):
sudo apt-get update && sudo apt-get install mosquitto mosquitto-clients - در macOS (با استفاده از Homebrew):
brew install mosquitto - در ویندوز: نصبکننده بومی را از وبسایت Mosquitto دانلود کنید.
127.0.0.1یاlocalhost) از آن استفاده کنید. - در لینوکسهای مبتنی بر دبیان (مانند اوبونتو، سیستم عامل رزبری پای):
- بروکر عمومی/ابری (برای تست سریع): برای آزمایشهای اولیه بدون نصب هیچ چیزی، میتوانید از یک بروکر عمومی و رایگان استفاده کنید. دو مورد محبوب عبارتند از
test.mosquitto.orgوbroker.hivemq.com. مهم: این بروکرها عمومی و رمزگذاری نشده هستند. هیچ داده حساس یا خصوصی را به آنها ارسال نکنید. آنها فقط برای اهداف یادگیری و آزمایش هستند.
کار عملی: انتشار و اشتراک با پایتون
بیایید اولین برنامه MQTT پایتون خود را بنویسیم. ما دو اسکریپت جداگانه ایجاد خواهیم کرد: یک ناشر که پیامها را ارسال میکند و یک مشترک که آنها را دریافت میکند. برای این مثال، فرض میکنیم که شما یک بروکر Mosquitto محلی را اجرا میکنید.
ایجاد یک ناشر MQTT ساده (publisher.py)
این اسکریپت به بروکر متصل شده و هر دو ثانیه یک پیام «Hello, MQTT!» را به موضوع `python/mqtt/test` منتشر میکند.
یک فایل با نام `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 متصل شد!")
else:
print(f"اتصال ناموفق بود، کد بازگشتی {rc}")
# --- اسکریپت اصلی ---
# ۱. یک نمونه کلاینت ایجاد کنید
client = mqtt.Client("PublisherClient")
# ۲. تابع بازگشتی on_connect را اختصاص دهید
client.on_connect = on_connect
# ۳. به بروکر متصل شوید
client.connect(BROKER_ADDRESS, PORT, 60)
# ۴. یک نخ پسزمینه برای حلقه شبکه شروع کنید
client.loop_start()
try:
count = 0
while True:
count += 1
message = f"Hello, MQTT! Message #{count}"
# ۵. یک پیام منتشر کنید
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:
# ۶. حلقه شبکه را متوقف کرده و اتصال را قطع کنید
client.loop_stop()
client.disconnect()
print("از بروکر قطع اتصال شد.")
ایجاد یک مشترک MQTT ساده (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 متصل شد!")
# پس از اتصال موفق، در موضوع مشترک شوید
client.subscribe(TOPIC)
else:
print(f"اتصال ناموفق بود، کد بازگشتی {rc}")
def on_message(client, userdata, msg):
# محتوای پیام را از بایت به رشته رمزگشایی کنید
payload = msg.payload.decode()
print(f"پیام دریافت شد: `{payload}` در موضوع `{msg.topic}`")
# --- اسکریپت اصلی ---
# ۱. یک نمونه کلاینت ایجاد کنید
client = mqtt.Client("SubscriberClient")
# ۲. توابع بازگشتی را اختصاص دهید
client.on_connect = on_connect
client.on_message = on_message
# ۳. به بروکر متصل شوید
client.connect(BROKER_ADDRESS, PORT, 60)
# ۴. حلقه شبکه را شروع کنید (فراخوانی مسدودکننده)
# این تابع به طور خودکار اتصال مجدد و پردازش پیامها را مدیریت میکند.
print("مشترک در حال گوش دادن است...")
client.loop_forever()
اجرای مثال
- دو پنجره ترمینال جداگانه باز کنید.
- در ترمینال اول، اسکریپت مشترک را اجرا کنید:
python subscriber.py - شما باید پیام «مشترک در حال گوش دادن است...» را ببینید. اکنون منتظر پیامها است.
- در ترمینال دوم، اسکریپت ناشر را اجرا کنید:
python publisher.py - خواهید دید که ناشر هر دو ثانیه پیامها را ارسال میکند. همزمان، این پیامها در پنجره ترمینال مشترک ظاهر میشوند.
تبریک میگویم! شما به تازگی یک سیستم ارتباطی MQTT کامل و کارا با استفاده از پایتون ایجاد کردهاید.
فراتر از اصول اولیه: ویژگیهای پیشرفته Paho-MQTT
سیستمهای اینترنت اشیای واقعی به استحکام بیشتری نسبت به مثال ساده ما نیاز دارند. بیایید برخی از ویژگیهای پیشرفته MQTT را که برای ساخت برنامههای آماده تولید ضروری هستند، بررسی کنیم.
وصیتنامه و عهدنامه آخر (LWT)
چه اتفاقی میافتد اگر یک دستگاه حیاتی، مانند یک دوربین امنیتی یا یک مانیتور قلب، به دلیل قطعی برق یا از دست دادن شبکه به طور غیرمنتظره قطع شود؟ ویژگی LWT راهحل MQTT است. هنگامی که یک کلاینت متصل میشود، میتواند یک پیام «وصیتنامه آخر» را در بروکر ثبت کند. اگر کلاینت به طور ناگهانی قطع شود (بدون ارسال بسته DISCONNECT)، بروکر به طور خودکار این پیام وصیتنامه را از طرف آن به یک موضوع مشخص منتشر میکند.
این برای نظارت بر وضعیت دستگاه بسیار ارزشمند است. شما میتوانید یک دستگاه داشته باشید که هنگام اتصال، پیام `devices/device-123/status` با محتوای `"online"` را منتشر کند و یک پیام LWT با همان موضوع اما با محتوای `"offline"` ثبت کند. هر سرویس نظارتی که در این موضوع مشترک باشد، فوراً از وضعیت دستگاه مطلع خواهد شد.
برای پیادهسازی LWT در Paho-MQTT، آن را قبل از اتصال تنظیم میکنید:
client.will_set('devices/device-123/status', payload='offline', qos=1, retain=True)
client.connect(BROKER_ADDRESS, PORT, 60)
پیامهای ماندگار (Retained Messages)
به طور معمول، اگر یک مشترک به یک موضوع متصل شود، فقط پیامهایی را دریافت میکند که پس از اشتراک آن منتشر شدهاند. اما اگر به آخرین مقدار بلافاصله نیاز داشته باشید چه؟ این همان کاری است که پیامهای ماندگار برای آن هستند. هنگامی که یک پیام با پرچم `retain` روی `True` منتشر میشود، بروکر آن پیام را برای آن موضوع خاص ذخیره میکند. هر زمان که یک کلاینت جدید در آن موضوع مشترک شود، فوراً آخرین پیام ماندگار را دریافت خواهد کرد.
این برای اطلاعات وضعیت عالی است. یک دستگاه میتواند وضعیت خود را (مثلاً `{"state": "ON"}`) با `retain=True` منتشر کند. هر برنامهای که راهاندازی شود و مشترک شود، بلافاصله وضعیت فعلی دستگاه را بدون نیاز به انتظار برای بهروزرسانی بعدی میداند.
در Paho-MQTT، شما به سادگی پرچم `retain` را به فراخوانی انتشار خود اضافه میکنید:
client.publish(TOPIC, payload, qos=1, retain=True)
جلسات پایدار و جلسات پاک (Persistent Sessions and Clean Sessions)
پرچم `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)
امنیت یک گزینه نیست: ایمنسازی MQTT با پایتون
در هر برنامه کاربردی واقعی، امنیت از اهمیت بالایی برخوردار است. یک بروکر MQTT ناامن، یک دعوتنامه باز برای بازیگران مخرب است تا دادههای شما را شنود کنند، دستورات نادرست به دستگاههای شما ارسال کنند یا حملات محرومسازی از سرویس راهاندازی کنند. ایمنسازی MQTT شامل سه ستون کلیدی است: احراز هویت، رمزگذاری و مجوزدهی.
احراز هویت: شما کی هستید؟
احراز هویت، هویت کلاینتی که به بروکر متصل میشود را تأیید میکند. سادهترین روش استفاده از نام کاربری و رمز عبور است. شما میتوانید بروکر Mosquitto خود را طوری پیکربندی کنید که نیاز به اعتبارنامه داشته باشد و سپس آنها را در کلاینت پایتون خود ارائه دهید.
در کلاینت پایتون خود، از متد `username_pw_set()` استفاده کنید:
client.username_pw_set(username="myuser", password="mypassword")
client.connect(BROKER_ADDRESS, PORT, 60)
رمزگذاری: حفاظت از دادهها در حین انتقال با TLS/SSL
نام کاربری و رمز عبور اگر به صورت متن ساده از طریق شبکه ارسال شوند، فایده چندانی ندارند. رمزگذاری تضمین میکند که تمام ارتباطات بین کلاینت و بروکر درهمریخته و برای هر کسی که در شبکه شنود میکند، غیرقابل خواندن است. این کار با استفاده از امنیت لایه انتقال (TLS)، همان فناوری که وبسایتها را ایمن میکند (HTTPS)، انجام میشود.
برای استفاده از TLS با MQTT (که اغلب MQTTS نامیده میشود)، باید بروکر خود را برای پشتیبانی از آن پیکربندی کنید (معمولاً روی پورت 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()
از نمونه اولیه تا تولید: بهترین شیوههای MQTT
انتقال پروژه شما از یک اسکریپت ساده به یک سیستم تولیدی قوی و مقیاسپذیر نیازمند برنامهریزی دقیق است. در اینجا برخی از بهترین شیوههای ضروری آورده شده است:
- طراحی یک سلسلهمراتب موضوعی واضح: ساختار موضوع خود را از ابتدا با دقت برنامهریزی کنید. یک سلسلهمراتب خوب، توصیفی، مقیاسپذیر است و امکان اشتراکهای انعطافپذیر با استفاده از wildcards را فراهم میکند. یک الگوی رایج
است.// / / - مدیریت قطعیهای شبکه به شیوهای مناسب: شبکهها غیرقابل اعتماد هستند. کد کلاینت شما باید منطق اتصال مجدد قوی را پیادهسازی کند. تابع بازگشتی `on_disconnect` در Paho-MQTT مکان مناسبی برای شروع این کار است، با پیادهسازی یک استراتژی مانند عقبنشینی نمایی (exponential backoff) برای جلوگیری از اشباع شبکه با تلاشهای اتصال مجدد.
- استفاده از پیامهای با دادههای ساختاریافته: همیشه از یک فرمت داده ساختاریافته مانند JSON یا Protocol Buffers برای پیامهای خود استفاده کنید. این کار دادههای شما را خود-توصیف، قابل نسخهبندی و برای تجزیه توسط برنامههای مختلف (نوشته شده به هر زبانی) آسان میکند.
- ایمنسازی همه چیز به طور پیشفرض: یک سیستم اینترنت اشیا را بدون امنیت مستقر نکنید. حداقل، از احراز هویت با نام کاربری/رمز عبور و رمزگذاری TLS استفاده کنید. برای نیازهای امنیتی بالاتر، احراز هویت مبتنی بر گواهی کلاینت را بررسی کنید.
- نظارت بر بروکر خود: در یک محیط تولیدی، بروکر MQTT شما یک قطعه زیرساختی حیاتی است. از ابزارهای نظارتی برای ردیابی سلامت آن، از جمله استفاده از CPU/حافظه، تعداد کلاینتهای متصل، نرخ پیامها و پیامهای حذف شده استفاده کنید. بسیاری از بروکرها یک سلسلهمراتب موضوعی ویژه `$SYS` را که این اطلاعات وضعیت را ارائه میدهد، در معرض دید قرار میدهند.
نتیجهگیری: سفر شما با پایتون و MQTT
ما از «چرایی» بنیادی MQTT به «چگونگی» عملی پیادهسازی آن با پایتون سفر کردهایم. شما در مورد قدرت مدل انتشار/اشتراک، اهمیت QoS و نقش حیاتی امنیت آموختهاید. شما دیدهاید که چگونه کتابخانه Paho-MQTT ساخت کلاینتهای پیچیدهای را که میتوانند دادههای سنسور را منتشر کرده و در دستورات مشترک شوند، به طرز چشمگیری ساده میکند.
MQTT چیزی بیش از یک پروتکل است؛ این یک فناوری بنیادی برای اینترنت اشیا است. ماهیت سبک و ویژگیهای قوی آن، آن را به انتخاب اول برای میلیونها دستگاه در سراسر جهان، از شهرهای هوشمند گرفته تا کشاورزی متصل و اتوماسیون صنعتی، تبدیل کرده است.
سفر در اینجا به پایان نمیرسد. گام بعدی این است که این مفاهیم را بر روی سختافزار واقعی به کار ببرید. با یک رزبری پای، یک ESP32 یا سایر میکروکنترلرها آزمایش کنید. سنسورهای فیزیکی را متصل کنید، با پلتفرمهای اینترنت اشیای ابری ادغام شوید و برنامههایی بسازید که با دنیای فیزیکی تعامل دارند. با پایتون و MQTT، شما یک جعبه ابزار قدرتمند برای ساخت نسل بعدی راهحلهای متصل در اختیار دارید.