آموزش‌های کاربردیاینترنت اشیاء (IOT)بایگانی مطالبپروژه‌های ESP32

تبادل داده بین دو ماژول ESP32 توسط پروتکل MQTT و مانیتور داده ها در نرم افزار Node-Red

در این مقاله تبادل داده ها بین دو ماژول ESP32 توسط پروتکل MQTT و مانیتور داده ها در نرم افزار Node-Red را بصورت کامل و مرحله به مرحله انجام خواهیم داد. تا انتهای مقاله همراه ما باشید.

مقدمه

جهت ارسال و دریافت داده بین ماژول­ های ESP می­ توان از پروتکل ESP-NOW استفاده کرد که به صورت مستقیم اطلاعات را بین دو بورد رد و بدل می کند. اما اگر بخواهیم دو یا چند بورد ESP دارای ارتباط غیرمستقیم باشند، می­ توان از برخی پروتکل­ های دیگر استفاده کرد که MQTT یکی از بهترین پروتکل­ های موجود در دنیای IoT می ­باشد.

شروع کار با ESP NOW

در واقع MQTT به عنوان واسط اطلاعات را از فرستنده یا Publisher دریافت می­ کند و متناسب با تاپیک انتخاب شده به هر چند گیرنده یا مشترک (Receiver) که نیاز باشد ارسال می ­کند. بنابراین نیازی به ارتباط مستقیم بین بوردها نمی­ باشد.

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


توضیح مختصری از مراحل این پروژه

گام اول در راه اندازی این پروژه نصب بروکر mosquitto در سرور (سیستم عامل لینوکس بر روی بورد رزبری پای ) جهت راه اندازی پروتکل MQTT است. در مرحله بعد کد فرستنده را بر روی ESP32 فرستنده و کد گیرنده را بر روی ESP گیرنده آپلود می­ کنیم. سپس شماتیک ارتباطی را در نرم افزار Node-Red طراحی می­ کنیم و در نهایت می­ توان دیتاهای ارسالی از ESP32 فرستنده را در سریال مانیتور ESP32 گیرنده و همچنین نرم افزار Node-Red مشاهده کرد.


پروتکل MQTT

در این­جا ما از رزبری پای به عنوان سروری که قرار است بروکر روی آن نصب شود استفاده می­ کنیم. پیش از انجام پروژه اگر با پروتکل MQTT آشنایی ندارید حتما مقاله معرفی پروتکل MQTT را مطالعه کنید.
در این پروژه با استفاده از یک بورد بر پایه تراشه ESP32 ارتباط با پروتکل MQTT به سمت سرور برقرار شده است، سپس از سمت سرور با پروتکل MQTT دیتا به سمت بورد رزبری پای که نرم افزار اینترنت اشیاء Node-Red روی آن نصب شده است و ESP32 گیرنده ارسال می‌شود. این ارتباط بین رزبری پای و بورد ESP32 به صورت دو طرفه با سرور برقرار می‌شود. تا کنون broker های متفاوتی برای این پروتکل نوشته شده است که در این پروژه از بروکر Mosquitto  که بر پایه زبان C نوشته شده است، استفاده می­ شود.

بروکر MQTT

پیش از شروع پروژه باید به چند نکته توجه کنیم:

  • در ابتدا نیار به یک سرور Ubunto یا Raspbian با یک کاربر غیر روت و دسترسی Sudo و فایروال اولیه است.

  • یک نام دامنه که به سرور شما اشاره کند.

  • پورت 1883 باید در سرور شما بدون استفاده باشد.

نصب بروکر Mosquitto

در حقیقت از فایروال جهت باز کردن پورت­ های مورد نیاز استفاده می­ شود. فایروال ufw به صورت پیش فرض بر روی اکثر نسخه های لینوکس نصب است اما اگر نصب نبود به صورت زیر نصب می ­شود:

ابتدا منابع نرم افزاری را آپدیت کنید:

sudo apt-get update
sudo apt-get upgrade

با این دستور فایروال را نصب کنید:

Sudo apt-get install ufw –y

با دستورات زیر وضعیت فایروال را می ­توان بررسی کرد و آن را فعال کرد:

Sudo ufw enable
   Firewall is active and enabled on system startup
--------------------------------------------------------------
sudo ufw status
   active
--------------------------------------------------------------
sudo ufw status verbose

دستور زیر به پورت 1883 اجازه شنیدن می­ دهد:

sudo ufw allow 1883

پس از باز کردن پورت مورد نظر توسط فایروال، بروکر را طبق دستورات زیر در لینوکس نصب می کنیم.

ابتدا منابع نرم افزاری را آپدیت می­ کنیم تا اگر نسخه جدیدی از MQTT موجود باشد لینوکس متوجه آن شود:

sudo apt-get update
sudo apt-get upgrade

دستورات زیر جهت دانلود پکیج ­های مربوطه و نصب Mosquitto می­ باشد:

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
wget http://repo.mosquitto.org/debian/mosquitto-stretch.list
sudo apt-get update
sudo apt-get install mosquito
sudo apt-get install mosquitto-clients

با دستورات زیر بروکر را فعال کرده و وضعیت آن را مشاهده می­ کنید:

mosquitto –d
   run on background
--------------------------------------------------------------
sudo systemctl start mosquitto
sudo systemctl enable mosquitto
sudo systemctl status mosquitto

پس از طی مراحل بالا یک فایل پسورد می‌سازیم که Mosquitto بتواند از آن جهت تائید ارتباطات استفاده کند. برای این کار از دستور mosquitto_passwd استفاده کنید. توجه داشته باشید که باید نام کاربری خود را جایگزین کنید:

sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username

سپس فایل پیکربندی را با دستور sudo nano /etc/mosquitto/mosquitto.conf باز و آن را به صورت زیر ویرایش کنید. خط include_dir /etc/mosquitto/conf.d را حذف کرده و عبارت زیر را جایگزین کنید:

log_type all
allow_anonymous true
password_file /etc/osquito/pwfile
listener 1883


شروع پروژه

پس از نصب و راه اندازی بروکر نوبت به نوشتن کد در Arduino IDE و آپلود آن روی ESP32 فرستنده می­ شود. البته قبل از آن کتابخانه ­های لازم را در IDE دانلود می­ کنیم. در اینجا کتابخانه های مورد نیاز <PubSubClient.h> و <WiFi.h> هستند که از قسمت کتابخانه در سربرگ Sketch قابل دانلود و نصب هستند. همچنین توجه شود که از قبل پکیج های ESP32 را نصب کرده باشید و ماژول مناسب را از سربرگ tool انتخاب کرده باشید. پس از نوشتن کد آن را سیو کرده و بر روی بورد ESP32 آپلود می­ کنیم.


ارسال اطلاعات به سرور

یک نمونه کد ارسال دیتا و خروجی آن به صورت زیر می باشد. در کد آورده شده در قسمت یوزرنیم و پسورد MQTT اگر در تنظیمات بروکر آن را تنظیم کرده باشیم وارد می­ کنیم و در قسمت تنظیمات وای فای، یوزرنیم و پسورد وای فایی که به آن متصل هستیم را وارد می­ کنیم. در قسمت تنظیمات سرور هم آی پی wlan0 سرور که بروکر روی آن نصب شده است را وارد می کنیم.

به طور مثال در این جا بروکر بر روی سیستم عامل لینوکس نصب شده است و از بورد رزبری به عنوان سرور استفاده می شود. از طرفی بورد ESP32 از طریق وای فای داخلی دیتا را منتقل می کند، بنابراین در سیستم عامل هم از طریق وای فای اطلاعات تبادل می شود. درنتیجه آی پی مورد نظر آی پی شبکه وای فای سرور خواهد بود. پورت 1883 که مخصوص بروکر هست را وارد می ­کنیم. این برنامه آی پی برد ESP32 را جهت اتصال به  Node-Red چاپ می­ کند و خروجی کد به این صورت است که هر 1 ثانیه 2 شماره به متغیر i اضافه کرده و چاپ کند.

تاپیک را با عنوان test می­ شناسیم و در تنظیمات Node-Red و کد گیرنده هم آن را وارد می­ کنیم تا پیام به درستی به مقصد ارسال و شناخته شود.

#include <WiFi.h>
#include <PubSubClient.h>

int  i;
WiFiClient espClient;
PubSubClient client(espClient);

const char* mqtt_username = "your username"; // MQTT username
const char* mqtt_password = "your password"; // MQTT password

void reconnectmqttserver() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
 clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}

char msgmqtt[50];
void callback(char* topic, byte* payload, unsigned int length) {
  String MQTT_DATA = "";
  for (int i=0;i<length;i++) {
   MQTT_DATA += (char)payload[i];}

}
void setup()
{
  i = 0;
Serial.begin(115200);
  WiFi.disconnect();
  delay(3000);
  Serial.println("START");
   WiFi.begin("your username","your password");
  while ((!(WiFi.status() == WL_CONNECTED))){
    delay(300);
    Serial.print("00");
  }

  Serial.println("Connected");
  Serial.println("Your IP is");
  Serial.println((WiFi.localIP().toString()));
  client.setServer("172.30.224.145", 1883);
  client.setCallback(callback);
}

void loop()
{
    if (!client.connected()) {
    reconnectmqttserver();
    }
    client.loop();
    snprintf (msgmqtt, 50, "%d ",i);
    client.publish("test", msgmqtt);
    i = i + 2;
    delay(1000);
     Serial.println("Your IP is");
  Serial.println((WiFi.localIP().toString()));
}

دریافت اطلاعات از سرور

در سمت دیگر قرار است داده­ ها توسط ESP32 دوم دریافت شوند. بنابراین کد گیرنده را در IDE آپلود می کنیم. آی پی سرور و شماره پورت و همچنین تاپیک را همانند کد فرستنده وارد می کنیم. به اینصورت داده دریافتی در سریال مانیتور ESP32 دریافت کننده نمایش داده می شود. درحقیقت وظیفه بروکر دریافت اطلاعات از فرستنده و ارسال آن برای دیگر دستگاه ها است. همچنین از طریق اسم تاپیک، داده­ ها به درستی به مقصد مورد نظر ارسال می­ شوند چون از اسم تاپیک مشترک برای فرستنده و دریافت کننده استفاده می­ شود.

#include <WiFi.h>
#include <PubSubClient.h>

char*  i;
WiFiClient espClient;
PubSubClient client(espClient);

const char* mqtt_username = "your username"; // MQTT username
const char* mqtt_password = "your password"; // MQTT password

void reconnectmqttserver() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
 clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
  client.subscribe("test");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}

void callback(char* topic, byte* payload, unsigned int length) {
  String MQTT_DATA = "";
  for (int i=0;i<length;i++) {
   MQTT_DATA += (char)payload[i];}
  Serial.print(MQTT_DATA);

}
void setup()
{
  i = "";
Serial.begin(115200);
  WiFi.disconnect();
  delay(3000);
  Serial.println("START");
  WiFi.begin("your username","your password");
  while ((!(WiFi.status() == WL_CONNECTED))){
    delay(400);
    Serial.print("00");

  }
  Serial.println("Connected");
  Serial.println("Your IP is");
  Serial.println((WiFi.localIP().toString()));
 client.setServer("172.30.224.145", 1883);
  client.setCallback(callback);

}


void loop()
{

    if (!client.connected()) {
    reconnectmqttserver();
    }
    client.loop();

}

خروجی کد در سریال مانیتور دو ESP به صورت شکل زیر می­باشد:

ارسال و دریافت اطلاعات بروکر MQTT


نرم افزار Node-Red

حال می ­خواهیم خروجی کد را در نرم افزار Node-Red مانیتور و کنترل کنیم. بنابراین در محیط خط فرمان لینوکس با دسترسی روت، node-red را باز   می کنیم. اگر نود MQTT نصب نیست ابتدا آن را نصب کرده و بلوک­ ها را به صورت زیر می­ گذاریم.

کنترل دستگاه های هوشنمند منزل با تلفن همراه

در اینجا نیاز به یک بلوک MQTT و یک بلوک debug داریم. تنظیمات بلوک­ ها به صورت زیر می ­باشد:
در بلوک MQTT در قسمت آی پی، آی پی سرور که همان آی پی wlan0 هست را وارد کرده زیرا دیتا از این سرور به عنوان واسط گرفته می­ شود و تاپیک هم با عنوان test نوشته شده است. در حقیقت این روش بر پایه آی پی و پورت عمل می ­کند. همچنین در Node-Red می توان بوسیله ابزار داشبورد تمام رخدادها را کنترل و مانیتور کرد که امری مهم در پروژه های IoT است و در مقاله های آینده به آن خواهیم پرداخت.

نرم افزار Node-Red

نرم افزار Node-Red


سخن آخر 

شما می توانید با خلاقیت خود از این آموزش استفاده و همچنین کدهای متنوع با خروجی های متفاوت را آپلود کنید. اهمیت این آموزش در پروژه های IoT به وضوح مشخص است. زمانی که به عنوان مثال در یک گلخانه داده های محیطی توسط سنسورهای موجود جمع آوری شده و از طریق یک بورد ESP32 که سنسورها بر روی آن نصب هستند به Node-Red جهت کنترل و مانیتور و به ESP32 دیگر جهت پردازش و یا فعال کردن عملگرها (Actuators) ارسال می شود، اهمیت وجود پروتکل ها و ارتباط بین دستگاه ها روشن می شود.


این مقاله چطور بود ؟
+1
111
+1
97
+1
7
مشاهده بیشتر

پریسا اکبری

کارشناس برق- قدرت و کارشناس ارشد کنترل. علاقه مند به سیستم های هوشمند و اینترنت اشیا. به مدت بیش از 1 سال است که در تیم سخت افزار سازان نام آور مشغول به فعالیت هستم.

نوشته های مشابه

دیدگاهتان را بنویسید

دکمه بازگشت به بالا