Arduino ile MQTT Bağlantısı

MQTT hakkında diğer yazımıza başlayalım.

Öncelikle ufaktan bir tekrar yapıp hatırlayalım.

MQTT (Messaging Queue Telemetry Transport) bir mesaj kuyruklama ve iletme protokolüdür. Özellikle IBM tarafından sağlam bir şekilde desteklenip, geliştirilmektedir. Hatta WebSphere MQ adında sunucular üretip satmaktadır. Yakın geleceğin teknolojisi machine to machine olacağı için şimdiden bakmakta fayda vardır.

Evet, önce ki yazımızda MQTT kurulumunu ve command prompt ile mesaj yayınlayıp almıştık. Şimde ise Arduino cihazımızla MQTT serverımıza bağlanıp hem mesaj yayınlayacağız hem de mesaj alacağız. Yalnız elinizde ağa veya internete bağlanabileceğiniz bir ethernet veya wifii kart olmalı. Bende ethernet olduğu için ethernet kart üzerinden anlatacağım.

Arduino’nun MQTT ile iletişim kurması için knolleary arkadaşımızın yazıp yayınladığı bir kütüphane bulunmaktadır. Aşağıda linki bulabilirsiniz. Öncelikle bu kütüphaneyi indiriyoruz.

http://knolleary.net/arduino-client-for-mqtt/

Sonrasında Arduino IDE’mizi açıp Skecth > Import Library > Add Library diyerek indirdiğimiz dosyanın dizinini belirtiyoruz. Ufak bir hatırlatma; direk kodların veya example’ların bulunduğu dizinin path’ini veriyoruz. Örn: “C:\Users\Gani\Desktop\DHT11” bu dizin direk example veya cpp uzantıları bulunan dosyaları göstermektedir.

Şimdi gelelim MQTT serverımıza bağlanmaya.
Öncelikle kütüphanelerimizi import edelim ve gerekli değişkenlerimizi vs create edelim.

#include <SPI.h>
#include <PubSubClient.h>
#include <Ethernet.h>
#define MQTT_SERVER "localhost"
#define MQTT_PORT 1883
// MAC Address of Arduino Ethernet Sheild (on sticker on shield)
byte MAC_ADDRESS[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x31, 0xB8 };
PubSubClient client(MQTT_SERVER, MQTT_PORT, callback_method);
void setup()
{
  // init serial link for debugging
  Serial.begin(9600);
  
  if (Ethernet.begin(MAC_ADDRESS) == 0)
  {
      Serial.println("Failed to configure Ethernet using DHCP");
      return;
  }
  delay(500);
  Serial.println("Connecting...");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print(".");
  }
}
void loop()
{
  if (!client.connected())
  {
    //İlk açılışta bağlantı ayarları.
    //Client ID: MQTT'ye bağlanılacak olan isimdir. Benzersiz olmalıdır.
    //Username ve Password: MQTT'de authentication kullanıyorsanız gereklidir. Zaten girmeniz gereken bilgiler MQTT'de oluşturduğunuz kullanıcıdır.
    client.connect(MQTT_CLIENTID, MQTT_USERNAME, MQTT_PASSWORD);
    Serial.println("Server to connected.");
    // Publish Topic: Arduino'nun mesaj yayınlayacağı başlık.
    // Message: İlgili başlığa yayınlacağı mesajın içeriği.
    client.publish(MQTT_PUBLISHTOPIC, MQTT_MESSAGE);
    // Subscribe Topic: Arduino'nun mesaj alımlarında dinleyeceği başlık grubudur.
    // Publish ve Subscribe aynı olursa gönderdiği mesajı aynı zamanda kendi de alabilir.
    client.subscribe(MQTT_SUBSCRIBETOPIC);
  }
}
// mesajı alacak olan metodumuz
void callback_method(char* topic, byte* payload, unsigned int length) {
  int i = 0;
  
  // alınan mesajın son hanesi her zaman boş olmalıdır. son karaktere boş bir alan ekliyoruz. (string)
  for(i=0; i<length; i++) {
    message_buff[i] = payload[i];
  }
  message_buff[i] = '\0'; // son karakter
  
  String msgString = String(message_buff);
  
  Serial.println("Payload: " + msgString);
}

Buraya kadar gerçekleştirdiyseniz, gerekli bilgileri yerli yerine girdiyseniz cihaz direkmen çalışacaktır.
Açıklamakta fayda var; Arduino bir mesaj aldığında callback_method’una düşecektir ve Serial.println ile mesajı ekrana yazacaktır.

Ek bilgi olarak MQTT’ye internet üzerinden tüm diller ile ulaşabilirsiniz. Mesela şu anda geliştirdiğim bir projede arduino, asp.net mvc, android, ios ve winform hep bir arada çalışmakta.

Bir sonraki yazılarımızda görüşmek üzere.

Exception’sız günler.

4,142 total views, 22 views today

No Comments

Leave a Comment

Ulaşım için:Facebook: /ganigani Twitter: @abdulgani_demir


*

%d blogcu bunu beğendi: