아두이노의 WiFi 통신과 같은 경우 아래와 같은 API를 재공하기에 관련헤더 파일을 선언후, 사용할 수 있다.
실습과정은 서버생성, 클라이언트 접속, 통신의 과정을 거쳤다.
아래와 같은 과정으로 두개의 아두이노 기기에서 하나의 서버에 Client가 접속해 LED를 제어하도록 설정하였다.
#include <WiFi.h>
#include <WiFiMulti.h>
#include <WiFiClient.h>
#include <WiFiUdp.h>
//esp32의 wifi 관련 헤더 선언
WiFiUDP Udp;
void setup() {
Serial.begin(115200);
Serial.print("Connecting to WiFi");
WiFi.mode(WIFI_STA);
WiFi.begin(" ", "");
while (WiFi.status() != WL_CONNECTED) {
delay(200);
Serial.print(".,");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
Serial.println("scan start");
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n ==0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
Udp.beginPacket(" ", );
Udp.print("ON");
Serial.println("SEND ON");
delay(1000);
Udp.endPacket();
Udp.beginPacket(" ", 80);
Udp.print("OFF");
Serial.println("SEND OFF");
delay(1000);
Udp.endPacket();
// Wait a bit before scanning again
}
}
위쪽은 클라이언트측 WIFI 함수이다. UDP 객체를 생성하여, 서버측과 동일한 와이파이 설정 후, UDP Packet으로 ON, OFF 문자열을 보내는 것을 확인할 수 있다.
이때, Udp.BeginPacket에서는 목적지 IP주소 + 포트 번호를 통해 전송경로를 설정한다.
Udp.print에서 전송할 문자열을 생성할 수 있다.
서버측에서는 동일한 방법으로 와이파이 접속후, Udp.begin(80)으로 80번포트의 서버를 선언가능하다.
void loop(){
delay(5);
int packetSize = Udp.parsePacket();
int len = Udp.read(packetBuffer, 255);
if (len > 0) {
packetBuffer[len] = 0;
}
Serial.println("Contents:");
Serial.println(packetBuffer);
if (packetBuffer[0] == 79 && packetBuffer[1] ==78){
Serial.println("High");
ledcWrite(0, 255);
ledcWrite(1, 255);
ledcWrite(2, 255);
delay(1000);
}
else if (packetBuffer[0] == 79 && packetBuffer[1] ==70 && packetBuffer[2] ==70){
Serial.println("Low");
ledcWrite(0, 0);
ledcWrite(1, 0);
ledcWrite(2, 0);
delay(1000);
}
}
parsePacket을통해 전송된 데이터 처리후, read를 통해 packetBuffer에 전송된 내용을 저장한다.
아스키코드를 이용해 전송된 데이터가 OFF인지, ON인지 판별해 LED를 키고 끄는 제어를 수행하였다.
결과적으로 일정시간 간격으로 "ON" "OFF" UDP Packet을 번갈아 보내므로써 Server측 아두이노 보드에서 led가 토글됨을 확인할 수 있었다.
UDP 와 TCP
이번 실습의 핵심은 UDP를 이용한 데이터 송수신이었는데, UDP(user data protocol)는 사용자 데이터그램 프로토콜로, 우리가 인터넷에서 흔히 사용하는 TCP(transmission Control Protocol)와는 연결 방식에 차이점을 갖는다. UDP는 일반적인 전송 프로토콜인 TCP보다는 빠르지만, 안정성이 떨어진다. TCP는 두 기기가 수신을 하게 되면, 그 수신에 대한 ACK를 상대방에게 보내 데이터를 정상적으로 받았다는 신호를 보내는 것에 반해, UDP는 서로 간의 송수신만 있을 뿐 제대로 전달받았는지에 대한 검사는 할 수 없기 때문에 이런 결과를 보인다.
IP주소
로컬 IP, 즉 공통된 WiFi 이내의 통신을 기준으로 하여 포트만을 지정해, 다른 클라이언트와의 중복을 걱정할 필요가 없도록하였다.
나는 사실 IP 주소를 지우긴했지만, 172의 IP 대역을 사용했었다. 연결할 수 있는 기기의 수에 따라 A,B,C CLASS로 나누어지고 당시 실습했던 환경이 학교여서 172의 B클래스 대역이었던것으로 예상할 수 있을 것 같다....
'아두이노' 카테고리의 다른 글
[아두이노] BLE 통신 (0) | 2024.08.08 |
---|---|
[아두이노]SPI 통신 (0) | 2024.08.06 |
[아두이노] I2C 통신 (0) | 2024.08.05 |
[아두이노] UART 통신 (0) | 2024.08.05 |
[아두이노] PWM으로 LED 밝기 제어 (0) | 2024.08.05 |