آموزش اینترنت اشیاآموزش رزبری پای

آموزش نصب MQTT روی رزبری پای برای اینترنت اشیا

سلام. آموزش نصب MQTT روی رزبری پای برای اینترنت اشیا را آماده کردیم.

MQTT پروتکلی است که برای ارسال و دریافت پیام از طریق اینترنت استفاده می شود. در این آموزش با MQTT و اصطلاحات مرتبط با آن آشنا می شویم. در اینجا ما از Raspberry Pi به عنوان کارگزار محلی MQTT استفاده خواهیم کرد و از طریق برنامه داشبورد MQTT یک LED متصل به NodeMCU ESP12E را کنترل می کنیم. یک سنسور DHT11 نیز به NodeMCU متصل شده است ، بنابراین ما با استفاده از رزبری پای به عنوان کارگزار محلی MQTT ، می توانیم دما و رطوبت را در داشبورد MQTT مشاهده کنیم.

فیلم عملکرد راه اندازی MQTT در رزبری پای برای پروژه های اینترنت اشیا در زیر آورده شده است و به شما در درک نحوه کار این کارگزار کمک میکند.

MQTT چیست؟

MQTT مخفف عبارت Message Queue Telemetry Transport است که توسط IBM طراحی شده است. این پروتکل ساده و سبک است که برای ارسال و دریافت پیام از طریق اینترنت استفاده می شود و برای دستگاه هایی که دارای پهنای باند کم هستند طراحی شده است. امروزه این پروتکل اغلب در دستگاه های IoT برای ارسال و دریافت داده های سنسور ها مورد استفاده قرار می گیرد. همچنین ، در سیستم های اتوماسیون خانگی مبتنی بر اینترنت اشیا، این پروتکل به راحتی و بدون استفاده از داده های اینترنتی قابل استفاده است.

جهت کسب اطلاعات بیشتر، مقاله MQTT چیست را بخوانید.

اصطلاحات معدودی وجود دارد که اغلب در MQTT استفاده می شود :

  1. Subscribe and Publish
  2. Message
  3. Topic
  4. Broker

Subscribe and Publish: اشتراک Subscribe به معنای دریافت داده ها از دستگاه دیگر و انتشار Publish وسیله ای برای ارسال داده به دستگاه دیگر است.

هنگامی که دستگاه اول داده ها را دستگاه دوم میفرستد، دستگاه اول Publisher یا ناشر است و دستگاه دوم Subscriber یا مشترک.

MQTT چیست؟

Message: پیام ها اطلاعاتی هستند که ما ارسال و دریافت می کنیم. این می تواند یک داده یا هر نوع فرمان باشد. به عنوان مثال ، اگر ما داده های دما را به اینترنت منتشر کنیم ، این داده های دما به عنوان پیام شناخته می شوند.

Topic: این روشی است که شما علاقه خود را برای پیام های دریافتی ثبت می کنید یا اینکه چگونه مکان را برای انتشار پیام مشخص می کنید. Topics مانند رشته هایی که بخش های مختلف آن با یک اسلش جدا شده اند نمایش داده میشود.

MQTT Broker: این مسئول دریافت کلیه پیام ها از ناشران ، فیلتر کردن پیام ها و سپس انتشار پیام ها به مشترکین علاقمند به آنها است.

آموزش نصب MQTT روی رزبری پای

وقتی این کارگزار (broker) روی سرور ابری میزبانی می شود ، آن را ابر MQTT می نامند. بسیاری از سرویس های مبتنی بر ابر MQTT مانند Adafruit IO ، MQTT.IO ، IBM bluemix ، Microsoft Azure و … وجود دارند.

ما می توانیم کارگزار MQTT خودمان را با استفاده از Raspberry Pi درست کنیم. این کارگزار محلی MQTT است یعنی شما می توانید داده ها را در شبکه محلی خود ارسال و دریافت کنید. بنابراین در اینجا کارگزار Mosquitto MQTT را در رزبری پای نصب خواهیم کرد تا آن را به یک کارگزار محلی MQTT تبدیل کنیم و داده های دما را از NodeMCU به برنامه داشبورد MQTT ارسال کنیم. همچنین ، ما LED متصل به NodeMCU را کنترل خواهیم کرد.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

نصب کارگزار Mosquitto MQTT در رزبری پای

در Raspberry pi ترمینال را باز کنید و دستورات زیر را برای نصب کارگزار تایپ کنید.

sudo apt update
sudo apt install -y mosquitto mosquitto-clients

صبر کنید تا نصب تمام شود. حال ، برای شروع کارگزار هنگام راه اندازی raspberry pi ، دستور زیر را تایپ کنید.

sudo systemctl enable mosquitto.service

همین بود ! برای بررسی موفق بودن نصب آن ، دستور زیر را وارد کنید.

mosquitto -v

این دستور نسخه کارگزار MQTT  را به شما نشان می دهد. باید 1.4.x یا بالاتر باشد.

تست کارگزار Mosquitto در Raspberry Pi

1. کارگزار Mosquitto را با استفاده از دستور زیر در پس زمینه اجرا کنید

mosquitto -d

2. ما با استفاده از دستور زیر موضوع نمونه ای (exampleTopic) را در Topic مشترک می کنیم.

mosquitto_sub -d -t exampleTopic

3. ما پیامی را به عنوان exampleTopic منتشر خواهیم کرد.

mosquitto_pub -d -t exampleTopic -m "Hello world!"

با این دستور شما پیام Hello World را در ترمینال دریافت خواهید کرد.

اکنون زمان آن رسیده است که داده های دستگاه دیگری را کنترل کنیم و در اینجا ما از برنامه داشبورد MQTT و NodeMCU استفاده می کنیم.

ابتدا با ارسال فرمان با استفاده از برنامه ، یک LED را کنترل می کنیم تا در این حالت NodeMCU به عنوان مشترک و برنامه به عنوان ناشر رفتار کند.
سپس ESP12E با سنسور DHT11 متصل به آن دما را حس میکند و مقدار را به برنامه Mobile MQTT ارسال میکند که در این حالت موبایل مشترک خواهد بود و NodeMCU ناشر. برای ارسال این پیام ها از کارگزار Mosquitto MQTT استفاده میشود.

مدار پروژه استفاده از MQTT در Raspberry Pi

مدار را مطابق شکل تصویر زیر متصل کنید. در اینجا از DHT11 برای خواندن دما استفاده می شود اما از سنسور دما LM35 نیز می توان استفاده کرد. قبلاً در بسیاری از پروژه های خود از جمله برای ساخت ایستگاه هواشناسی از حسگر DHT11 استفاده کرده ایم. پروژه مانیتورینگ دما، رطوبت و فشار در اینترنت (IoT) با رزبری پای

قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

مدار پروژه استفاده از MQTT در Raspberry Pi

بیایید نوشتن کد برای NodeMCU را برای اشتراک و انتشار داده ها شروع کنیم.

توضیحات کد راه اندازی MQTT در رزبری پای

در اینجا از کتابخانه Adafruit MQTT استفاده خواهیم کرد و موارد مورد نیاز را در کد تغییر خواهیم داد. با استفاده از همین کد ، می توانید فقط با تغییر چند مورد ، انتشار و اشتراک داده ها در Adafruit IO cloud انجام دهید.

نضب کتابخانه Adafruit MQTT

به Sketch -> Include Library -> Manage Libraries بروید و Adafruit MQTT را جستجو کنید و آن را نصب کنید. بعد از نصب كتابخانه به examples -> Adafruit mqtt library -> mqtt_esp8266 بروید.

آموزش استفاده از کد برنامه MQTT در ESP12

سپس این کد را مطابق آدرس IP رزبری پای و Wi-Fi خود ویرایش کنید.

کد کامل در انتهای صفحه قرار داده شده است در اینجا بعضی از قسمت های کد را بررسی میکنیم.

ابتدا کتابخانه های ESP8266WIFI و Adafruit MQTT و سنسور DHT11 را فراخوانی میکنیم.

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "DHT.h"

سپس SSID و رمز عبور Wi-Fi خود را تعریف کنید ، از این طریق می توانید ESP-12e خود را به وای فای وصل کنید. اطمینان حاصل کنید که رزبری پای و NodeMCU با یک شبکه wifi ارتباط برقرار کنند.

#define WLAN_SSID       "xxxxxxxx"
#define WLAN_PASS       "xxxxxxxxxxx"

در این بخش سرور Adafruit را تعریف می کنیم، یعنی آی پی Raspberry pi و پورت آن.

#define AIO_SERVER      "آدرس آیپی رزبری پای شما"
#define AIO_SERVERPORT  1883    

در زیر فیلد ها خالی خواهند ماند زیرا ما از ابر Adafruit استفاده نمی کنیم.

#define AIO_USERNAME    ""
#define AIO_KEY         "" 

سپس یک کلاس ESP8266 WiFiClient ایجاد میکنیم تا به سرور MQTT متصل شود.

WiFiClient client;

با وارد کردن سرویس گیرنده WiFi و سرور MQTT و ورود به سیستم کلاس مشتری MQTT را تنظیم میکنیم.

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

برای ارسال دما ، فید به نام Temperature تنظیم میکنیم.

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");

در عملکرد setup ، ما پین NodeMCU را که می خواهید از آن خروجی دریافت کنید را اعلام می کنیم. سپس NodeMCU را به Wi-Fi وصل میکنیم.

void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(LED, OUTPUT);
  Serial.println(F("Adafruit MQTT demo"));
  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
….
….

Setup MQTT subscription for led feed.
  mqtt.subscribe(&led1);
}

در عملکرد Loop ، اطمینان حاصل خواهیم کرد که اتصال به سرور MQTT با استفاده از تابع MQTT_connect انجام شده است.

void loop() {
  MQTT_connect();

اکنون ، فید “LED” مشترک میشویم و رشته را از کارگزار MQTT دریافت میکنیم و با استفاده از atoi () این رشته را به عدد تبدیل میکنیم؛ این عدد را با استفاده از تابع digitalWrite () به پین ​​LED ارجاع میدهیم.

Adafruit_MQTT_Subscribe *subscription;

  while ((subscription = mqtt.readSubscription(20000))) {
    if (subscription == &led1) {
      Serial.print(F("Got: "));
      Serial.println((char *)led1.lastread);
      int led1_State = atoi((char *)led1.lastread);
      digitalWrite(LED, led1_State);
    } 

اکنون دما را در یک متغیر بدست می آوریم و این مقدار را با استفاده از عملکرد Temperature.publish(t) منتشر کنید.

float t = dht.readTemperature();

..

  if (! Temperature.publish(t)) {
    Serial.println(F("Failed"));
  } else {
    Serial.println(F("OK!"));
  }

کد را در برد NodeMCU بارگذاری کنید و برنامه داشبورد MQTT را که در تلفن هوشمند بارگیری کرده اید باز کنید.

کد کامل ساخت دماسنج IoT با MQTT

کد کامل این پروژه در باکس زیر قرار داده شده است.

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "DHT.h"
#define LED            D5
#define DHTPIN            D4
#define WLAN_SSID       "awesome"
#define WLAN_PASS       "awesome12"
#define AIO_SERVER      "192.168.43.177"        //IP address of RPi
#define AIO_SERVERPORT  1883                 
#define AIO_USERNAME    ""
#define AIO_KEY         ""
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/led");
#define DHTTYPE           DHT11     // DHT 11 
DHT dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
void MQTT_connect();
void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(LED, OUTPUT);
  Serial.println(F("Adafruit MQTT demo"));
  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());
  
  //Setting up DHT sensor
  dht.begin();
  // Setup MQTT subscription for onoff feed.
  mqtt.subscribe(&led1);
 
}
uint32_t x = 0;
void loop() {
  // Ensure the connection to the MQTT server is alive (this will make the first
  // connection and automatically reconnect when disconnected).  See the MQTT_connect
  // function definition further below.
  MQTT_connect();
  // this is our 'wait for incoming subscription packets' busy subloop
  // try to spend your time here
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(20000))) {
    if (subscription == &led1) {
      Serial.print(F("Got: "));
      Serial.println((char *)led1.lastread);
      int led1_State = atoi((char *)led1.lastread);
      digitalWrite(LED, led1_State);
      Serial.println("onnn");
    }   
  }
  float t = dht.readTemperature();
  if (isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  if (! Temperature.publish(t)) {
    Serial.println(F("Failed"));
  } else {
    Serial.println(F("OK!"));
  }
}
  void MQTT_connect() {
  int8_t ret;
  if (mqtt.connected()) {
    return;
  }
  Serial.print("Connecting to MQTT... ");
  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) { 
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000); 
    retries--;
    if (retries == 0) {
      // basically die and wait for WDT to reset me
      while (1);
    }
  }
  Serial.println("MQTT Connected!");
}

همچنین می توانید Raspberry Pi GPIO را با استفاده از ابر های MQTT مانند Adafruit IO ، MQTT.IO و …، از دیگر نقاط جهان کنترل کنید اما این بحث باشد برای آموزش های بعد.

4.3 (6 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

1 دیدگاه

  1. سلام
    بجز رزبری پای چه ماژولهای دیگری رو میشه بعنوان بروکر معرفی کرد ؟
    باید این ماژولها دارای چه قابلیتی باشند ؟ صرف داشتن mqtt براشون کفایت میکنه که بتوان بعنوان بروکر معرفی و راه اندازی بشوند ؟

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *