پلتفرم فارسی اینترنت اشیاء

کتابخانه MQTT برای Arduino

 

دانلود کتابخانه PUBSUB Client MQTT

برای نصب کتابخانه محتوای فایل زیپ را در فولدر Library کپی کنید و کامپایلر آردینو را ببنید و مجدد باز کنید.

این کتابخانه برای اتصال به سرور های MQTT نوشته شده است، دارای Client  می باشد که توانایی برقراری ارتباط به سرور را با آدرس و پورت مورد نظر با نام و رمز کاربری مشخص را دارد.

این کتابخانه سازگاری ارتباط با سرور را بوسیله سخت افزار های زیر را دارد و قابل کامپایل می باشد :

  • Arduino Ethernet
  • Arduino Ethernet Shield
  • Arduino YUN – use the included YunClient in place of EthernetClient, and be sure to do a Bridge.begin() first
  • Arduino WiFi Shield – if you want to send packets > 90 bytes with this shield, enable the MQTT_MAX_TRANSFER_SIZE define in PubSubClient.h.
  • Sparkfun WiFly Shield
  • TI CC3000 WiFi
  • Intel Galileo/Edison
  • ESP8266
  • ESP32

جهت بر قراری با اینترنت نیاز به تعریف یک TcpClient یا  EhternetClient  را دارد. بهترین اینترفیس برای کار با این کتابخانه استفاده از ESP32/8266//8285 می باشد.

تشریح کتابخانه mqtt

برای تعریف کتابخانه از PubSubClien  استفاده نمایید، همزمان با تعریف کلاینت mqtt در ابن مرحله کلاینت اینترفیس مورد نظر را وارد نمایید به شکل زیر :

//Define Client mqtt pubsub
PubSubClient  mqttclient(tclpclient);

در این قسمت کلاینت mqttclient معرف کلاینت mqtt برای ادامه کار با کتابخانه و ادامه بقیه تعریف می باشد.

توابع Client :

//تعریف آدرس و پورت سرور
mqttclient.setServer(mqtt_server, 1883);

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

//تعریف تابع اجرایی هنگام دریافت پیام از کاناال ایجاد شده
mqttclient client.setCallback(callback);

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

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]));
  }
{

برای اتصال به سرور بایستی از تایع connect  به شکل زیر استفاده کنید :

mqttclient .connect(const char* id, const char* user, const char* pass);
//id : رشته حرفی برای ای-دی کانکشن را مشخص می کند
//User :  نام کاربری 
//Pass : رمز عبور

برای چک کردن اینکه انصال با سرور برقرار شده است از دستور زیر استفاده کنید :

client.connected()

اگه این مقدار برگشتی این تابع False باشد یعنی اتصال برقرر نمی باشد .

برای اینکه اتصال ایجاد شده به سرور روی یک تاپیک مد نظر ایجاد و پیام ها دریافت شوند بایستی سابسکرایب شود کانال :

//Subscrieb or start listen to a Topic
Mqttclient. Subscribe(“topic-address”);

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

  Mqttclient publish(const char* topic, const char* payload);
//topic : آدرس کانال یا تاپیک
//Payload :  متن پیام برای ارسال

بعد از اتصال اگر نیاز به قطع اتصال باشد از تابع زیر استفاده نمایید :

Mqttclient.disconnect();

 در مثال زیر یک نمونه از کد نویسی روی ESP8266 را در محیط کامپایلر Arduino  مشاهده می کنید :

/*
 Basic ESP8266 MQTT example
 This sketch demonstrates the capabilities of the pubsub library in combination
 with the ESP8266 board/library.
 It connects to an MQTT server then:
  - publishes "hello world" to the topic "outTopic" every two seconds
  - subscribes to the topic "inTopic", printing out any messages
    it receives. NB - it assumes the received payloads are strings not binary
  - If the first character of the topic "inTopic" is an 1, switch ON the ESP Led,
    else switch it off
 It will reconnect to the server if the connection is lost using a blocking
 reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to
 achieve the same result without blocking the main loop.
 To install the ESP8266 board, (using Arduino 1.6.4+):
  - Add the following 3rd party board manager under "File -> Preferences -> Additional Boards Manager URLs":
       http://arduino.esp8266.com/stable/package_esp8266com_index.json
  - Open the "Tools -> Board -> Board Manager" and click install for the ESP8266"
  - Select your ESP8266 in "Tools -> Board"
*/

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.

const char* ssid = "........";
const char* password = "........";
const char* mqtt_server = "broker.mqtt-dashboard.com";

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE	(50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

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

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {

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

  unsigned long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    ++value;
    snprintf (msg, MSG_BUFFER_SIZE, "hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("outTopic", msg);
  }
}

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

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