- ما هو MQTT؟
- تثبيت Mosquitto MQTT Broker على Raspberry Pi
- اختبار وسيط Raspberry Pi Mosquitto
- مخطط الرسم البياني
- الكود والشرح
MQTT هو بروتوكول يستخدم لإرسال واستقبال الرسائل عبر الإنترنت. استخدمنا هذا البروتوكول سابقًا في عداد الكهرباء Iot و Raspberry Pi Alexa لنشر البيانات على الإنترنت. في هذا البرنامج التعليمي ، سنتعرف على المزيد حول MQTT والمصطلحات المتعلقة به. هنا سوف نستخدم Raspberry Pi كوسيط MQTT محلي ونتحكم في LED متصل بـ NodeMCU ESP12E من خلال لوحة معلومات تطبيق MQTT. يتم توصيل مستشعر DHT11 أيضًا بـ NodeMCU حتى نحصل على قراءة درجة الحرارة والرطوبة على لوحة معلومات MQTT ، باستخدام Raspberry Pi كوسيط MQTT محلي مرة أخرى.
لذا ، لنبدأ بفهم MQTT والمصطلحات المتعلقة به.
ما هو MQTT؟
يرمز MQTT إلى خدمة نقل القياس عن بُعد في قائمة انتظار الرسائل والتي صممتها شركة IBM. هذا البروتوكول بسيط وخفيف الوزن يستخدم لإرسال واستقبال الرسائل عبر الإنترنت وهو مصمم للأجهزة ذات استخدامات النطاق الترددي المنخفض. في الوقت الحاضر ، يتم استخدام هذا البروتوكول بشكل متكرر في أجهزة إنترنت الأشياء لإرسال واستقبال بيانات أجهزة الاستشعار. أيضًا ، في أنظمة أتمتة المنزل القائمة على إنترنت الأشياء ، يمكن استخدام هذا البروتوكول بسهولة دون استخدام الكثير من بيانات الإنترنت.
هناك عدد قليل من المصطلحات المستخدمة بشكل متكرر في MQTT:
- اشترك وانشر
- رسالة
- موضوع
- وسيط
1. الاشتراك والنشر : الاشتراك يعني الحصول على البيانات من جهاز آخر ، ونشر وسيلة لإرسال البيانات إلى جهاز آخر.
عندما يرسل device1 البيانات إلى device2 ، يُعرف باسم Publisher والآخر هو Subscriber والعكس صحيح.
2. الرسالة: الرسائل هي المعلومات التي نرسلها ونستقبلها. يمكن أن تكون بيانات أو أي نوع من الأوامر. على سبيل المثال ، إذا كنا ننشر بيانات درجة الحرارة على السحابة ، فإن بيانات درجة الحرارة هذه تُعرف بالرسالة.
3. الموضوع: هذه هي الطريقة التي تسجل بها الاهتمام بالرسائل الواردة أو كيف تحدد المكان الذي تريد نشر الرسالة فيه. يتم تمثيل المواضيع بسلاسل مفصولة بشرطة مائلة للأمام. يتم نشر البيانات حول الموضوعات باستخدام MQTT ثم اشتراك جهاز MQTT في الموضوع للحصول على البيانات.
4. وسيط MQTT: هذا الشيء مسؤول عن استلام جميع الرسائل من الناشرين ، وتصفية الرسائل ثم نشر الرسائل للمشتركين المهتمين بها.
عندما يتم استضافة هذا الوسيط على السحابة ، يطلق عليه MQTT cloud. هناك العديد من خدمات MQTT المستندة إلى السحابة مثل Adafruit IO و MQTT.IO و IBM bluemix و Microsoft Azure وما إلى ذلك. يمكن أيضًا استخدام MQTT مع سحابة Amazon AWS cloud الشهيرة ، والتي أوضحناها في برنامج Getting Started with Amazon AWS التعليمي.
يمكننا إنشاء وسيط MQTT الخاص بنا باستخدام Raspberry Pi. سيكون هذا وسيط MQTT المحلي ، أي يمكنك إرسال واستقبال البيانات على شبكتك المحلية فقط وليس من أي مكان. لذلك سنقوم هنا بتثبيت وسيط Mosquitto MQTT في Raspberry Pi لجعله وسيط MQTT محليًا وسنرسل بيانات درجة الحرارة من NodeMCU إلى تطبيق لوحة معلومات MQTT. أيضًا ، سوف نتحكم في مؤشر LED متصل بـ NodeMCU باستخدام الوسيط.
تثبيت Mosquitto MQTT Broker على Raspberry Pi
افتح الجهاز في Raspberry pi واكتب الأوامر التالية لتثبيت الوسيط
sudo apt update sudo apt install -y mosquitto mosquitto-customers
انتظر حتى ينتهي التثبيت. الآن ، لبدء تشغيل الوسيط عند بدء تشغيل raspberry pi ، اكتب الأمر التالي
sudo systemctl يتيح خدمة mosquitto.service
هذا كل شيء ، نحن جميعًا على استعداد لإطلاق وسيط MQTT الخاص بنا. للتحقق من تثبيته بشكل صحيح ، أدخل الأمر التالي
البعوض الخامس
سيعطيك هذا الأمر إصدار وسيط MQTT الخاص بك. يجب أن يكون 1.4.x أو أعلى.
اختبار وسيط Raspberry Pi Mosquitto
1. قم بتشغيل وسيط Mosquitto في الخلفية باستخدام الأمر أدناه
البعوض د
2. الآن ، سنقوم بالاشتراك في موضوع في exampleTopic باستخدام الأمر التالي
mosquitto_sub -d مثال
3. الآن ، سوف ننشر بعض الرسائل على exampleTopic
mosquitto_pub -d -t exampleTopic -m "Hello world!"
سوف تتلقى مرحبا العالم! الرسالة في محطة المشترك.
الآن ، حان الوقت للتحكم والحصول على البيانات من جهاز آخر في حالتنا نحن نستخدم تطبيق لوحة القيادة NodeMCU و MQTT .
- أولاً ، سنتحكم في مؤشر LED عن طريق إرسال أمر باستخدام التطبيق ، لذا في هذه الحالة ، يتصرف NodeMCU كمشترك والتطبيق كناشر.
- ثم ESP12E يحتوي أيضًا على مستشعر DHT11 متصل به ويرسل قراءة درجة الحرارة هذه إلى تطبيق Mobile MQTT ، لذلك في هذه الحالة سيكون الهاتف المحمول هو المشترك وسيكون NodeMCU هو الناشر. ولإعادة توجيه هذه الرسائل حول الموضوعات المعنية ، يتم استخدام وسيط Mosquitto MQTT.
مخطط الرسم البياني
قم بتوصيل الدائرة كما هو موضح في الرسم التخطيطي. هنا يتم استخدام DHT11 لقراءات درجة الحرارة ولكن يمكن أيضًا استخدام مستشعر درجة الحرارة LM35. لقد استخدمنا بالفعل مستشعر DHT11 في العديد من مشاريعنا بما في ذلك مع NodeMCU لبناء محطة طقس.
لنبدأ في كتابة كود NodeMCU للاشتراك ونشر البيانات.
الكود والشرح
هنا سوف نستخدم قالب مكتبة Adafruit MQTT وسنغير الأشياء المطلوبة في الكود. يمكن استخدام نفس الكود لنشر البيانات والاشتراك فيها في Adafruit IO cloud فقط عن طريق تغيير بعض الأشياء.لهذا قم بتنزيل مكتبة Adafruit MQTT من Sketch -> Include Library -> Manage Libraries. ابحث عن Adafruit MQTT وقم بتثبيته. بعد تركيب المكتبة. انتقل إلى الأمثلة -> مكتبة Adafruit mqtt -> mqtt_esp8266
ثم قم بتحرير هذا الرمز وفقًا لعنوان Raspberry Pi IP الخاص بنا وبيانات اعتماد Wi-Fi.
قم بتضمين جميع مكتبات ESP8266WIFI و Adafruit MQTT .
#تضمن
ثم حدد SSID وكلمة المرور لشبكة Wi-Fi الخاصة بك ، والتي تريد توصيل ESP-12e من خلالها. تأكد من اتصال RPi و NodeMCU بنفس الشبكة.
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
يحدد هذا القسم خادم Adafruit ، في هذه الحالة عنوان IP الخاص بـ Raspberry Pi ومنفذ الخادم.
#define AIO_SERVER "عنوان IP الخاص بـ Pi" #define AIO_SERVERPORT 1883
ستبقى الحقول أدناه فارغة لأننا لا نستخدم سحابة Adafruit.
#define AIO_USERNAME "" #define AIO_KEY ""
ثم قم بإنشاء فئة ESP8266 WiFiClient للاتصال بخادم MQTT.
عميل WiFiClient ؛
قم بإعداد فئة عميل MQTT بتمرير تفاصيل تسجيل الدخول وعميل WiFi وخادم MQTT.
Adafruit_MQTT_Client mqtt (والعميل ، AIO_SERVER ، AIO_SERVERPORT ، AIO_USERNAME ، AIO_KEY) ؛
قم بإعداد موجز يسمى "درجة الحرارة" لنشر درجة الحرارة.
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt، AIO_USERNAME "/ feeds / temperature") ؛
قم بإعداد موجز يسمى "led1" للاشتراك في التغييرات.
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt، AIO_USERNAME "/ feeds / led") ؛
في وظيفة الإعداد ، نعلن رقم PIN الخاص بـ NodeMCU الذي تريد الحصول على الإخراج عليه. ثم قم بتوصيل NodeMCU بنقطة وصول Wi-fi.
إعداد باطل () { Serial.begin (115200) ؛ تأخير (10) ؛ pinMode (LED ، الإخراج) ؛ Serial.println (F ("Adafruit MQTT demo")) ؛ // الاتصال بنقطة وصول WiFi. Serial.println () ، Serial.println () ، Serial.print ("الاتصال بـ") ؛ Serial.println (WLAN_SSID) ، WiFi.begin (WLAN_SSID، WLAN_PASS) ، بينما (WiFi.status ()! = WL_CONNECTED) { …. …. ... إعداد اشتراك MQTT لتغذية الصمام. mqtt.subscribe (& led1) ؛ }
في وظيفة الحلقة ، سنضمن أن الاتصال بخادم MQTT على قيد الحياة باستخدام MQTT_connect () ؛ وظيفة.
حلقة باطلة () { MQTT_connect () ،
الآن ، اشترك في تغذية "led" واحصل على السلسلة من وسيط MQTT وقم بتحويل هذه السلسلة إلى رقم باستخدام atoi () ؛ وظيفة وكتابة هذا الرقم إلى دبوس LED باستخدام digitalWrite () ؛ وظيفة.
Adafruit_MQTT_Subscribe * الاشتراك ؛ while ((subscription = mqtt.readSubscription (20000))) { if (subscription == & led1) { Serial.print (F ("Got:")) ؛ Serial.println ((char *) led1.lastread) ؛ int led1_State = atoi ((char *) led1.lastread) ؛ الكتابة الرقمية (LED ، led1_State) ؛ }
الآن ، احصل على درجة الحرارة في متغير وانشر هذه القيمة باستخدام وظيفة Temperature.publish (t) .
تعويم t = dht.readTemperature () ، … .. if (! Temperature.publish (t)) { Serial.println (F ("Failed"))؛ } else { Serial.println (F ("OK!")) ؛ }
يتم تقديم كود كامل مع فيديو توضيحي في نهاية هذا البرنامج التعليمي. قم بتحميل الكود إلى لوحة NodeMCU وافتح تطبيق لوحة التحكم MQTT الذي قمت بتنزيله في الهاتف الذكي.
يمكنك أيضًا التحكم في Raspberry Pi GPIO من أي مكان في العالم باستخدام سحابة MQTT مثل Adafruit IO و MQTT.IO وما إلى ذلك ، والتي سنتعلمها في البرنامج التعليمي التالي.