[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/