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.