Bu rehberde, dış internet bağlantısına veya üçüncü taraf bulut sunucularına bağımlı olmadan kendi yerel ağınızda (Local Network) nasıl bir MQTT mimarisi kuracağınızı iki farklı senaryo ile inceliyoruz.

Endüstriyel ve ev otomasyonu projelerinde en çok tercih edilen yöntemdir. Bilgisayarınıza veya Raspberry Pi'ye yükleyeceğiniz Mosquitto MQTT Broker, merkez sunucu görevi görür.
mosquitto.conf dosyasına şu iki satırı ekleyerek dış cihaz bağlantılarına izin verin:
listener 1883 allow_anonymous true
192.168.1.50).// NodeMCU Local MQTT Client Kodu
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "WIFI_ADINIZ";
const char* password = "WIFI_SIFRENIZ";
// Kendi bilgisayarınızın / Raspberry Pi'nizin Yerel IP Adresi
const char* mqtt_server = "192.168.1.50";
const int mqtt_port = 1883;
const char* topic_pub = "ev/salon/sicaklik";
const char* topic_sub = "ev/salon/isik";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n[Wi-Fi Bağlandı]");
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (unsigned int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.printf("Gelen Mesaj [%s]: %s\n", topic, message.c_str());
if (String(topic) == topic_sub) {
if (message == "1") digitalWrite(D4, LOW); // LED AÇ
if (message == "0") digitalWrite(D4, HIGH); // LED KAPAT
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Local MQTT Sunucusuna Bağlanılıyor...");
String clientId = "NodeMCU-Client-" + String(ESP.getChipId(), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" [BAĞLANDI]");
client.subscribe(topic_sub);
} else {
Serial.printf(" [HATA] State: %d - 5sn sonra tekrar deneniyor...\n", client.state());
delay(5000);
}
}
}
void setup() {
pinMode(D4, OUTPUT);
digitalWrite(D4, HIGH);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
}
Ortamda bir bilgisayar veya Raspberry Pi yoksa, uMQTTBroker kütüphanesini kullanarak birinci NodeMCU'yu harici bir MQTT Sunucusuna dönüştürebilirsiniz. İkinci NodeMCU (veya telefonunuz) bu karta istemci (client) olarak bağlanabilir.
// NodeMCU - Donanımsal MQTT Broker (Server) Kodu
#include <ESP8266WiFi.h>
#include <uMQTTBroker.h>
const char* ssid = "WIFI_ADINIZ";
const char* password = "WIFI_SIFRENIZ";
// uMQTTBroker Sınıfından Türetme
class MyBroker : public uMQTTBroker {
public:
virtual bool onConnect(IPAddress addr, uint16_t client_count) {
Serial.printf("İstemci Bağlandı: %s | Toplam İstemci: %d\n", addr.toString().c_str(), client_count);
return true; // Bağlantıya izin ver
}
virtual void onData(String topic, String data) {
Serial.printf("Broker Üzerinden Geçen Veri -> Topic: %s | Data: %s\n", topic.c_str(), data.c_str());
}
};
MyBroker myBroker;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n==================================");
Serial.println("[MQTT SERVER / BROKER AKTİF]");
Serial.print("Server IP Adresi: ");
Serial.println(WiFi.localIP());
Serial.println("Port: 1883");
Serial.println("==================================");
// Broker'ı 1883 Portunda Başlat
myBroker.init(1883);
}
void loop() {
// Broker arka planda çalışır, loop içinde ekstra işlem gerekmez.
}
Ağdaki ikinci NodeMCU'ya aşağıdaki kodu yüklersiniz. Tek yapmanız gereken mqtt_server değişkenine, Server olan NodeMCU'nun IP adresini yazmaktır:
// NodeMCU - MQTT Client Kodu (Broker NodeMCU'ya Bağlanır)
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "WIFI_ADINIZ";
const char* password = "WIFI_SIFRENIZ";
// SERVER Olan NodeMCU'nun IP Adresi (Seri Port Ekranından Öğrenebilirsiniz)
const char* mqtt_server = "192.168.1.105";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastSend = 0;
int counter = 0;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println("\nClient Wi-Fi Bağlandı!");
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) {
if (client.connect("NodeMCU_Client_Device")) {
Serial.println("NodeMCU Broker Server'a Bağlandı!");
} else {
delay(2000);
return;
}
}
client.loop();
// Her 3 saniyede bir Broker NodeMCU'ya veri gönder
if (millis() - lastSend > 3000) {
lastSend = millis();
counter++;
String payload = "{\"sayac\":" + String(counter) + "}";
client.publish("nodemcu/veri", payload.c_str());
Serial.println("Veri Gönderildi: " + payload);
}
}
| Kriter | Seçenek A (Mosquitto PC/Pi) | Seçenek B (NodeMCU Server) |
|---|---|---|
| Kapasite / Performans | Yüksek (Binlerce cihaz bağlayabilirsiniz) | Sınırlı (RAM yetersizliğinden max 4-8 cihaz) |
| Donanım Gereksinimi | Ek bir PC / Raspberry Pi şarttır | Sadece 2 adet NodeMCU kartı yeterlidir |
| Kullanım Alanı | Geniş Ev Otomasyonu, Endüstriyel Takip | Küçük DIY Projeler, Saha Uygulamaları |
Henüz yorum yapılmamış. İlk yorumu siz yapın!