ESP8266 TCP klient ,przykładowy kod
Kluczowe punkty
• WiFi.begin → oczekiwanie na WL_CONNECTED
• WiFiClient / WiFiClientSecure.connect(host, port)
• client.print()/read() z kontrolą timeoutu
• obsługa rozłączenia i automatyczny reconnect
• test lokalny: nc -lk
ESP8266WiFi
(instaluje się automatycznie z pakietem płytek). WiFiClientSecure
do TLS 1.2 (wymaga ~20 kB RAM). WiFiClient
(lub Secure). connect()
, weryfikacja sukcesu. print()/write()
– wysłanie danych. available()
z własnym timeoutem. client.stop()
; w razie potrzeby ponowienie. /********************************************************************
* ESP8266 – Klient TCP (Arduino C++) *
* Autor: 2024, przykład open-source *
********************************************************************/
#include <ESP8266WiFi.h>
// ---------- konfiguracja użytkownika ----------
const char* SSID = "Twoja_Siec";
const char* PASS = "Twoje_Haslo";
const char* HOST = "192.168.1.100"; // lub "example.com"
const uint16_t PORT = 8888;
const uint32_t RETRY_INTERVAL_MS = 10000; // 10 s między kolejnymi próbami
const uint32_t REPLY_TIMEOUT_MS = 5000; // 5 s na odpowiedź serwera
// ---------------------------------------------
WiFiClient client;
unsigned long lastTry = 0;
void connectWiFi()
{
if (WiFi.status() == WL_CONNECTED) return;
Serial.printf("Łączenie z %s", SSID);
WiFi.begin(SSID, PASS);
uint32_t t0 = millis();
while (WiFi.status() != WL_CONNECTED && millis() - t0 < 20000) {
delay(500); Serial.print(".");
}
Serial.println(WiFi.status()==WL_CONNECTED ? "\nWiFi OK" : "\nWiFi FAIL");
}
void setup()
{
Serial.begin(115200); delay(50);
connectWiFi();
}
void loop()
{
if (millis() - lastTry < RETRY_INTERVAL_MS) return;
lastTry = millis();
if (WiFi.status() != WL_CONNECTED) connectWiFi();
Serial.printf("\n[TCP] Łączenie z %s:%u ... ", HOST, PORT);
if (!client.connect(HOST, PORT, 3000)) { // 3-sek. timeout
Serial.println("BRAK połączenia");
client.stop();
return;
}
Serial.println("OK");
// --- wysyłanie pakietu ---
String payload = "Hello from ESP8266, uptime=" + String(millis());
client.println(payload);
Serial.printf("Wysłano: %s\n", payload.c_str());
// --- odbieranie odpowiedzi ---
uint32_t t0 = millis();
while (!client.available() && millis() - t0 < REPLY_TIMEOUT_MS) yield();
if (!client.available()) {
Serial.println(">> Timeout odpowiedzi");
} else {
Serial.print("Odebrano: ");
while (client.available()) Serial.write(client.read());
Serial.println();
}
client.stop(); // zwolnienie gniazda
}
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
const char* SSID = "Twoja_Siec";
const char* PASS = "Twoje_Haslo";
const char* HOST = "api.your-domain.com";
const uint16_t PORT = 443;
// fingerprint lub Root CA (zalecane)
const char* ROOT_CA PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIF...
-----END CERTIFICATE-----
)EOF";
WiFiClientSecure secureClient;
void setup() {
Serial.begin(115200);
WiFi.begin(SSID, PASS);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println("\nWiFi connected");
secureClient.setTrustAnchors(new X509List(ROOT_CA)); // weryfikacja CA
Serial.printf("TLS handshake z %s:%u\n", HOST, PORT);
if (!secureClient.connect(HOST, PORT)) {
Serial.println("TLS connect FAILED");
return;
}
// prosty request HTTP GET
secureClient.printf("GET /status HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", HOST);
while (secureClient.connected()) {
String line = secureClient.readStringUntil('\n');
Serial.println(line);
}
secureClient.stop();
}
void loop() {}
Uwagi:
• Do TLS wymagane jest ~50 kB flash i ~20 kB RAM – na ESP-12/-12F zwykle wystarcza.
• Zamiast „fingerprint” (co 90 dni dla Let’s Encrypt) lepiej podać cały łańcuch CA (X509List
).
import network, socket, time
SSID, PASS = "Twoja_Siec", "Twoje_Haslo"
SERVER, PORT = "192.168.1.100", 8888
sta = network.WLAN(network.STA_IF); sta.active(True); sta.connect(SSID, PASS)
while not sta.isconnected(): time.sleep_ms(200)
print("IP:", sta.ifconfig()[0])
s = socket.socket(); s.connect((SERVER, PORT))
s.send(b'Hello from MicroPython\r\n')
data = s.recv(128); print("RX:", data)
s.close()
WiFiGenericClass::hostByName()
z cache DNS. WiFiClientSecure
. Starsze serwery <TLS1.2 wymagają secureClient.setInsecure();
(niezalecane). WiFi.h
(nie ESP8266WiFi.h
). PubSubClient
lub AsyncMqttClient
.client.connect()
(3. argument) od wersji 3.0.0 – wcześniej należało używać własnych pętli. yield()
w pętli odbiorczej oddaje czas CPU dla stosu LWIP i zapobiega watchdog reset (WDT). tcp_sndbuf overflow
→ kontroluj rozmiar wysyłanych ramek lub włącz Nagle alg. (client.setNoDelay(false)
– domyślnie). nc -lk 8888
(Linux/macOS) lub ncat -l -k 8888
(Windows) – umożliwia obserwację napływających danych i ręczne odsyłanie odpowiedzi. loop()
regularnie sprawdzaj WiFi.status()
; w razie WL_DISCONNECTED
wywołaj WiFi.reconnect()
lub WiFi.begin(...)
. yield()
lub delay()
< 20 ms. Serial.setDebugOutput(true);
+ WiFi.printDiag(Serial);
– przydatne przy problemach z TCP RST/FIN. pcb
. ESPAsyncTCP
) – w pełni nieblokująca obsługa klienta i serwera. mosquitto
i AsyncMqttClient
. ArduinoOTA
). Przedstawione przykłady pokazują pełny cykl pracy klienta TCP na ESP8266 – od zestawienia Wi-Fi, poprzez wysyłkę danych, aż po obsługę odpowiedzi i rozłączenie. Wersja nieszyfrowana jest lekka i użyteczna w sieci LAN; wersja TLS zapewnia bezpieczeństwo w Internecie. Do szybkiego testu wystarczy netcat
, a w produkcji warto rozważyć protokół MQTT. Dbaj o aktualne certyfikaty i unikaj blokujących pętli, aby watchdog nie resetował urządzenia.