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
#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();
}
}
}
}
#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");
}
}
}
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.