در این پست به استفاده از پروتکل MQTT در ESP8266 می پردازیم. خب اول از همه باید کمی در مورد MQTT صحبت کنیم.
MQTT
MQTT یک پروتکل ارتباطی ماشین با ماشین است. یک روش ایده آل در پلتفرمهای IOT برای ارتباط بین دستگاهها میباشد.در این مطلب یک برنامهی ساده برای اتصال یک ESP8266 با بروکر MQTT را مورد بررسی قرار میدهیم. بروکرها معمولا پولی هستند یا اینکه شما باید سروری تهیه کنید و بروکر خود را روی آن راه اندازی کنید. ولی در اینجا ما از یک بروکر رایگان استفاده می کنیم.
MQTT چیست؟
MQTT یک سیستم برای انتشار و دنبال کردن یک پیغام است. به این صورت که یک دستگاه می تواند پیغامی را از طریق بروکر منتشر کند. و یک یا چند دستگاه دیگر به آن پیغام گوش دهند. آن پیغام میتواند یک فرمان برای انجام کاری باشد. یا انتشار وضعیت خوانده شده از یک سنسور باشد.
MQTT Client: دستگاهی است که روی آن کتابخانهی MQTT نصب شده و می تواند به MQTT broker متصل شود. چه انتشار دهندهی پیغام و چه دنبال کنندهی آن، هر دو کلاینت محسوب میشوند.
MQTT Broker: بروکر تمام پیغام ها را دریافت می کند. و تعیین میکند که کدام کلاینت دنبال کنندهی کدام پیغام است. و پیغام را برای آن کلاینت میفرستد.
کد برنامه:
من در این برنامه از ESP8266 سری یک استفاده کرده ام.
برای راه اندازی ماژول به این مطلب مراجعه کنید.
در ادامه خط به خط برنامه را دنبال می کنیم.
#include <ESP8266WiFi.h> #include <PubSubClient.h>
اول از همه باید کتابخانه های لازم را صدا بزنیم. اولین کتابخانه ای است که برای استفاده از ESP8266 لازم است. دومین کتابخانه هم برای استفاده از MQTT مورد نیاز میباشد.
const char* ssid = "?????"; const char* password = "????????"; const char* mqtt_server = "mqtt.eclipse.org";
در این قسمت SSID و پسورد مودم خود را وارد کنید. چون برای استفاده از MQTT باید به اینترنت متصل باشیم.
در ادامه هم اسم سروری که بروکر ما روی آن نصب است را مینویسیم. ما از این بروکر رایگان استفاده کردهایم.
WiFiClient espClient; PubSubClient MQTTclient(espClient);
در این قسمت اول یک آبجکت از وایفای درست می کنیم و بعد آن را به عنوان ورودی به آبجکتی که از کتابخانهی MQTT ایجاد میکنیم، میدهیم.
void setup() { Serial.begin(115200); setup_wifi(); MQTTclient.setServer(mqtt_server, 1883); MQTTclient.setCallback(callback); }
این قسمت فانکشن SETUP ما در برنامه است.
اول ارتباط سریال را راه اندازی میکنیم. در ادامه تابعی که برای اتصال به مودم نوشته ایم را صدا می زنیم. در آخر هم دو دستور برای راه اندازی MQTT را می نویسیم.
خط اول میگه که با چه سروری و با چه پورتی ارتباط برقرار کند. در خط دوم هم تابعی که برای گرفتن پیغام ها نوشته ایم را می دهیم. تا تمام پیغام ها را به این تابع بفرستد.
void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); }
این تابع برای وصل شدن به مودم است
void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); }
این تابع قرار است که هرچی پیغام دریافت می کنیم را بررسی و نشان بدهد. شما می توانید این پیغام را در یک متغیر ذخیره کنید. و با استفاده از آن کارهای تعیین شده را انجام دهید. کلا هرچی دستور و فرمان می خواهید انجام بدهید باید در این قسمت انجام بدهید.
void reconnect() { // Loop until we're reconnected while (!MQTTclient.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (MQTTclient.connect("esp8266")) { Serial.println("connected"); // Once connected, publish an announcement... delay(500); MQTTclient.publish("/eleknow.com/sobhanTemp", "hello world"); // ... and resubscribe MQTTclient.subscribe("/eleknow.com/sobhanTemp"); } else { Serial.print("failed, rc="); Serial.print(MQTTclient.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void loop() { if (!MQTTclient.connected()) { reconnect(); } MQTTclient.loop(); }
این قسمت یک تابع برای اتصال به MQTT نوشته ایم. که در قسمت لوپ اتصال چک می شود و هر وقت اتصال قطع بود این تابع صدا زده میشود.
این تابع به این پیچیدگی ای که می بینید نیست و فقط سه خط آن مهم و مورد نیاز است.
MQTTclient.connect("esp8266") MQTTclient.publish("/eleknow.com/sobhanTemp", "hello world"); MQTTclient.subscribe("/eleknow.com/sobhanTemp");
خط اول که دستور اتصال است که یک نام دلخواه هم داخل آن قرار می دهیم. اگر چند دستگاه قرار است به یک بروکر متصل شوند این نام نباید تکراری باشد.
چیزی که در اینجا مهم است این می باشد، که پیغام های ما تحت یک عنوان انتشار می یابد. و ما به یک عنوان گوش می دهیم.
این دو خط تعیین می کنند که ماژول ما تحت چه عنوانی پیغام ارسال کند. و به چه Topic گوش بدهد.
اگر برنامهی شما بزرگ است و قرار است لحظهای کارهایی انجام بدهد بهتر است از delay استفاده نکنید. می توانید این قسمت را به این صورت با تابع ()millis هم بنویسید.
if (!MQTTclient.connected() && millis() % 5000 == 0) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (MQTTclient.connect("esp8266")) { Serial.println("connected"); // Once connected, publish an announcement... delay(500); MQTTclient.publish("/eleknow.com/sobhanTemp", "hello world"); // ... and resubscribe MQTTclient.subscribe("/eleknow.com/sobhanTemp"); } else { Serial.print("failed, rc="); Serial.println(MQTTclient.state()); } } MQTTclient.loop();
این قسمت داخل لوپ برنامهی خود قرار دهید. به این صورت دیگر برنامهی شما در وقفه گیر نمی کنید.
برای آشنایی بیشتر با این کتابخانه به این صفحه مراجعه کنید.
امیدوارم این مطلب کمکی به علاقه مندان به اینترنت اشیاء کرده باشد. بحث MQTT مفصل است و باید بیشتر مطالعه کنید.
دیدگاه ها :