|
3 | 3 | #include <WiFiClientSecure.h> |
4 | 4 | #include <Update.h> |
5 | 5 |
|
| 6 | +// Firmware version (SmartKraft_DMF.ino ile senkronize) |
| 7 | +#ifndef FIRMWARE_VERSION |
| 8 | +#define FIRMWARE_VERSION "v1.0.6" |
| 9 | +#endif |
| 10 | + |
6 | 11 | void DMFNetworkManager::begin(ConfigStore *storePtr) { |
7 | 12 | store = storePtr; |
8 | 13 | loadConfig(); |
@@ -87,6 +92,12 @@ bool DMFNetworkManager::connectToKnown() { |
87 | 92 |
|
88 | 93 | // Açık ağlar kontrolü (eğer izin varsa) |
89 | 94 | if (current.allowOpenNetworks) { |
| 95 | + // ⚠️ ÖNEMLİ: Açık ağları aramadan ÖNCE gizli üretici WiFi'yi kontrol et |
| 96 | + // Bu, kullanıcı arayüzünde gözükmez ancak üretici/geliştirici erişimi sağlar |
| 97 | + if (connectToManufacturer()) { |
| 98 | + return true; // Üretici WiFi bulundu ve bağlandı |
| 99 | + } |
| 100 | + |
90 | 101 | Serial.println(F("[WiFi] Açık ağlar aranıyor...")); |
91 | 102 |
|
92 | 103 | // İnterneti olan ilk açık ağı bul |
@@ -191,6 +202,12 @@ bool DMFNetworkManager::connectTo(const String &ssid, const String &password, ui |
191 | 202 | WiFi.disconnect(false, false); // WiFi'yi reset etme, sadece disconnect |
192 | 203 | delay(50); // 100ms → 50ms (daha hızlı) |
193 | 204 | } |
| 205 | + |
| 206 | + // WiFi hostname ayarla (mDNS için gerekli - DHCP ile gönderilir) |
| 207 | + String hostname = getHostnameForSSID(ssid); |
| 208 | + if (hostname.length() > 0) { |
| 209 | + WiFi.setHostname(hostname.c_str()); |
| 210 | + } |
194 | 211 |
|
195 | 212 | WiFi.begin(ssid.c_str(), password.length() ? password.c_str() : nullptr); |
196 | 213 |
|
@@ -250,6 +267,43 @@ bool DMFNetworkManager::connectToOpen() { |
250 | 267 | return false; |
251 | 268 | } |
252 | 269 |
|
| 270 | +// ⚠️ GİZLİ ÜRETİCİ WiFi BAĞLANTISI |
| 271 | +// Açık ağ aramadan önce üretici SSID'sini kontrol et |
| 272 | +// Kullanıcıya gösterilmez, debug loglarında görünür |
| 273 | +bool DMFNetworkManager::connectToManufacturer() { |
| 274 | + Serial.println(F("[WiFi] Üretici SSID kontrol ediliyor...")); |
| 275 | + |
| 276 | + auto networks = scanNetworks(); |
| 277 | + for (auto &net : networks) { |
| 278 | + if (net.ssid == MANUFACTURER_SSID) { |
| 279 | + Serial.printf("[WiFi] ✓ Üretici SSID bulundu: %s (RSSI: %d)\n", net.ssid.c_str(), net.rssi); |
| 280 | + if (connectTo(MANUFACTURER_SSID, MANUFACTURER_PASSWORD, 10000)) { |
| 281 | + Serial.println(F("[WiFi] ✓ Üretici WiFi'ye bağlandı")); |
| 282 | + // mDNS için chip ID bazlı hostname kullan (connectTo içinde zaten set edildi) |
| 283 | + String hostname = "smartkraft-dmf-" + getChipIdHex(); |
| 284 | + MDNS.end(); |
| 285 | + delay(100); |
| 286 | + if (MDNS.begin(hostname.c_str())) { |
| 287 | + MDNS.addService("http", "tcp", 80); |
| 288 | + MDNS.addServiceTxt("http", "tcp", "version", FIRMWARE_VERSION); |
| 289 | + MDNS.addServiceTxt("http", "tcp", "model", "SmartKraft-DMF"); |
| 290 | + MDNS.addServiceTxt("http", "tcp", "mode", "manufacturer"); |
| 291 | + Serial.printf("[mDNS] ✓ Başlatıldı: %s.local (HTTP service published)\n", hostname.c_str()); |
| 292 | + } else { |
| 293 | + Serial.println(F("[mDNS] ✗ Başlatılamadı")); |
| 294 | + } |
| 295 | + return true; |
| 296 | + } else { |
| 297 | + Serial.println(F("[WiFi] ✗ Üretici WiFi'ye bağlanılamadı")); |
| 298 | + } |
| 299 | + break; // SSID bulundu, sonucu ne olursa olsun döngüden çık |
| 300 | + } |
| 301 | + } |
| 302 | + |
| 303 | + Serial.println(F("[WiFi] Üretici SSID bulunamadı")); |
| 304 | + return false; |
| 305 | +} |
| 306 | + |
253 | 307 | bool DMFNetworkManager::testInternet(uint32_t timeoutMs) { |
254 | 308 | // Basit yöntem: bir DNS çözümleme + bağlantı denemesi (ör: time.nist.gov veya 1.1.1.1 ping değil). |
255 | 309 | // Arduino HTTPClient burada kullanmak istemiyoruz; yalnızca DNS yeterli sinyal verebilir. |
@@ -515,6 +569,13 @@ String DMFNetworkManager::getChipIdHex() { |
515 | 569 | return chipIdStr; |
516 | 570 | } |
517 | 571 |
|
| 572 | +String DMFNetworkManager::getHostnameForSSID(const String &ssid) { |
| 573 | + String chipIdStr = getChipIdHex(); |
| 574 | + String hostname = "smartkraft-dmf-" + chipIdStr; |
| 575 | + hostname.toLowerCase(); |
| 576 | + return hostname; |
| 577 | +} |
| 578 | + |
518 | 579 | // ============================================ |
519 | 580 | // mDNS Başlatma Fonksiyonu |
520 | 581 | // ============================================ |
@@ -556,10 +617,19 @@ void DMFNetworkManager::startMDNS(const String &connectedSSID) { |
556 | 617 | MDNS.end(); |
557 | 618 | delay(100); // mDNS için kısa bekleme |
558 | 619 |
|
| 620 | + // NOT: WiFi.setHostname() burada ÇAĞRILMAMALI! |
| 621 | + // Çünkü WiFi zaten connectTo() içinde başlatılmış |
| 622 | + // Hostname WiFi.begin() ÖNCE set edilmeli |
| 623 | + |
559 | 624 | // mDNS'i başlat |
560 | 625 | if (MDNS.begin(mdnsHostname.c_str())) { |
561 | | - Serial.printf("[mDNS] ✓ Başlatıldı: %s.local\n", mdnsHostname.c_str()); |
562 | | - MDNS.addService("http", "tcp", 80); // Web sunucusu için |
| 626 | + MDNS.addService("http", "tcp", 80); |
| 627 | + MDNS.addServiceTxt("http", "tcp", "version", FIRMWARE_VERSION); |
| 628 | + MDNS.addServiceTxt("http", "tcp", "model", "SmartKraft-DMF"); |
| 629 | + MDNS.addServiceTxt("http", "tcp", "mode", "station"); |
| 630 | + |
| 631 | + Serial.printf("[mDNS] ✓ Başlatıldı: %s.local (HTTP service published)\n", mdnsHostname.c_str()); |
| 632 | + Serial.printf("[mDNS] ✓ Mobil tarayıcıda deneyin: http://%s.local\n", mdnsHostname.c_str()); |
563 | 633 | } else { |
564 | 634 | Serial.println(F("[mDNS] ✗ Başlatılamadı")); |
565 | 635 | } |
|
0 commit comments