در این پروژه، ما از یک بروکر رایگان و محبوب Eclipse MQTT استفاده می کنیم و نحوه اتصال دستگاه IoT (در پروژه ی ما ، ماژول NodeMCU) به بروکر MQTT و انتقال داده ها بین بروکر MQTT و NodeMCU را یاد می گیریم. از این رو مقاله ارتباط MQTT با Esp8266 با استفاده از Arduino IDE را تا انتها بخوانید.
پروتکل MQTT چیست؟
قبل از ادامه کار ، بهتر است دید روشنی در مورد پروتکل MQTT داشته باشیم. این یک پروتکل پیام سبک است که از روش انتشار/اشتراک استفاده می کند و پیام ها را بین چندین دستگاه ترجمه می کند. با استفاده از پروتکل MQTT ، ما همچنین می توانیم داده ها را ارسال یا دریافت کنیم . این پروتکل نسبت به پروتکل های مشابه مانند HTTP سریعتر است. به غیر از این ، مزایای بسیاری نسبت به پروتکل های دیگر دارد مانند حجم بسیار کم آن ، بنابراین حافظه اضافی مصرف نمی کند علاوه بر این ، دارای یک پروتکل امنیتی قوی نیز می باشد.
MQTT چگونه کار می کند؟
برای درک عملکرد پروتکل MQTT ، باید سه چیز را درک کنیم.
کلاینت MQTT:
کلاینت MQTT هر دستگاهی (می تواند یک میکروکنترلر یا سرور باشد) است که عملکردهای MQTT را اجرا می کند و با یک سرور مرکزی که به عنوان “بروکر” شناخته می شود ارتباط برقرار می کند. بروکر ارتباط داده ها را بین کلاینت متصل انجام می دهد.
PUBLISHER MQTT:
هنگامی که کلاینت می خواهد اطلاعاتی را ارسال کند ، کلاینت به عنوان “نشردهنده یاPublisher ” شناخته می شود. نشر دهنده اطلاعات مربوط به یک موضوع خاص را منتشر می کند. “topic” مسیری است که در آن می توانیم پیامها را منتشر یا مشترک کنیم. سپس بروکر اطلاعات منتشر شده توسط کاربر را برای کلاینت ارسال می کند.
SubscriberMQTT:
Subscriber MQTT موضوعات بروکر MQTT را که پیام های آن توسط بروکر ارسال شده را می خواند.
بروکر Eclipse Mosquitto:
Eclipse Mosquitto یک بروکر منبع باز MQTT است که سبک است و برای استفاده در دستگاه iot جهت ارتباط مناسب است. پروتکل MQTT یک روش سبک برای انتقال اطلاعات با استفاده از مدل انتشار/اشتراک ایجاد می کند.
راه اندازی بروکر Eclipse Mosquitto:
برای برقراری ارتباط با بروکر ، ابتدا باید آن را تنظیم کنیم. در این پروژه ، یک برنامه Android برای انتشار و اشتراک اطلاعات با Broker استفاده می کنیم.برای راه اندازی مراحل زیر را طی می کنیم:
مرحله 1:
در این پروژه ، از برنامه ای به نام ” client MQTT” استفاده می کنیم که شبیه تصویر زیر است.
گام 2:
روی علامت “+” کلیک می کنیم تا یک بروکر جدید ایجاد کنیم. وقتی روی دکمه کلیک می شود ، یک صفحه جدید مطابق شکل زیر ظاهر می شود.
مرحله 3:
پس از آن ، اطلاعات بروکر باید در قسمت مورد نیاز پر شود. ابتدا بر روی گزینه “Enabled” که در برنامه نشان داده شده است کلیک می کنیم. در این پروژه ، از بروکرEclipse MQTT استفاده می شود ،فیلدها را به صورت زیر پر می کنیم:
نام دلخواه :nick name
host: mqtt.eclipse.org
port: 1883
شناسه دلخواه:client id
فیلدهای دیگر ضروری نیستند و می توان آنها را خالی گذاشت. پس از اتمام ، آنرا ذخیره می کنیم.
فرآیند راه اندازی برنامه اندروید به پایان رسید و اکنون به سمت سخت افزار کارها می رویم.
المان های مورد نیاز:
- NodeMCU
- LED
- Breadboard
- Connecting wires
- Programming cable
دیاگرام Eclipse MQTT Test Circuit :
کد آردوینو ESP8266 برای برقراری ارتباط با بروکر MQTT:
اگر برای اولین بار کد را در NodeMCU بارگذاری می کنید ، ابتدا باید Arduino IDE را راه اندازی کنید. برای انجام این کار ، فقط دستورالعمل ساده زیر را دنبال کنید.
ابتدا Arduino IDE را باز کرده و سپس به مسیر File> Preferences> Settings بروید.
در مرحله بعد ، URL زیر را کپی کرده و در قسمت “URL Board Board Additional” قرار دهید و روی “Ok” کلیک کنید.
https://arduino.esp8266.com/stable/package_esp8266com_index.json
در مرحله بعد ، به Tools> Board> Boards Manager بروید. در این پنجره ESP8266 را در کادر جستجو کنید. سپس آخرین نسخه را انتخاب کرده و روی install کلیک کنید.
در نهایت ، پس از اتمام نصب به مسیر tools<boards بروید و NodeMCU 1.0(ESP-12E Module) را انتخاب کنید. اکنون می توانید NodeMCU را با Arduino IDE برنامه ریزی کنید.
در مرحله اول ، کتابخانه ی”ESP8266WiFi.h” را برای استفاده از ESP8266 و کتابخانه ی”PubSubClient.h” را برای MQTT قرار داده ایم.
1 2 |
#include <ESP8266WiFi.h> #include <PubSubClient.h> |
سپس برای wifi نام کاربری و گذرواژه انتخاب می کنیم.
1 2 |
const char* ssid = "admin"; const char* password = "12345678"; |
ما برای این پروژه از سرور Eclipse MQTT استفاده کرده ایم ، به همین دلیل آدرس سرور به عنوان “mqtt.eclipse.org” ذکر شده است. اما اگر قصد دارید از هر سرور دیگری مانند Mosquitto ، Adafruit استفاده کنید ، می توانید آدرس سرور و شماره پورت خود را جایگزین آن کنید.
1 2 |
const char* mqtt_server = "mqtt.eclipse.org"; const int mqtt_port = 1883; |
در مرحله بعد WiFiClient و PubSubClient ایجاد شده که در طول برنامه استفاده می شود.
1 2 |
WiFiClient espClient; PubSubClient client(espClient); |
در قسمت ()setup ، ابتدا ()WiFi.begin رافراخوانی می کنیم ، با استفاده از این روش ESP را به HotSpot دلخواه می تواینم متصل کنیم.
1 |
WiFi.begin(ssid, password); |
در مرحله بعد ، ما با استفاده از روش ()WiFi.statusاتصال شبکه را تست می کنیم. پس از اتصال موفقیت آمیز ، پیامی بر روی Serial Monitor با SSID شبکه متصل , چاپ می شود.
1 2 3 4 5 6 |
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.print("Connected to WiFi :"); Serial.println(WiFi.SSID()); |
در حال حاضر ، ما باید یک بروکر ایجاد کنیم. اگر می خواهیم پیام ها را از سرور دریافت کنیم ، باید یک تابع callback ایجاد کنیم. برای این منظور ، ما از روش setCallback (callback) استفاده می کنیم.
1 2 |
client.setServer(mqtt_server, mqtt_port); client.setCallback(MQTTcallback); |
اکنون ، ما از تابع connect (clientID) برای اتصال به کلاینت ESP8266 استفاده کرده ایم. در اینجا clientID باید منحصر به فرد باشد. اگر متصل است ، پیام “connected” را در سریال مانیتور نشان می دهد.
1 2 3 4 5 6 7 8 9 10 |
if (client.connect("ESP8266")) { Serial.println("connected"); } else { Serial.print("failed with state ") Serial.println(client.state()); delay(2000); } |
در مرحله بعد ،() client.subscribe ، یک تابع MQTT داخلی را فرا می خوانیم که برای subscribe در یک موضوع خاص استفاده می شود. برای این پروژه ، از “esp/test” به عنوان topic استفاده کرده ایم.
1 |
client.subscribe("esp/test"); |
اکنون ، تابع MQTTcallback فراخوانی می شود تا بررسی کند که آیا اطلاعات به روز شده در دسترس است یا خیر. در صورت وجود داده های جدید تابع داده های دریافتی را بررسی می کند. و پیامی را در سریال مانیتور با پیام اصلی و نام موضوع آن چاپ می کند.
در مرحله بعد ، ما پیامها را به یک رشته تبدیل می کنیم ، به طوری که می توان آن را با هم مقایسه کرد در این پروژه ، یک LED با استفاده از دستورات MQTT روشن یا خاموش می شود .
1 2 3 4 5 6 7 8 9 |
for (int i = 0; i < length; i++) { message = message + (char)payload[i]; } Serial.print(message); if (message == "on") { digitalWrite(LED, HIGH); } |
در این پروژه ، وضعیت یک دکمه چک می شود ، اگر دکمه فشار داده شود ، پیامی به عنوان “esp/test1” مطابق شکل زیر منتشر می شود.
1 2 3 4 5 6 |
if(digitalRead(D1)==0)) { client.publish("esp/test1", "Hello from ESP8266"); } else; client.loop(); |
تست MQTT با ESP8266 با استفاده از آردوینو:
برای آزمایش نهایی ، از برنامه Android استفاده می کنیم که قبلاً تنظیم کرده بودیم.
برنامه client MQTT را باز کنید و مطمئن شوید که تلفن همراه شما به اینترنت متصل است ما یک رشته “Hello from ESP8266“را از ماژول ESP ارسال می کنیم که در داخل برنامه Android منعکس می شود و یک نوتیفیکیشن دریافت می کنیم. در مرحله بعد ، یک رشته را از برنامه Android ارسال می کنیم که LED متصل به برد ESP8266 را روشن کند.
مرحله 1:
روی گزینه Saved MQTT در App ، که قبلاً ایجاد کردیم کلیک می کنیم.صفحه ای ظاهر می شود که در آن از شما خواسته می شود
” Subscribe to a Topic“. ما قبلاً موضوع را به عنوان “esp/test1” تعیین کردیم بنابراین ، در برنامه Android ، esp/test1” را می نویسیم. روی subscribe کلیک کنید ، با این کار صفحه ای مانند زیر به شما نشان داده می شود ، جایی که مانند عبارت”پیام دریافت نشده است” ازtopic نوشته شده .
اکنون ، روی کلیدی را که به nodeMCU متصل است فشار دهید. پیام“Hello from ESP8266”را روی گوشی می بینیم.
مرحله ی دوم موضوع را publish می کنیم.
روی up arrow در برنامه کلیک می کنیم و صفحه زیر باز میشود.
اکنون ، در قسمت ” topic “esp/test و در قسمت پیام ، “on” یا “off” را بنویسید تا LED به ترتیب روشن و خاموش شود. به عنوان مثال ، اگر “on” در topic پابلیش شود ، LED روشن می شود و اگر “off” در topic پابلیش شود ، LED خاموش می شود.
کد کامل آردوینو
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include <ESP8266WiFi.h> #include <PubSubClient.h> #define LED D0 const char* ssid = "admin"; const char* password = "12345678"; const char* mqtt_server = "mqtt.eclipse.org"; const int mqtt_port = 1883; WiFiClient espClient; PubSubClient client(espClient); void setup() { pinMode(LED, OUTPUT); pinMode(D1,INPUT_PULLUP); Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.print("Connected to WiFi :"); Serial.println(WiFi.SSID()); client.setServer(mqtt_server, mqtt_port); client.setCallback(MQTTcallback); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP8266")) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.println(client.state()); delay(2000); } } client.subscribe("esp/test"); } void MQTTcallback(char* topic, byte* payload, unsigned int length) { Serial.print("Message received in topic: "); Serial.println(topic); Serial.print("Message:"); String message; for (int i = 0; i < length; i++) { message = message + (char)payload[i]; } Serial.print(message); if (message == "on") { digitalWrite(LED, HIGH); } else if (message == "off") { digitalWrite(LED, LOW); } Serial.println(); Serial.println("-----------------------"); } void loop() { if(digitalRead(D1)==0) { client.publish("esp/test1", "Hello from ESP8266"); delay(1000); } else; client.loop(); } |
ارسال پاسخ