프로그래밍할 준비가 안되어 있는 경우에는 아래의 블로그의 글을 확인하길 바란다.
설치를 끝내고 나면 [아두이노 - 파일 - 예제] 안에 있는 [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> // 버퍼 사이즈 설정 #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의 본질적인 설명은 여기서 생략한다.
그리고 자잘한 설정은 각자가 수정한 뒤에 사용하길 바란다.