Arduino ile MQTT Haberleşmesi
Merhaba ,
Bu yazımda maker kültürünün bir nevi çıkış noktasını oluşturan Arduino cihazlarımızı IoT ekosisteminin önemli bir parçasını oluşturan MQTT brokerına nasıl bağlayacağımızı anlatmaya çalışacağım.
MQTT Nedir ?
Message Queuing Telemetry Transport yani MQTT mesajın karşı tarafa gönderilmesi için kullanılan bir haberleşme protokoldür. Bu haberleşme trafiğini kontrol eden yöneticiye BROKER, mesaj yayınına PUBLISH ve bu mesaj yayınına abone olanlara SUBSCRIBE denmektedir. Aşağıdaki görselde bu kavramlar daha iyi anlaşılacaktır.
Gerekenler
- Arduino Uno
- Ethernet Shield
- 1 Adet Led
Öncelikle cloudMqtt sitesinden bir adet ücretsiz broker ediniyoruz. (5 Bağlantıya kadar ücretsiz)
Hesabımıza giriş yaptıktan sonra details sekmesine geçerek mqtt broker bilgilerimizi alıyoruz.
Devre şeması oldukça basit , bu uygulamamızda arduinonun 4 numaralı pinine bağlı olan ledi mqtt aracılığı ile açıp kapatacağız.
Sonrasında ise arduinomuza aşağıdaki kodu yüklüyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#include <Ethernet.h> #include <SPI.h> #include <PubSubClient.h> #define ARDUINO_CLIENT_ID "arduino_1" #define SUB_LED "arduino_1/led" byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; IPAddress arduino_ipaddress(192, 168, 1, 105); IPAddress mqttserver_ip(54, 75, 8, 165); EthernetClient ethClient; PubSubClient client(ethClient); long previousMillis; void setup() { Serial.begin(115200); pinMode(4, OUTPUT); client.setmqttserver_ip(mqttserver_ip, 16095); client.setCallback(callback); Ethernet.begin(mac, arduino_ipaddress); delay(1500); } void loop() { if (!client.connected()) reconnect(); client.loop(); } void reconnect() { while (!client.connected()) { Serial.print("Attempting MQTT connection ... "); if (client.connect(ARDUINO_CLIENT_ID,"MQTT_USER","MQTT_PASSWORD")) { Serial.println("connected"); client.subscribe(SUB_LED); } else { Serial.print("Connection failed, state: "); Serial.print(client.state()); Serial.println(", retrying in 5 seconds"); delay(5000); } } } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("[sub: "); Serial.print(topic); Serial.print("] "); char message[length + 1] = ""; for (int i = 0; i < length; i++) message[i] = (char)payload[i]; message[length] = '\0'; Serial.println(message); if (strcmp(topic, SUB_LED) == 0) { Serial.println("strcmp1"); if (strcmp(message, "on") == 0) { Serial.println("strcmp2"); digitalWrite(4, HIGH); } if (strcmp(message, "off") == 0) { Serial.println("strcmp3"); digitalWrite(4, LOW); } } } |
Arduinomuza MQTT mesajlarını alıp göndermek için Android tarafında MQTT Dashboard isimli uygulamayı kuralım. Bu uygulamayı kullanmamızın sebebi 0 kodlama ile bize ui oluşturma imkanı vermesi.
Uygulamayı açtıktan sonra bir tane mqtt connection yaratıyoruz.
Bağlatıyı oluşturduktan sonra ilgili bağlantıyı seçerek devam ediyoruz.
Yukarıda Publish yazan sekmeye geçiş yapıyoruz. Ve Sağ üstteki + işaretine tıklıyoruz.
Bize eklemek istediğimiz komponenti soruyor. Biz bu denememizde switch komponentini kullanacağız.
Seçim yaptıktan sonra bize komponentin özelliklerini soruyor. Arduino MQTT’de arduino_1/led topic’ine subscribe oluyor(dinliyor) ve gelen mesaj on ise led’i yakıyor , off ise söndürüyor. İlgili alanları bu kurala göre dolduruyoruz.
Son olarak ekranımız bu şekile geliyor.
Herşey hazırsa test edebiliriz. Telefonumuzun ekranında on/off switchinin durumunu değiştirdiğimiz zaman ledimizin yanıp söndüğünü ve serial monitorde mesajların görüntülendiğini görmeliyiz.
Arduino serial monitor kullanarak on/off mesajlarını görüntüleyebiliriz. Bir sonraki yazımda sıcaklık sensörü verilerini kullanarak mqtt aracılığı ile grafik çizmeyi anlatacağım.
Mot ile aynı anda kaç adet ardunio izlemesi yapılabiliyor?
Ümit Selamlar ,
MQTT kullanarak topicleri ayırırsan , her arduino içine özel bir seri numarası koyduğumuzu düşünelim.
umitArduino1
umitArduino2
umitArduinoN
şeklinde. Ve mqtt’ye yolladığın datanın payload’ında yahut topic’inde bu seri numarasını kullanırsan istediğin kadar arduino cihazını takip etmen mümkün olacaktır.