Viet Dev

Cover image for ESP8266 - Trao đổi dữ liệu giữa 2 board ESP8266
Tuan for Unicloud Group

Posted on

ESP8266 - Trao đổi dữ liệu giữa 2 board ESP8266

ESP8266 - Trao đổi dữ liệu giữa 2 board ESP8266

Thông thường, muốn hai hay nhiều ESP8266 có thể liên lạc, trao đổi dữ
liệu với nhau sẽ cần đến một router hay access-point, các module ESP8266
này sẽ kết nối vào Access Point rồi sau đó giao tiếp với nhau.

Có một số ứng dụng đơn giản để kết nối 2 ESP8266 với nhau mà không cần
Access Point, chúng ta có thể khởi tạo 1 board hoạt động như là WiFi
Access Point, đồng thời khởi tạo 1 TCP Server. Board khác hoạt động như
1 WiFi client thông thường, kết nối vào mạng WiFi đã được tạo, và khởi
động 1 TCP Client kết nối vào TCP Server kia.

Yêu cầu

  • Không cần bất kỳ một Router, hay Access Point nào, thực hiện việc kết nối giao tiếp giữa 2 ESP8266 thông qua mạng WiFi, 2 Board này sẽ truyền dữ liệu với nhau mỗi giây, và hiển thị lên Serial Terminal

Hướng dẫn thực hiện

Để trao đổi dữ liệu giữa 2 ESP8266 cần đáp ứng các điều kiện sau:

  • 1 ESP8266 sẽ khởi động SoftAP để tạo mạng WiFi, đồng thời khởi
    động 1 TCP Server để làm Server.

  • 1 ESP8266 phải là client với chế độ WiFi Station và kết nối đến
    ESP8266 server đã tạo ở trên.

  • Sau mỗi giây, Board ESP8266 này sẽ gởi dữ liệu vào Board kia, board
    nhận được dữ liệu sẽ in ra cổng Serial và gởi ngược lại.

Code

P2P server

#include <ESP8266WiFi.h>

#define PORT  23
// Gioi han so luong clients ket noi
#define MAX_CLIENTS 3

// Ten va mat khau cua ESP8266 AP se tao
const char *ssid = "yourSSID";
const char *password = "yourPassword";

//khoi tao IP adress
IPAddress local_IP(192, 168, 4, 1);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);

// Khoi tao port de clients ket noi.
WiFiServer server(PORT);
WiFiClient clients[MAX_CLIENTS];

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("Setting soft-AP configuration ... ");

  //Cau hinh acces point, cai dat soft AP de client ket noi vao.
  WiFi.softAPConfig(local_IP, gateway, subnet);
  WiFi.softAP(ssid, password);

  //In ra local_IP cua AP.
  Serial.print("AP IP address: ");
  Serial.println(WiFi.softAPIP());
  Serial.println("Telnet server started");
  server.begin();
}

void loop() {
  uint8_t i;
  // kiem tra co client moi ket noi khong
  if (server.hasClient())  {
    for (i = 0; i < MAX_CLIENTS; i++) {
      if (!clients[i] || !clients[i].connected())
      { if (clients[i]) clients[i].stop();
        clients[i] = server.available();
        Serial.print("New client: "); Serial1.print(i);
        continue;
      }
    }
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  // Kiem tra neu so client ket noi MAX_CLIENTS
  // co client, client duoc ket noi va o trang thai available
  // doc du lieu tu client, va gui lai du lieu cho client do.
  for (i = 0; i < MAX_CLIENTS; i++) {
    if (clients[i] && clients[i].connected()) {
      if (clients[i].available()) {
        String line = clients[i].readStringUntil('\r');
        Serial.print("Server receive from Client:");
        Serial.println(line);

        //Gui thong tin hoai dap cho client
        String resp = String(line.reserve(line.length() - 1));
        Serial.print(" Then, response back to client:");
        Serial.println(resp);
        clients[i].write(resp.c_str());
        Serial.println();
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

P2P client

#include "ESP8266WiFi.h"
// Ten va mat khau cua ESP8266 AP lam server se vao
const char *ssid = "yourSSID";
const char *password = "yourPassword";

IPAddress server_ip(192, 168, 4, 1);
#define PORT  23
// port 23 la port cua esp8226 lam AP da khoi tao.
WiFiClient client;

void setup() {
  uint8_t i = 0;
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  Serial.print("\nConnecting to ");
  Serial.println(ssid);

  // Kiem tra tình trang ket noi, neu chua ket noi duoc
  // se in chuoi "connecting..." tren man hinh serial terminal.
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("Connecting...");
    delay(500);
  }
}

unsigned long previousMillis = 0;
void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    // Kiem tra neu client(STA) chua duoc ket noi.
    // Kiem tra tiep tuc neu khong duoc ket noi den IP va PORT cua server(AP
    // thi in ra serial terminal chuoi "connection failed".
    while (!client.connected()) {
      if (!client.connect(server_ip, PORT)) {
        Serial.println("connection failed");
        delay(1000);
        return;
      }
    }
    // Neu client(STA) duoc ket noi thi se doc du lieu tu server(AP)
    // den khi gap ki tu \r va in ra seria terminal du lieu nhan duoc.
    while (client.available()) {

      String line = client.readStringUntil('\r');
      Serial.print("Client receive from Server:");
      Serial.println(line);
    }
    //Send PING to server every 1000ms.
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= 1000) {
      previousMillis = currentMillis;
      client.write("PING\r");
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Nạp chương trình cho 2 board NodeMCU và xem kết quả hiển trị trên màn
hình Monitor.

Oldest comments (0)