أتقن بروتوكول MQTT لإنترنت الأشياء باستخدام بايثون. يغطي هذا الدليل الشامل المبادئ ومكتبة Paho-MQTT والأمان وتطبيق المشاريع الواقعية.
بايثون لإنترنت الأشياء: دليل شامل لتطبيق MQTT
العالم المتصل: لماذا تهم بروتوكولات إنترنت الأشياء
نعيش في عصر من الاتصال غير المسبوق. إنترنت الأشياء (IoT) لم يعد مفهومًا مستقبليًا؛ بل هو واقع عالمي، ينسج بصمت شبكة من مليارات الأجهزة الذكية التي تراقب بيئتنا، وتؤتمت منازلنا، وتحسن صناعاتنا، وتبسط مدننا. من منظم الحرارة الذكي في منزل في سيول إلى مستشعر زراعي في حقل في كينيا الريفية، تولد هذه الأجهزة كمية هائلة من البيانات. ولكن كيف تتحدث جميعها مع بعضها البعض ومع السحابة، خاصة عندما تكون غالبًا صغيرة، ومنخفضة الطاقة، وتعمل على شبكات غير موثوقة؟ الإجابة تكمن في بروتوكولات الاتصال المتخصصة.
بينما يشغل بروتوكول HTTP معظم الويب الذي نستخدمه يوميًا، إلا أنه غالبًا ما يكون ثقيلًا جدًا ويستهلك طاقة كبيرة لعالم إنترنت الأشياء المقيد. هنا تبرز البروتوكولات المصممة خصيصًا للاتصال بين الآلات (M2M). من بينها، برز أحدها كقوة مهيمنة: MQTT.
تم تصميم هذا الدليل الشامل للمطورين والمهندسين والهواة في جميع أنحاء العالم الذين يرغبون في تسخير قوة MQTT باستخدام بايثون، وهي واحدة من أكثر لغات البرمجة تنوعًا وشعبية في مجال إنترنت الأشياء. سننتقل من المفاهيم الأساسية لـ MQTT إلى بناء تطبيقات إنترنت الأشياء آمنة وقوية وقابلة للتوسع.
ما هو MQTT؟ بروتوكول مصمم للقيود
MQTT هو اختصار لـ Message Queuing Telemetry Transport. تم اختراعه في عام 1999 من قبل الدكتور آندي ستانفورد-كلارك من IBM وأرلين نيبر من Arcom (الآن Cirrus Link) لمراقبة خطوط أنابيب النفط عبر شبكات الأقمار الصناعية غير الموثوقة. قصة نشأته تلخص تمامًا هدفه: أن يكون بروتوكول مراسلة خفيف الوزن وموثوق وفعال للأجهزة التي تعمل تحت قيود كبيرة.
شرح نموذج النشر/الاشتراك (Pub/Sub)
في قلب MQTT يكمن نمط النشر/الاشتراك المعماري الأنيق. هذا يعتبر ابتعادًا جوهريًا عن نموذج الطلب/الاستجابة لـ HTTP الذي يعرفه العديد من المطورين. بدلاً من أن يقوم العميل بطلب المعلومات مباشرة من الخادم، يتم فصل الاتصال.
تخيل وكالة أنباء عالمية. لا يرسل الصحفيون (الناشرون) قصصهم مباشرة إلى كل قارئ. بدلاً من ذلك، يرسلون قصصهم إلى مركز الوكالة (الوسيط) ويصنفونها تحت مواضيع محددة مثل "السياسة العالمية" أو "التكنولوجيا". لا يحتاج القراء (المشتركون) إلى طلب التحديثات من الصحفيين؛ بل يخبرون الوكالة ببساطة بالمواضيع التي يهتمون بها. ثم تقوم الوكالة تلقائيًا بإعادة توجيه أي قصص جديدة حول هذه المواضيع إلى القراء المهتمين. لا يحتاج الصحفيون والقراء أبدًا إلى معرفة بوجود بعضهم البعض، أو موقعهم، أو حالتهم.
في 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 لها رأس صغير جدًا (يصل إلى 2 بايت فقط)، مما يقلل من استخدام عرض النطاق الترددي للشبكة. هذا أمر بالغ الأهمية للأجهزة الموجودة على خطط خلوية باهظة الثمن أو شبكات ذات نطاق ترددي منخفض مثل LoRaWAN.
- فعال: ينعكس الحمل المنخفض للبروتوكول مباشرة في استهلاك طاقة أقل، مما يسمح للأجهزة التي تعمل بالبطارية بالعمل لأشهر أو حتى سنوات.
- موثوق: يتضمن ميزات لضمان تسليم الرسائل، حتى عبر الشبكات المتقطعة وعالية الكمون. يتم إدارة هذا من خلال مستويات جودة الخدمة.
- قابل للتوسع: يمكن لوسيط واحد التعامل مع اتصالات الآلاف أو حتى ملايين العملاء في وقت واحد، مما يجعله مناسبًا للنشر على نطاق واسع.
- ثنائي الاتجاه: يسمح MQTT بالاتصال من الجهاز إلى السحابة (القياس عن بعد) ومن السحابة إلى الجهاز (الأوامر)، وهو مطلب حيوي للتحكم في الأجهزة عن بُعد.
فهم جودة الخدمة (QoS)
يوفر MQTT ثلاثة مستويات لجودة الخدمة (QoS) للسماح للمطورين باختيار التوازن الصحيح بين الموثوقية والحمل لحالة الاستخدام الخاصة بهم.
- QoS 0 (على الأكثر مرة واحدة): هذا مستوى "أطلق وانسى". يتم إرسال الرسالة مرة واحدة، دون تأكيد استلام من الوسيط أو المشترك النهائي. إنها أسرع طريقة ولكنها لا تضمن التسليم. حالة الاستخدام: بيانات مستشعر غير حرجة وعالية التردد، مثل قراءة درجة حرارة الغرفة المحيطة المرسلة كل 10 ثوانٍ. فقدان قراءة واحدة ليس مشكلة.
- 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. إنه خفيف الوزن، مفتوح المصدر، وسهل التثبيت.
- على لينكس المستند إلى دبيان (مثل Ubuntu، Raspberry Pi OS):
sudo apt-get update && sudo apt-get install mosquitto mosquitto-clients - على macOS (باستخدام Homebrew):
brew install mosquitto - على ويندوز: قم بتنزيل المثبت الأصلي من موقع Mosquitto.
127.0.0.1أوlocalhost). - على لينكس المستند إلى دبيان (مثل Ubuntu، Raspberry Pi OS):
- وسيط عام/سحابي (للاختبار السريع): للتجارب الأولية دون تثبيت أي شيء، يمكنك استخدام وسيط عام مجاني. اثنان من الخيارات الشائعة هما
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("Connected to MQTT Broker!")
else:
print(f"Failed to connect, return code {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"Sent `{message}` to topic `{TOPIC}`")
else:
print(f"Failed to send message to topic {TOPIC}")
time.sleep(2)
except KeyboardInterrupt:
print("Publication stopped.")
finally:
# 6. إيقاف حلقة الشبكة وفصل الاتصال
client.loop_stop()
client.disconnect()
print("Disconnected from the broker.")
إنشاء مشترك 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("Connected to MQTT Broker!")
# الاشتراك في الموضوع عند نجاح الاتصال
client.subscribe(TOPIC)
else:
print(f"Failed to connect, return code {rc}")
def on_message(client, userdata, msg):
# فك تشفير حمولة الرسالة من بايت إلى سلسلة نصية
payload = msg.payload.decode()
print(f"Received message: `{payload}` on topic `{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("Subscriber is listening...")
client.loop_forever()
تشغيل المثال
- افتح نافذتين منفصلتين للطرفية.
- في الطرفية الأولى، قم بتشغيل نص المشترك:
python subscriber.py - يجب أن ترى الرسالة "Subscriber is listening...". إنه ينتظر الآن الرسائل.
- في الطرفية الثانية، قم بتشغيل نص الناشر:
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)
الجلسات المستمرة والجلسات النظيفة
علامة `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
اسم المستخدم وكلمة المرور ليسا ذا فائدة كبيرة إذا تم إرسالهما كنص عادي عبر الشبكة. يضمن التشفير أن يتم تشفير جميع الاتصالات بين العميل والوسيط وغير قابلة للقراءة لأي شخص يتجسس على الشبكة. يتم تحقيق ذلك باستخدام Transport Layer Security (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` كل 5 ثوانٍ.
- المراقب (المشترك): نص بايثون يشترك في `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("Sensor publisher started...")
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"Published: {payload_str}")
time.sleep(5)
except KeyboardInterrupt:
print("Stopping sensor publisher...")
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"Connected with result code {rc}")
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
print("--- New Message Received ---")
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"Device: {msg.topic}")
print(f"Time: {timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"Temperature: {temperature}°C")
print(f"Humidity: {humidity}%")
except json.JSONDecodeError:
print("Error decoding JSON payload.")
except Exception as e:
print(f"An error occurred: {e}")
client = mqtt.Client("MonitoringDashboard")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS, PORT, 60)
print("Monitoring dashboard is running...")
client.loop_forever()
من النموذج الأولي إلى الإنتاج: أفضل الممارسات في MQTT
نقل مشروعك من نص بسيط إلى نظام إنتاج قوي وقابل للتوسع يتطلب تخطيطًا دقيقًا. إليك بعض أفضل الممارسات الأساسية:
- تصميم تسلسل هرمي واضح للمواضيع: خطط لهيكل الموضوع بعناية منذ البداية. التسلسل الهرمي الجيد وصفي، قابل للتوسع، ويسمح بالاشتراكات المرنة باستخدام الأحرف البديلة. نمط شائع هو
<site>/<area>/<device_type>/<device_id>/<measurement>. - التعامل مع انقطاعات الشبكة بلطف: الشبكات غير موثوقة. يجب أن ينفذ كود العميل الخاص بك منطق إعادة اتصال قويًا. رد الاتصال `on_disconnect` في Paho-MQTT هو المكان المثالي لبدء ذلك، وتنفيذ استراتيجية مثل التراجع الأسي لتجنب إغراق الشبكة بمحاولات إعادة الاتصال.
- استخدام حمولات بيانات منظمة: استخدم دائمًا تنسيق بيانات منظم مثل JSON أو Protocol Buffers لحمولات رسائلك. هذا يجعل بياناتك واضحة بذاتها، قابلة للإصدار، ويسهل على التطبيقات المختلفة (المكتوبة بأي لغة) تحليلها.
- تأمين كل شيء افتراضيًا: لا تقم بنشر نظام إنترنت الأشياء بدون أمان. كحد أدنى، استخدم مصادقة اسم المستخدم/كلمة المرور وتشفير TLS. لاحتياجات أمان أعلى، استكشف المصادقة المستندة إلى شهادات العميل.
- مراقبة الوسيط الخاص بك: في بيئة الإنتاج، يعد وسيط MQTT الخاص بك بنية تحتية حرجة. استخدم أدوات المراقبة لتتبع صحته، بما في ذلك استخدام وحدة المعالجة المركزية/الذاكرة، وعدد العملاء المتصلين، ومعدلات الرسائل، والرسائل المفقودة. العديد من الوسطاء يعرضون تسلسل مواضيع `$SYS` خاص يوفر هذه المعلومات التشخيصية.
الخاتمة: رحلتك مع بايثون و MQTT
لقد انتقلنا من "لماذا" الأساسية لـ MQTT إلى "كيف" العملية لتطبيقها باستخدام بايثون. لقد تعلمت عن قوة نموذج النشر/الاشتراك، وأهمية QoS، والدور الحاسم للأمان. لقد رأيت كيف أن مكتبة Paho-MQTT تجعل من السهل بشكل ملحوظ بناء عملاء متطورين يمكنهم نشر بيانات المستشعرات والاشتراك في الأوامر.
MQTT هو أكثر من مجرد بروتوكول؛ إنه تكنولوجيا أساسية لإنترنت الأشياء. طبيعته خفيفة الوزن وميزاته القوية جعلته الخيار المفضل لملايين الأجهزة في جميع أنحاء العالم، من المدن الذكية إلى الزراعة المتصلة إلى الأتمتة الصناعية.
الرحلة لا تنتهي هنا. الخطوة التالية هي أخذ هذه المفاهيم وتطبيقها على الأجهزة الحقيقية. جرب Raspberry Pi، ESP32، أو متحكمات دقيقة أخرى. قم بتوصيل مستشعرات مادية، والتكامل مع منصات إنترنت الأشياء السحابية، وبناء تطبيقات تتفاعل مع العالم المادي. باستخدام بايثون و MQTT، لديك مجموعة أدوات قوية لبناء الجيل القادم من الحلول المتصلة.