Hardware/ESP

ESP32-DevKitC-32D 로 TCP/IP 통신 해보기

초인로크 2021. 2. 3. 22:16
반응형

프로그래밍할 준비가 안되어 있는 경우에는 아래의 블로그의 글을 확인하길 바란다.

 

ESP32-DevKitC-32D 의 도입

 

설치를 끝내고 나면 [아두이노 - 파일 - 예제] 안에 있는 [WiFi - WiFiClientBasic]의 샘플을 바탕으로 프로그래밍을 하면 된다.

내가 만들고 싶었던 것은 [BSD 소켓 프로그래밍] 이므로 그와 관련된 소스코드만 첨부한다.

 

1. ESP32-WROOM-32D를 클라이언트로 설정

#include <WiFi.h>

#include <WiFiMulti.h>

 

WiFiMulti WiFiMulti;

WiFiClient client;

 

void setup()

{

    Serial.begin(115200);

    delay(10);

 

    // We start by connecting to a WiFi network

    WiFiMulti.addAP("SSID이름", "SSID비밀번호"); // 각자의 통신환경에 따라 설정해 준다.

 

    Serial.println();

    Serial.println();

    Serial.print("Waiting for WiFi... ");

 

    while(WiFiMulti.run() != WL_CONNECTED) {

        Serial.print(".");

        delay(500);

    }

 

    Serial.println("");

    Serial.println("WiFi connected");

    Serial.println("IP address: ");

    Serial.println(WiFi.localIP());

 

    delay(500);

   

}

 

void connections(){

    const uint16_t port = 3000; // 포트번호 설정

    const char * host = "192.168.1.1"; // IP 설정

 

    Serial.print("Connecting to ");

    Serial.println(host);

 

    if (!client.connect(host, port)) {

        Serial.println("Connection failed.");

        Serial.println("Waiting 5 seconds before retrying...");

        delay(5000);

        return;

    }

}

 

void loop()

{

    connections();

    client.print("Hello world!!"); //여기서 "Hello world!!"」를 송신한다.

    delay(1000);

}

 

2. Xcode에서 작성한 서버 프로그램

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

// 버퍼 사이즈 설정

#define BUFSIZE 8192

 // 포트의 정의

#define TCP_PORT 3000

 

// 소켓 설정

int srcSocket;  // 자신

int dstSocket;  // 상대

 

// sockaddr_in 구조체

struct sockaddr_in s_addr;

struct sockaddr_in c_addr;

socklen_t len;

int n;

 

char textdata[11]="01234567890";

char buf[BUFSIZE];

 

void server_init(){

    //소켓생성

    if ((srcSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

        //통신오류

        perror("socket error");

        exit(EXIT_FAILURE);

    }

   

    //server의IP해제

    int on = 1;

    printf("Server Started\n");

    setsockopt(srcSocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

   

    // sockaddr_in 구조체 설정

    memset((char *) &s_addr, 0, sizeof(s_addr));

    s_addr.sin_family      = AF_INET;

    s_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    s_addr.sin_port        = htons(TCP_PORT);

   

    // 소켓의 바인드 설정

    if (bind(srcSocket, (struct sockaddr *) &s_addr, sizeof(s_addr)) < 0) {

        perror("bind");

        exit(EXIT_FAILURE);

    }

   

    // 접속허가

    listen(srcSocket, 5);

   

    // 클라이언트로부터 접속 요구를 수신

    len = sizeof(dstSocket);

 

}

 

void server_main(){

    // 소켓의 접속

    if ((dstSocket = accept(srcSocket, (struct sockaddr *) &c_addr, &len)) < 0) {

        // 접속 실패 시의 설정

        perror("accept error");

        exit(EXIT_FAILURE);

    }

    printf("connected from '%s' \n", inet_ntoa(s_addr.sin_addr));

 

}

 

int main()

{

    // server의 초기화

    server_init();

    while (1) {

        // 소켓의 접속 설정 부분

        server_main();

       

        memset(buf, 0, sizeof(buf));

        // 패킷의 수신

        recv(dstSocket, buf, sizeof(buf),0);

        printf("Ricived from client %s \n",buf);

       

        close(dstSocket);

    }

    // 소켓 닫기

    close(srcSocket);

 

    return EXIT_SUCCESS;

 

위의 서버를 실행한 뒤에 ESP를 실행해 주면 Xcode 상에서 아래와 같이 접속 확인이 가능하다.

 

이 글의 목적은 나 자신의 공부로써 어떻게든 통신을 해 보자는 것에 있으므로, TCP/IP의 본질적인 설명은 여기서 생략한다.

 

그리고 자잘한 설정은 각자가 수정한 뒤에 사용하길 바란다.

반응형