جستجو
برای جستجو متن مورد نظر وارد کنید و Enter بزنید برای بستن Esc بزنید.
یکی از پروتکل های محبوب دنیای اینترنت اشیا MQTT می باشد, سادگی و بهینه بودن این پروتکل برای دیوایس های امبدد ان را به یک پروتکل مهم و کاربردی در IOT تبدیل کرده است.اگر بخواهیم به زبان ساده MQTT را شرح دهیم می توان اینگونه تصور کرد یک واسط یا کارگزار بنام Broker به مجموعه ارتباطی خود اضافه کرده ایم تا وظایف از دوش node اصلی ما برداشته شود.در پروتکلهای سابق همانند RS485 , I2C , Can و … تبادل دیتا یا مستقیم بین node ها برقرار می شود یا یک master مدیریت ارتباطات را برعهده دارد ولی در MQTT یک Broker داریم که وظیفه ان اشتراک پیام ها بین node های مربوط به عضو یک Topic می باشد.فرض کنید یک سنسور رطوبت داریم که اطلاعات ان توسط میکروکنترلر کنار سنسور خوانده می شود و اطلاعات ان باید به دو یا چند برد ارسال شود تا ان بردها طبق ان کاری را انجام دهند.در روش سابق این میکروکنترلری که کنار دست سنسور است باید وظیفه ارسال اطلاعات به دیگر برد ها را بر عهده بگیرد و همچنین باید از قبل ادرس و تعداد بردهای نیازمند دیتا را نیز بداند ولی در MQTT کافی است که یک topic برای سنسور ما ایجاد شود و میکروکنترلر کنار دست سنسور کافی است که اطلاعات را در اختیار کارگزار قرار بدهد اصطلاحا عمل Publishرا انجام دهد.همچنین کافی است node ها در یک topic مثلا رطوبت (انتخاب نوع اسم topic اختیاری می باشد ولی بهتر است اسمی انتخاب شود که با نوع عملکرد topic همخوانی داشته باشد) عضو شوند اصطلاحا ان topic را subscribe نمایند.
با وجود Broker هر تعداد node ای که به اطلاعات ان topic نیاز داشته باشند کافی است فقط topic مورد نظر را subscribe کنند تا با هر publish از اطلاعات به ان دسترسی داشته باشند.
در تست ما از دو عدد ماژول ESP12 که از ای سی ESP8266 تشکیل شده است استفاده کرده ایم.اگر پکیج ESP8266 را در برنامه اردوینو ندارید ما در اموزش ‘راه اندازی نمایشگر TFT با چیپ کنترلی ILI9486 با ماژول ESP8266 ‘ نحوه نصب پکیج مربوطه را توضیح داده ایم.
ابتدا نیاز به دو کتابخانه برای پیاده سازی تست خود هستیم, از لینک زیر کتابخانه uMQTT Broker را دانلود نمایید:
https://github.com/martin-ger/uMQTTBroker

در کادر مشخص شده روی گزینه code کلیک کرده و گزینه download را انتخاب نمایید.
محتویات داخل فایل فشرده را در مسیر نصب پوشه کتابخانه های اردوینو خود کپی نمایید:

در همان صفحه دانلودی کتابخانه به قسمت انتهای ان مراجعه نمایید و روی لینک مشخص شده کلیک کنید:


در این صفحه نیز عمل دانلود فایل کتابخانه و کپی محتویات فایل دانلودی در محل نصب پوشه کتابخانه های اردوینو را تکرار نمایید.
دو پروژه اردوینو با تراشه انتخاب شده در شکل زیر ایجاد نمایید:

توضیحات برنامه بروکر :
#include <ESP8266WiFi.h>
#include "uMQTTBroker.h"
فراخوانی کتابخانه های مورد نیز برنامه
char ssid[] = "esp8266"; //your network SSID
char pass[] = "12345678"; //your network password
تعیین نام و پسورد سرور به دلخواه خود.در اینجا ماژول ESP ما باید در حالت ACCESS POINT قرار بگیرد.
class myMQTTBroker: public uMQTTBroker
{
ارث بری از کلاس پایه uMQTTBroker برای OVERRIDE کردن متدهای کلاس تا بتوانیم استفاده دلخواه خود را داشته باشیم و متدهای ان را با دستورات خود تکمیل نماییم.
public:
virtual bool onConnect(IPAddress addr, uint16_t client_count) {
این متد بعد از اتصال یک کلاینت به سرور ما اجرا می شود و ما ادرس IP ان را چاپ می کنیم.
Serial.println(addr.toString() + " connected");
return true;
}
virtual void onDisconnect(IPAddress addr, String client_id) {
Serial.println(addr.toString() + " (" + client_id + ") disconnected");
این متد در صورت قطع ارتباط یک کلاینت اجرا می شود.
}
virtual bool onAuth(String username, String password, String client_id) {
Serial.println("Username/Password/ClientId: " + username + "/" + password + "/" + client_id);
نمایش ID کلاینت متصل شده, شما می توانید مراحل تصدیق هویت را بصورت دلخواه و پیشرفته تر پیاده سازی نمایید.
return true;
}
virtual void onData(String topic, const char *data, uint32_t length) {
char data_str[length + 1];
os_memcpy(data_str, data, length);
data_str[length] = '\0';
در صورتی که اطلاعاتی PUBLISH شد بروکر ان را دریافت و توسط سریال پورت ان را نمایش می دهد.
Serial.println("received From client: '" + topic + "' with data '" + (String)data_str + "'");
}
};
myMQTTBroker myBroker;
ایجاد شئی از کلاس myMQTTBroker
void startWiFiAP()
{
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, pass);
Serial.println("AP started");
Serial.println("IP address: " + WiFi.softAPIP().toString());
تابع قرار دادن Esp در حالت اکسس پوینت
}
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println();
startWiFiAP();
// Start the broker
Serial.println("Starting MQTT broker");
myBroker.init();
راه اندازی بروکر
myBroker.subscribe("/broker/FromClient");
بروکر قرار است از topic ‘FromClient’ اطلاعاتی را دریافت کند بنابراین topic را subscribe می نماییم.
نکته : اسامی topic دلبخواه می باشد و عبارت /broker نیز اختیاری می باشد.شما می توانید موضوعات را طبق نیاز خود دسته بندی نمایید.
}
void loop()
{
myBroker.publish("/broker/FromServer" , "Hi client");
delay(3000);
انتشار اطلاعات توسط بروکر در topic ‘FromServer’
}
برنامه کلاینت:
#include <ESP8266WiFi.h>
#include <MQTT.h>
void myDataCb(String& topic, String& data);
void myPublishedCb();
void myDisconnectedCb();
void myConnectedCb();
اعلان اولیه توابع استفاده شده
#define CLIENT_ID "client3"
تعیین client id
#define TOPIC "/broker/FromServer"
تعیین مسیر و نام topic دریافتی توسط ما
// create MQTT
MQTT myMqtt(CLIENT_ID, "192.168.4.1", 1883);
ایجاد شئی از کلاس mqtt و تنظیم client id خود و همچنین ادرس ip و پورت سرور بروکر ما
const char* ssid = "esp8266";
const char* password = "12345678";
مشخص کردن نام و پسورد سرور برای اتصال به ان.
//
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println();
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());
نمایش ip خود.
Serial.println("Connecting to MQTT server");
// setup callbacks
myMqtt.onConnected(myConnectedCb);
myMqtt.onDisconnected(myDisconnectedCb);
myMqtt.onPublished(myPublishedCb);
myMqtt.onData(myDataCb);
تعیین توابع callback مربوطه که در صورت اجرای event مورد نظر باید اجرا شوند.
Serial.println("connect mqtt...");
myMqtt.connect();
برقرای ارتباط mqtt
Serial.println("subscribe to topic...");
myMqtt.subscribe(TOPIC);
subscribe کردن تاپیک بروکر
delay(10);
}
//
void loop() {
String topic("/broker/FromClient");
String str = "Hi Server ...";
boolean result = myMqtt.publish(topic, str);
delay(3000);
انتشار تاپیک خود هر 3 ثانیه.چون در سمت بروکر تاپیک FromClient را subscribe کردیم پیغام بالا را دریافت می نماییم.
}
/*
*
*/
void myConnectedCb()
{
Serial.println("connected to MQTT server");
این تابع در صورت اتصال به بروکر اجرا می شود.
}
void myDisconnectedCb()
{
در صورت قطع ارتباط با بروکر دوباره اتصال را برقرار می کنیم.
Serial.println("disconnected. try to reconnect...");
delay(500);
myMqtt.connect();
}
void myPublishedCb()
{
در صورت موفقیت در publish اطلاعات تابع مورد نظر اجرا می شود.
Serial.println("published.");
}
void myDataCb(String& topic, String& data)
{
در صورت دریافت, نوع topic و دیتای دیافتی را نمایش می دهیم.
Serial.print(topic);
Serial.print(": ");
Serial.println(data);
}
نتیجه کار را در ترمینال مشاهده می نمایید:

شما می توانید فایل برنامه و کتابخانه های مورد نیاز را دانلود نمایید: