top drop menu

Recent Post

월요일, 11월 5

NodeMCU(혹 아두이노)를 이용하여 웹소켓 통신하기


이것저것 두서 없이 다루다 보니 웹소켓은 해 본것인지 아닌지 헷갈린다. 중복되면 뭐 어때 자꾸 해봐야 알 수 있는 것인데.
이번에는 NodeMCU에 웹소켓 서버를 설치하고 통신을 시도해 보기로 하자.

20181106_091915

LED 두개를 연결해 두었다. 목표는 웹소켓을 이용 두개의 LED를 제어 해 보는 것이다.
먼저 아두이노 코드를 작성해 보자.
웹소켓에 대한 추가 정보는 아래 사이트에서 확인해 보자.
http://www.websocket.org/aboutwebsocket.html
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20111028085010&lo=zv41


먼저 와이파이 연결을 하도록 설정하자.

#include "ESP8266WiFi.h"
//Wifi 연결하기
const char* ssid = "SSID";
const char* password = "PASSSWORD";
void setup() {
   Serial.begin(115200);
   connectWifi();
  
}
void loop() {
}
//wifi
void connectWifi(){
   Serial.print("Connecting to ");
   Serial.print(ssid);
  WiFi.disconnect(true);
   delay(1000);
   WiFi.begin(ssid, password);
   while(WiFi.status() != WL_CONNECTED){
     delay(500);
     Serial.print(".");
   }
  
   Serial.println("");
   Serial.println("WiFi connected");
   Serial.print("IP Address: ");
   Serial.print(WiFi.localIP());
   Serial.println("");
}

이미지 036

웹소켓 라이브러리를 설치해 주자. 라이브러리 매니저으로 들어 가자.
websockets를 검색해서 설치 해준다. 웹소켓 서버 코드를 작성하자.

#include "ESP8266WiFi.h"
#include "WebSocketsServer.h"
//Wifi 연결하기
const char* ssid = "SSID";
const char* password = "PASSWORD";

//WebSocket
WebSocketsServer webSocket = WebSocketsServer(80);
//Callback function(웹소켓 메세지를 수신하면 실행)
void onWebSocketEvent(uint8_t num,
                     WStype_t type,
                     uint8_t * payload,
                     size_t length) {
   //웹소켓이벤트의 타입
   switch(type) {
     //클라이언트 연결 해제시
     case WStype_DISCONNECTED:
       Serial.printf("[%u] Disconnected!\n", num);
       break;
       //클라이언트 연결시
     case WStype_CONNECTED:
       {
         IPAddress ip = webSocket.remoteIP(num);
         Serial.printf("[%u] Connected!\n", num);
         Serial.println(ip.toString());
       }
       break;
      
     //클라이언트에게 응답을 보낸다.
     case WStype_TEXT:
       Serial.printf("[%u] Text: %s\n", num, payload);
       webSocket.sendTXT(num, payload);
       break;
      
     //기타 필요에 따라
     case WStype_BIN:
     case WStype_ERROR:
     case WStype_FRAGMENT_TEXT_START:
     case WStype_FRAGMENT_BIN_START:
     case WStype_FRAGMENT:
     case WStype_FRAGMENT_FIN:
     default:
       break;
   }
}
void setup() {
   Serial.begin(115200);
   connectWifi();
  //Start websocket server
   webSocket.begin();
   webSocket.onEvent(onWebSocketEvent);//콜백실행
}
void loop() {
   //웹소켓 데이터를 기다림
   webSocket.loop();
}

//wifi
void connectWifi(){
   Serial.print("Connecting to ");
   Serial.print(ssid);
  WiFi.disconnect(true);
   delay(1000);
   WiFi.begin(ssid, password);
   while(WiFi.status() != WL_CONNECTED){
     delay(500);
     Serial.print(".");
   }
  
   Serial.println("");
   Serial.println("WiFi connected");
   Serial.print("IP Address: ");
   Serial.print(WiFi.localIP());
   Serial.println("");
}
<웹소켓 서버 코드>

소켓 데이터 수신을 기다렸다. 접속한 클라이언트 ip를 알려 주고 받은 값을 그대로 클라이언트에게 되돌려 주는 코드이다.
이제 라즈베리파이에서 클라이언트 프로그램을 코딩하자.

이미지 037

라즈베리파이에 파이썬 클라이언트를 만들자. 먼저 websocket-client를 설치해야 한다.
파이썬 2와 파이썬3에서 설치및 사용용어에 차이가 있다. 지금 작업중인 파이썬이 몇 버전인지 먼저 체크하고 파이썬3으로 시작하자.

pip3 install websocket-client

클라이언트 코드는 간단하다.

import websocket
#Connect to websocket server
ws = websocket.WebSocket()
ws.connect("ws://websocket server ip")
print("Connected to WebSocket Server")
#Ask the user for some input
inputStr = input("Say something: ")
ws.send(inputStr)
#Wait for server to respond
result = ws.recv()
print("Received: " + result)
#Socket close
ws.close()


이제 실행해 보자. 파이썬3으로 실행해야 한다.

이미지 038
<NodeMCU 결과>

이미지 039
<라즈베리파이 파이썬 결과>

정상적으로 동작하는 것을 확인 할 수 있다. 이렇게 해서 웹소켓을 통해 소켓통신이 가능해 졌다. 이제 이것으로 좀 더 응용을 해 보기로 하자.

다음편에 계속 …
Blogger Widget