[ESP32/라즈베리파이] 웹소켓 프로그래밍으로 라즈베리파이와 통신하기 – (1) Server 구현하기

ESP32로 웹소켓 프로그래밍은 ESP8266용 웹소켓 라이브러리를 이용하여 구현할 수 있습니다.

먼저, 아래의 경로로 가서 소스를 다운 받습니다.

https://github.com/morrissinger/ESP8266-Websocket

다운받은 소스를 아두이노 라이브러리 폴더에 복사합니다. 아두이노 라이브러리 폴더의 경로는 다음과 같습니다.

  • C:\사용자\사용자명\문서\Arduino\libraries

이 라이브러리를 그냥 사용할 경우  기존의 MD5 관련 함수와 충돌이 발생합니다.

ESP8266-Websocket 라이브러리 폴더 내 MD5.c 와 MD5.h 파일에서 다음 함수명을 수정합니다.

  • MD5Init →MD5Init_XXX
  • MD5Update →MD5Update_XXX
  • MD5Final →MD5Final_XXX

_XXX 에는 원하시는대로 수정하시면 됩니다.

위의 작업이 완료되었으면 각각의 역할에 대해 아래와 같이 구현합니다.

< ESP32 – Server >

#include<WebSocketServer.h>
#include <WiFi.h>

const char* ssid     = "USER_SSID";
const char* password = "PASSWORD";

// 서버 생성시 연결될 포트 지정
WiFiServer server(80);
WebSocketServer webSocketServer;

void setup() {
    Serial.begin(115200);
    delay(10);
    
    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    // 와이파이망에 연결
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());  
    
    startServer();
}

// 서버 시작
void startServer() {
    Serial.println("Server start");
    server.begin();
}

void loop() {
    // 클라이언트 연결 대기
    WiFiClient client = server.available();

    // 클라이언트가 연결되면 파일 전송 시작
    if(client.connected() && webSocketServer.handshake(client)) {
        String data;
        while(client.connected()) {
            data = webSocketServer.getData();
            if(data.length() > 0) {
                Serial.println("received: "+data);
                webSocketServer.sendData("send back - "+data); 
            }
            delay(10);
        }
        Serial.println("The client is disconnected");
        delay(100);
    }
    delay(100);
}

ESP32 서버용 코드를 컴파일 후 업로드하면 ESP32 가 서버로 동작하기 시작합니다.

라즈베리파이에서 웹소켓 클라이언트 구현을 용이하게 하기 위해 파이썬 websocket 모듈을 이용합니다.

PIP를 이용해 다음의 모듈을 설치합니다.

pip3 install websocket-client

websocket 모듈을 설치하였으면 다음의 코드를 구현하여 실행합니다.

< Raspberry PI – Client >

import websocket
import time
 
ws = websocket.WebSocket()
ws.connect("ws://192.168.219.117/")
 
i = 0
nrOfMessages = 200
 
while i<nrOfMessages:
    ws.send("message nr: " + str(i))
    result = ws.recv()
    print(result)
    i=i+1
    time.sleep(1)
 
ws.close()

ESP32 웹소켓 서버가 구동되고 있는 상태에서 파이썬 코드를 실행하면 메세지가 오고가는 것을 확인할 수 있습니다.

참고자료

https://www.dfrobot.com/blog-775.html

https://techtutorialsx.com/2017/11/01/esp32-arduino-websocket-client/

You may also like...