Bu ESP32 IoT eğitimi sizi kutusundan yeni çıkmış bir karttan; sıcaklık ve nem yayımlayan, uzaktan komut kabul eden ve bulutla TLS üzerinden konuşan buluta bağlı bir sensöre götürür. Arduino IDE'yi kuracak, Wi-Fi'a bağlanacak, bir DHT22 okuyacak, ücretsiz bir public broker'a MQTT üzerinden yayın yapacak ve ardından aynı sketch'i gerçek kullanım için özel ve şifreli bir broker'a taşıyacaksınız.
ESP32 Neden Varsayılan IoT Mikrodenetleyicisi?
Espressif'in ESP32 ailesi, hızlı çift çekirdekli (veya varyanta göre tek çekirdekli RISC-V) bir işlemciyi, yerleşik Wi-Fi ve Bluetooth'u, bol GPIO'yu, analog girişleri ve TLS için donanım desteğini birkaç dolarlık bir modülde birleştirir. Arduino kodu, MicroPython ve Espressif'in kendi ESP-IDF framework'ünü çalıştırır ve devasa bir topluluğa sahiptir. Bağlantılı bir sensör, bir röle kontrolcüsü veya küçük bir gateway geliştiren herkes için genellikle denenecek ilk karttır.
Bu eğitimde geliştireceğiniz şeyler:
- Wi-Fi ağınıza katılan ve otomatik olarak yeniden bağlanan bir kart.
- MQTT üzerinden her on saniyede bir JSON okumalar yayımlayan bir DHT22 sensörü.
- Bir komut topic'ine
ONveyaOFFyayımlayarak açılıp kapanan, uzaktan kontrollü bir LED. - MQTT'nin Last Will özelliğini kullanan bir çevrimiçi/çevrimdışı durum topic'i.
- Özel kimlik bilgileriyle 8883 portunda TLS kullanan güvenli bir sürüm.
İhtiyacınız Olanlar
| Malzeme | Notlar |
|---|---|
| ESP32 geliştirme kartı | USB'li herhangi bir ESP32 DevKit, ESP32-S3 veya ESP32-C3 kartı çalışır |
| DHT22 (AM2302) sensörü | Dahili pull-up direnci olan bir breakout modülü en kolayıdır |
| Jumper kablolar ve breadboard | Sensör için üç kablo |
| USB kablosu | Yalnızca şarj kablosu değil, veri kablosu olmalıdır |
| Arduino IDE 2.x yüklü bilgisayar | Windows, macOS veya Linux |
| Mosquitto komut satırı client'ları | Test için mosquitto_pub ve mosquitto_sub |
Henüz sensörünüz yok mu? Sketch bir hata bildirir ve çalışmaya devam eder; böylece MQTT ve LED kısımlarını yine de takip edebilirsiniz.
Adım 1: Arduino IDE'yi ESP32 İçin Kurun
- Arduino IDE 2.x'i Arduino web sitesinden kurun.
- Tools, Board, Boards Manager menüsünü açın, esp32 aratın ve esp32 by Espressif Systems paketini kurun. Görünmezse File, Preferences, Additional boards manager URLs altına
https://espressif.github.io/arduino-esp32/package_esp32_index.jsonekleyin ve tekrar aratın. Resmî Arduino-ESP32 kurulum rehberi her platform için ekran görüntüleri içerir. - Tools, Manage Libraries menüsünü açın ve Nick O'Leary'nin PubSubClient kütüphanesini ve Adafruit'in DHT sensor library kütüphanesini kurun (Adafruit Unified Sensor'ı da kurma önerisini kabul edin).
- Kartı takın, modelinizi Tools, Board altından seçin (genel bir DevKit için ESP32 Dev Module'ü seçin) ve seri portu Tools, Port altından seçin.
Devam etmeden önce araç zincirini bir blink sketch'i ile test edin:
#define LED_PIN 2 // çoğu ESP32 DevKit kartında dahili LED
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);
}
Yükleme "Connecting..." aşamasında takılırsa, yükleme başlayana kadar karttaki BOOT düğmesini basılı tutun. Hiç port görünmüyorsa kartınızın çipi için USB-seri sürücüsünü (genellikle CP210x veya CH340) kurun veya başka bir kablo deneyin. Bazı kartlarda GPIO 2'de LED yoktur; bu durumda 220 ohm'luk bir dirençle GPIO 2'ye bir LED bağlayın.
Adım 2: DHT22 Sensörünü Bağlayın
DHT22 modülünü şu şekilde bağlayın:
| DHT22 pini | ESP32 pini |
|---|---|
| VCC (+) | 3V3 |
| DATA (out) | GPIO 4 |
| GND (-) | GND |
Modül yerine çıplak dört pinli bir sensör kullanıyorsanız DATA ile 3V3 arasına 10 kiloohm'luk bir pull-up direnci ekleyin ve üçüncü pini boş bırakın. Klasik ESP32 modüllerinde flash bellek için ayrılmış olan GPIO 6 ile 11 arasındaki pinlerden ve sensörler için GPIO 0, 2, 12 ve 15 gibi strapping pinlerinden kaçının. DHT22 iki saniyede birden daha sık okunmamalıdır.
Adım 3: MQTT Parçalarını Anlayın
MQTT bir publish/subscribe protokolüdür. ESP32'niz veriyi belirli bir sunucu uygulamasına göndermez; mesajları bir broker üzerindeki topic'lere yayımlar ve bu topic'lere abone olan her client onları alır. Tüm arka planı öğrenmek isterseniz önce bir MQTT broker'ın ne yaptığını okuyun.
Bu ESP32 IoT eğitiminde broker.connectmq.com adresindeki ücretsiz public MQTT broker'ı kullanıyoruz. Her client benzersiz, boş olmayan bir client ID kullandığı sürece 1883 portunda anonim bağlantıları kabul eder. Public alanda yayımlanan her şeyi herkes okuyabilir; bu yüzden asla parola veya kişisel veri göndermeyin ve mesajlarınızın başkalarınınkiyle çakışmaması için benzersiz bir topic öneki kullanın. Public alan mesaj başına 64 KB, client başına saniyede 10 mesaj ve 10 aboneliğe izin verir; bu, bir sensörün ihtiyacından çok daha fazladır.
Topic'lerimiz (k3v9 yerine kendi rastgele dizenizi yazın):
connectmq/demo/esp32-k3v9/telemetry JSON readings, published every 10 s
connectmq/demo/esp32-k3v9/status "online" / "offline" (retained, Last Will)
connectmq/demo/esp32-k3v9/led/set commands: ON or OFF
connectmq/demo/esp32-k3v9/led/state current LED state (retained)
Adım 4: Eksiksiz ESP32 IoT Sketch'i
Yeni bir sketch oluşturun, aşağıdaki kodu yapıştırın ve Wi-Fi adınızı, parolanızı ve topic önekinizi ayarlayın.
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// ---------- yapılandırma ----------
const char* WIFI_SSID = "YOUR_WIFI_SSID";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
const char* MQTT_HOST = "broker.connectmq.com";
const uint16_t MQTT_PORT = 1883;
const char* TOPIC_PREFIX = "connectmq/demo/esp32-k3v9"; // k3v9'u kendi dizenizle değiştirin
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define LED_PIN 2
const unsigned long PUBLISH_INTERVAL_MS = 10000;
// -----------------------------------
DHT dht(DHT_PIN, DHT_TYPE);
WiFiClient net;
PubSubClient mqtt(net);
String clientId;
String topicTelemetry, topicStatus, topicLedSet, topicLedState;
unsigned long lastPublish = 0;
unsigned long lastReconnectAttempt = 0;
void connectWiFi() {
if (WiFi.status() == WL_CONNECTED) return;
Serial.printf("Connecting to Wi-Fi %s", WIFI_SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED && millis() - start < 20000) {
delay(500);
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED) {
Serial.printf("\nWi-Fi connected, IP %s\n", WiFi.localIP().toString().c_str());
} else {
Serial.println("\nWi-Fi connection failed, will retry");
}
}
void setLed(bool on) {
digitalWrite(LED_PIN, on ? HIGH : LOW);
mqtt.publish(topicLedState.c_str(), on ? "ON" : "OFF", true); // retained durum
}
void onMessage(char* topic, byte* payload, unsigned int length) {
String message;
for (unsigned int i = 0; i < length; i++) message += (char)payload[i];
message.trim();
Serial.printf("Received [%s] %s\n", topic, message.c_str());
if (topicLedSet == topic) {
if (message == "ON") setLed(true);
else if (message == "OFF") setLed(false);
}
}
bool connectMqtt() {
Serial.printf("Connecting to MQTT %s:%u as %s\n", MQTT_HOST, MQTT_PORT, clientId.c_str());
// Last Will: ortadan kaybolursak broker "offline" (retained) yayımlar
bool ok = mqtt.connect(clientId.c_str(), topicStatus.c_str(), 1, true, "offline");
if (ok) {
Serial.println("MQTT connected");
mqtt.publish(topicStatus.c_str(), "online", true);
mqtt.subscribe(topicLedSet.c_str(), 1);
} else {
Serial.printf("MQTT connect failed, state=%d\n", mqtt.state());
}
return ok;
}
void publishReading() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("DHT22 read failed, check wiring");
mqtt.publish(topicTelemetry.c_str(), "{\"error\":\"sensor_read_failed\"}");
return;
}
char payload[128];
snprintf(payload, sizeof(payload),
"{\"temperature\":%.2f,\"humidity\":%.1f,\"rssi\":%d,\"uptime\":%lu}",
temperature, humidity, WiFi.RSSI(), millis() / 1000);
mqtt.publish(topicTelemetry.c_str(), payload);
Serial.printf("Published %s\n", payload);
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
dht.begin();
// Çipin MAC adresinden türetilen benzersiz client ID
uint64_t mac = ESP.getEfuseMac();
char id[32];
snprintf(id, sizeof(id), "esp32-%04X%08X", (uint16_t)(mac >> 32), (uint32_t)mac);
clientId = id;
topicTelemetry = String(TOPIC_PREFIX) + "/telemetry";
topicStatus = String(TOPIC_PREFIX) + "/status";
topicLedSet = String(TOPIC_PREFIX) + "/led/set";
topicLedState = String(TOPIC_PREFIX) + "/led/state";
connectWiFi();
mqtt.setServer(MQTT_HOST, MQTT_PORT);
mqtt.setCallback(onMessage);
mqtt.setKeepAlive(30);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
connectWiFi();
return;
}
if (!mqtt.connected()) {
unsigned long now = millis();
if (now - lastReconnectAttempt > 5000) { // her 5 saniyede bloklamayan yeniden deneme
lastReconnectAttempt = now;
if (connectMqtt()) lastReconnectAttempt = 0;
}
return;
}
mqtt.loop();
if (millis() - lastPublish >= PUBLISH_INTERVAL_MS) {
lastPublish = millis();
publishReading();
}
}
Sketch'i yükleyin ve Serial Monitor'ü 115200 baud'da açın. Wi-Fi bağlantısını, MQTT bağlantısını ve her on saniyede bir yayımlanan bir okumayı görmelisiniz.
Sketch nasıl yapılandırılmış?
- Bloklamayan yeniden bağlanmalar. Döngü asla sıkı bir yeniden deneme döngüsünde beklemez. Wi-Fi veya MQTT koparsa kodun geri kalanı yanıt vermeye devam ederken birkaç saniyede bir yeniden dener. Uzun bloklayan döngüler watchdog reset'lerinin yaygın bir kaynağıdır; ESP32 MQTT yeniden bağlanma rehberi daha sağlam stratejileri açıklar.
- Last Will ve retained durum. Broker
onlinedeğerini retained durum olarak saklar ve kart düzgün bir bağlantı kesme olmadan gücünü veya bağlantısını kaybederse onu otomatik olarakofflineile değiştirir. - Retained LED durumu. Daha sonra abone olan her dashboard LED'in açık olup olmadığını hemen öğrenir.
- Küçük payload'lar. PubSubClient'ın varsayılan paket tamponu 256 bayttır ve bu payload ona rahatça sığar. Daha büyük JSON belgeleri için, PubSubClient tampon boyutu yazısında anlatıldığı gibi bağlanmadan önce
mqtt.setBufferSize(1024)çağırın.
Adım 5: Bilgisayarınızdan Test Edin
Kartınızın yayımladığı her şeyi izleyin:
mosquitto_sub -h broker.connectmq.com -p 1883 -i laptop-k3v9-sub -t "connectmq/demo/esp32-k3v9/#" -v
Retained status ve led/state mesajlarını hemen, ardından her on saniyede bir telemetriyi görmelisiniz:
connectmq/demo/esp32-k3v9/status online
connectmq/demo/esp32-k3v9/telemetry {"temperature":23.40,"humidity":48.2,"rssi":-58,"uptime":42}
Şimdi ikinci bir terminalden LED'i açıp kapatın:
mosquitto_pub -h broker.connectmq.com -p 1883 -i laptop-k3v9-pub -t "connectmq/demo/esp32-k3v9/led/set" -m ON
mosquitto_pub -h broker.connectmq.com -p 1883 -i laptop-k3v9-pub -t "connectmq/demo/esp32-k3v9/led/set" -m OFF
LED durum değiştirir ve abonede yeni bir led/state mesajı görünür. Kartın fişini çekin, yaklaşık 45 saniye (keepalive'ın 1,5 katı) bekleyin; broker durum topic'inde offline yayımlar. İşte eksiksiz IoT döngünüz: algılama, yayımlama, uzaktan kontrol ve varlık tespiti.
Komutları retain bayrağıyla (-r) yayımlamayın. Retained bir komut, ESP32 her yeniden bağlandığında tekrar teslim edilir.
Adım 6: TLS ile Özel Bir Broker'a Geçin
Public broker öğrenmek için mükemmeldir, ancak gerçek bir cihazın gizliliğe, kimlik doğrulamaya ve şifrelemeye ihtiyacı vardır. ConnectMQ ile 8883 portunda üretilmiş kimlik bilgilerine ve Let's Encrypt sertifikasına sahip özel bir broker edinirsiniz.
- ConnectMQ portalında kaydolun, ücretsiz Serverless planı seçin, bir broker oluşturun ve üretilen kullanıcı adını, parolayı ve client ID'yi kopyalayın.
- Broker sertifikasının bağlı olduğu Let's Encrypt kök sertifikasını (ISRG Root X1) indirin:
curl -o isrgrootx1.pem https://letsencrypt.org/certs/isrgrootx1.pem
- Sketch'in üst kısmını aşağıdaki gibi değiştirin. Yalnızca include'lar, yapılandırma, client nesnesi ve bağlantı çağrısı değişir; geri kalan her şey aynı kalır.
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <DHT.h>
const char* MQTT_HOST = "broker.connectmq.com";
const uint16_t MQTT_PORT = 8883;
const char* MQTT_USERNAME = "YOUR_USERNAME";
const char* MQTT_PASSWORD = "YOUR_PASSWORD";
const char* MQTT_CLIENT_ID = "YOUR_CLIENT_ID";
const char* TOPIC_PREFIX = "home/office/esp32-01";
// isrgrootx1.pem dosyasının tüm içeriğini işaretler arasına yapıştırın
const char* ROOT_CA = R"EOF(
-----BEGIN CERTIFICATE-----
...paste the certificate body from isrgrootx1.pem here...
-----END CERTIFICATE-----
)EOF";
WiFiClientSecure net;
PubSubClient mqtt(net);
setup() içinde MAC tabanlı client ID'yi portaldan aldığınızla değiştirin ve bağlanmadan önce sertifikayı yükleyin:
clientId = MQTT_CLIENT_ID; // kimlik bilgilerinizle verilen client ID ile eşleşmelidir
net.setCACert(ROOT_CA);
connectMqtt() içinde ise kimlik bilgilerini Last Will ile birlikte geçin:
bool ok = mqtt.connect(clientId.c_str(), MQTT_USERNAME, MQTT_PASSWORD,
topicStatus.c_str(), 1, true, "offline");
Tekrar yükleyin. Serial Monitor 8883 portunda başarılı bir bağlantı göstermelidir. Bilgisayarınızdan aynı kimlik bilgileriyle doğrulayın veya okumaların gelişini izlemek için portaldaki tarayıcı içi MQTT client'ını ve canlı topic gezginini açın. ConnectMQ'nun client ID'leri verdiği kimlik bilgilerine bağladığını unutmayın; bu yüzden her cihazın kendi kimlik bilgisi setine ihtiyacı vardır. Tek bir seti iki kartta kullanmak, kartların birbirinin bağlantısını kesmesine yol açar. SSL üzerinden ESP32 MQTT eğitimi, setInsecure()'un neden asla production'a çıkmaması gerektiği dahil sertifika yönetimini daha derinlemesine ele alır.
Adım 7: Sensörü Gerçek Dünyaya Hazırlayın
Masanızda bir öğleden sonra çalışan bir sketch, bir yıl boyunca gözetimsiz çalışan bir cihazdan farklıdır. Kartı erişilmesi zor bir yere kurmadan önce bu kontrol listesini gözden geçirin:
- Kararlı güç. En az 500 mA değerinde kaliteli bir 5 V güç kaynağı kullanın. Wi-Fi iletimi akım sıçramalarına neden olur ve ucuz adaptörler yazılım hatası gibi görünen brownout reset'lerine yol açar.
- Sensör yerleşimi. DHT22'yi ESP32'nin kendisinden ve ısınarak okumaları bir derece veya daha fazla saptıran voltaj regülatörlerinden uzak tutun. Kısa bir kablo ve havalandırmalı bir kutu yardımcı olur.
- Cihaz başına bir kimlik bilgisi seti. Aynı kullanıcı adını, parolayı ve client ID'yi asla birkaç karta kopyalamayın. Diğerlerine dokunmadan birini iptal edebilmek için her cihaza ayrı bir set verin.
- Gerçek zaman damgaları.
uptimealanı hata ayıklama için yararlıdır, ancak analiz gerçek saate ihtiyaç duyar. MQTT için ESP32 NTP zaman damgaları yazısında gösterildiği gibi açılışta saati NTP ile senkronize edin ve her okumaya bir epoch zaman damgası ekleyin. - Uzaktan güncellemeler. Bir sensörü yeniden yüklemek için merdivene tırmanmak çabucak bıktırır. MQTT üzerinden ESP32 OTA güncellemeleri ile kablosuz güncellemeleri en baştan planlayın.
- Yeniden derlemeden yapılandırma. Koda gömülü Wi-Fi bilgileri tek bir kart için sorun değildir. Birkaç kart için, her cihazın sahada yapılandırılabilmesi adına bir captive portal kütüphanesi kullanın.
- Sağlık raporlaması. RSSI ve uptime yayımlamaya devam edin. Yavaşça düşen sinyal gücü veya sık yeniden başlatmalar, bir cihazın yakında çevrimdışı olacağının erken uyarılarıdır.
Bu adımların hiçbiri daha önce yazdığınız MQTT mantığını değiştirmez. Bir demo ile, rapor vermeye devam ettiği için unutabileceğiniz bir sensör arasındaki farkı yaratırlar.
Sorun Giderme
mqtt.state() sıfır olmayan bir değer döndürürse bu tablo genellikle nedeni gösterir:
| state() | Anlamı | Tipik çözüm |
|---|---|---|
| -4 | Bağlantı zaman aşımı | Ağı, güvenlik duvarını, port numarasını ve keepalive'ı kontrol edin |
| -2 | TCP veya TLS bağlantısı başarısız | Yanlış host veya port, eksik CA sertifikası, Wi-Fi hazır değil |
| -3 / -1 | Bağlantı kayboldu / kesildi | Yinelenen client ID, kararsız Wi-Fi, loop içinde bloklayan kod |
| 2 | Client ID reddedildi | Boş veya yanlış client ID; kimlik bilgilerinizle verileni kullanın |
| 4 | Hatalı kullanıcı adı veya parola | Kimlik bilgilerini portaldan yeniden kopyalayın, boşlukları kontrol edin |
| 5 | Yetkisiz | Kimlik bilgileri client ID veya broker ile eşleşmiyor |
Diğer yaygın sorunlar:
- Okumalar
nan. DHT22 bağlantısını, pull-up direncini ve iki saniyede birden daha sık okumadığınızı kontrol edin. - Publish sessizce başarısız oluyor. Mesaj PubSubClient tamponundan büyük;
setBufferSize()ile büyütün. - Kart rastgele yeniden başlıyor. Wi-Fi iletimi sırasında zayıf USB gücü; farklı bir port veya harici güçlü bir hub deneyin.
- 1883'te çalışıyor ama 8883'te çalışmıyor. CA sertifikası eksik veya tamamlanmamış ya da ağ giden 8883 portunu engelliyor.
Daha uzun bir kontrol listesi için ESP32 MQTT broker'a bağlanamıyor yazısına bakın.
Sırada Ne Var?
Bu temelle neredeyse her türlü bağlantılı sensör veya aktüatörü geliştirebilirsiniz. İyi sonraki adımlar:
- ESP32 ArduinoJson ve MQTT yazısında gösterildiği gibi elle oluşturulan dizeleri ArduinoJson ile değiştirin.
- DHT22'yi daha hassas bir MQTT üzerinden BME280 ile değiştirin.
- ESP32 deep sleep ve MQTT ile pille çalıştırın.
- MQTT ile kontrol edilen bir ESP32 rölesi ile gerçek yükleri güvenle anahtarlayın.
- Bu yaklaşımı daha kısa ve LED odaklı ESP32 MQTT eğitimi ve ESP32'de MicroPython umqtt ile Python yoluyla karşılaştırın.
ESP32'nizi ConnectMQ ile Çevrimiçi Yapın
Prototipiniz gerçek veriye hazır olduğunda ona özel bir yuva verin. app.connectmq.com adresinde kredi kartı gerektirmeyen Serverless planla ücretsiz bir hesap oluşturun, bir broker oluşturun ve üretilen kimlik bilgilerini sketch'inize yükleyin. Ücretsiz plan 25 bağlantıya kadar destekler; bu, küçük bir sensör filosunu ve bir iki dashboard'u kapsar. Plan size yetmediğinde bir yönetilen MQTT broker planı kodunuzu değiştirmeden yüzlerce cihaza ölçeklenir.
Sık Sorulan Sorular
Yeni başlayanlar için en iyi ESP32 kartı hangisi?
Standart bir ESP32 DevKit (genellikle ESP32-WROOM-32 veya ESP32 Dev Module olarak etiketlenir) en kolay başlangıçtır; çünkü neredeyse her eğitim ve kütüphane onu destekler. ESP32-S3 ve ESP32-C3 kartları da bu eğitimdeki kodla çalışır.
Bu ESP32 IoT eğitimini takip etmek için bir hesaba ihtiyacım var mı?
Hayır. İlk bölüm, benzersiz ve boş olmayan herhangi bir client ID ile anonim bağlantıları kabul eden broker.connectmq.com'un public alanını kullanır. Yalnızca TLS'li özel bir broker'a geçtiğinizde bir hesaba ihtiyaç duyarsınız.
ESP32'm neden broker ile bağlantısını sürekli kesiyor?
En yaygın nedenler; aynı client ID'yi kullanan iki cihaz, mqtt.loop()'un çalışmasını engelleyen bloklayan kod ve zayıf Wi-Fi sinyalidir. Telemetrideki RSSI değerini kontrol edin ve her kartın kendi client ID'sine sahip olduğundan emin olun.
PubSubClient MQTT 5'i destekliyor mu?
Hayır. PubSubClient, broker tarafından tam olarak desteklenen MQTT 3.1.1'i uygular. ESP32'de MQTT 5 özelliklerine ihtiyacınız varsa bunun yerine ESP-IDF esp-mqtt bileşenini kullanın.
ESP32'de TLS için setInsecure() kullanmak güvenli mi?
Yalnızca hızlı denemeler için. setInsecure() trafiği şifreler ancak sunucu doğrulamasını atlar; bu yüzden kimliğe bürünmeye karşı koruma sağlamaz. Bir testin ötesindeki her şey için kök CA sertifikasını setCACert() ile yükleyin.



