with-RL
로봇 / ESP322024년 1월 22일

ESP32를 이용한 WiFi-Serial Bridge 만들기

이 포스트는 ESP32의 WiFi를 통해 수신한 데이터를 serial을 이용해 출력하는 기능을 만들어 보는 과정에 대한 설명입니다.

이 과정은 다음 환경에서 구성했습니다.

1. WiFi-Serial Bridge 설명

2. PC에 ESP32 연결하기

3. ESP32 코드 (Arduino IDE)

#include <WiFi.h>
#include <WiFiClient.h>

const char* ssid = "SSID of WiFi";
const char* password = "password of WiFi";

WiFiServer tcpServer(5000);
WiFiClient tcpCleint;

uint8_t rx_buf[1024];
uint16_t rx_len = 0;
uint8_t tx_buf[1024];
uint16_t tx_len = 0;

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  tcpServer.begin();
  tcpServer.setNoDelay(true);
}

void loop() {
  if (tcpServer.hasClient()) {
    if (!tcpCleint || !tcpCleint.connected()) {
      tcpCleint = tcpServer.available();
      Serial.println("accept new Connection ...");
    } else {
      WiFiClient temp = tcpServer.available();
      temp.stop();
      Serial.println("reject new Connection ...");
    }
  }

  if (!tcpCleint || !tcpCleint.connected()) {
    delay(100);
    return;
  }

  while(tcpCleint.connected()) {
    if (tcpCleint.available()) {
      while (tcpCleint.available()) {
        rx_buf[rx_len] = tcpCleint.read();
        rx_len++;
      }
      Serial.write(rx_buf, rx_len);
      rx_len = 0;
    }
    if (Serial.available()) {
      while (Serial.available()) {
        tx_buf[tx_len] = Serial.read();
        tx_len++;
      }
      tcpCleint.write(tx_buf, tx_len);
      tx_len = 0;
    }
    delay(1);
  }
}

3. Python 코드 (VSCode)

iimport socket
import time

host = '192.168.45.186'
port = 5000

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))

4. WiFi to Serial Bridge 시험

client.send(f'Send from WiFi to serial {time.time()}\n'.encode())

5. Serial to WiFi Bridge 시험

while True:
    data = client.recv(1024)
    print(data)