아두이노를 이용한 미니 웹 서버 만들기 - 예제 분석

by Bong Kyu Lee | 2016-01-25 12:19

 

아두이노 IDE에 있는 기본 예제에는 웹 서버 예제가 들어있습니다. 이걸 실제로 열어서 내용을 확인해 보도록 하겠습니다. 이더넷 쉴드 및 이더넷 라이브러리가 필요하기 때문에 라이브러리 예제에 존재합니다.

 

그림 1. 아두이노 웹 서버 예제

 

웹 서버 예제를 열면 실제로 코드 내용들이 나오고, 주석이 표시되어 있습니다. 원활한 진행을 위해 이 주석을 한글로 번역해여 내용을 분석해 보겠습니다. 

#include <SPI.h>
#include <Ethernet.h>
// 컨트롤러에 할당할 Mac 주소와 IP 주소를 입력한다.
// IP 주소는 로컬 네트워크에 연관된 주소로 할당한다:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);
// 이더넷 서버 라이브러리를 생성한다.
// IP 주소와 포트를 이용하고 싶은대로 적용한다,
// (80포트는 HTTP의 기본 포트이다):
EthernetServer server(80);
void setup() {
  // 시리얼 통신을 열고 포트가 오픈될때까지 기다린다
  Serial.begin(9600);
  while (!Serial) {
    ; // 시리얼 포트가 연결되기를 기다린다. 네이티브 USB 포트만 필요로 한다.
  }

  // 이더넷 커넥션 연결 및 서버를 시작한다:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // 클라이언트의 진입을 듣는다
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // http request를 공백 라인과 함께 종료시킨다.
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // 만약 라인의 끝 행을 받게 된다면(새로운 라인 캐릭터를 만나게 된
        // 다면) 그리고 라인의 공백을 받게 된다면, http request는 끝나게
        // 된다. 그래서 다시 전송할 수 있게 된다.
        if (c == '\n' && currentLineIsBlank) {
          // 기본 HTTP 리스폰스 헤더를 브라우저에 전달한다.
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // 아날로그 핀의 입력값을 화면에 출력
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // 개행 처리 진행
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // 현재 라인에 공백 처리를 할 것인지 처리
          currentLineIsBlank = false;
        }
      }
    }
    // 웹 브라우저가 데이터를 수신하기 위한 시간을 준다.
    delay(1);
    // 연결을 종료한다:
    client.stop();
    Serial.println("client disconnected");
    Ethernet.maintain();
  }
}

코드 1. 아두이노 이더넷 예제

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

아두이노 코드를 보시면, loop() 함수의 대부분이 client.print로 차 있으며, 그 안에는 html 코드가 들어있는 것을 아실 수 있습니다. 즉, 이더넷에 연결된 클라이언트에 직접 html 소스코드를 전달해주면 해당 정보를 클라이언트에서 처리하는 방법으로 웹 서버를 구현하였습니다. 여기서 http 프로토콜 연결을 받을 클라이언트는? 당연히 웹 브라우져입니다. 지속적으로 출력을 지원해 주면서 윕 서버가 동적으로 보여지도록 꾸며놓은 것이 아두이노 웹 서버의 정체입니다.

 

그렇다면 저희는 웹 서버에 데이터를 보낼 수도 있을까요? 네. 가능합니다.

 

HTTP에서 데이터를 전달하고 전달받기 위해서 GET, POST를 이용한 전송을 진행할 수 있습니다. 그 중에서 저희는 GET을 이용한 데이터 전송을 할 수 있습니다. POST는 server side programming이 가능하여야 하는데, 아쉽게도 아두이노에서는 구현할 수 없습니다. 그러나, GET의 경우에는 주소에 데이터가 포함되어 전달되는 방식이므로 주소 처리를 진행하면 아두이노도 데이터를 확인할 수 있는 것입니다. 다음 예제에서는 GET 방식을 통한 아두이노에 달린 LED 제어를 보여드리겠습니다.

 

[출처] http://www.makewith.co/page/project/350/story/702/

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
22 [Raspberry Pi] 라즈베리파이 : 10 Uses for a Raspberry Pi in Manufacturing : 제조 분야에서의 라즈베리파이의 10가지 용도 file 졸리운_곰 2024.12.28 215
21 [Raspberry Pi] 라즈베리파이 GPIO 포트 ( LED, 버튼 ) 제어 file 졸리운_곰 2024.01.02 275
20 [Raspberry Pi] 라즈베리파이 GPIO file 졸리운_곰 2024.01.02 205
19 [Raspberry Pi] 2020년에 Raspberry Pi에서 실행할 수 있는 20가지 최고의 운영 체제 file 졸리운_곰 2024.01.02 191
18 [Raspberry Pi] 라즈베리파이 클러스터(병렬연결) file 졸리운_곰 2024.01.02 260
17 [라즈베리파이] 라즈베리파이 에뮬레이터 설치(QEMU) - raspbian jessie (4) - 한글 설정 file 졸리운_곰 2021.07.10 475
16 [라즈베리파이] 라즈베리파이 에뮬레이터 설치(QEMU) - raspbian jessie (3) 최적화 하기(raspi-config) file 졸리운_곰 2021.07.10 208
15 [라즈베리파이] 라즈베리파이 에뮬레이터 설치(QEMU) - raspbian jessie (2) - 이미지 size 늘리기 file 졸리운_곰 2021.07.08 207
14 [라즈베리파이] 라즈베리파이 에뮬레이터 설치(QEMU) - raspbian jessie (1) 프로그램설치 file 졸리운_곰 2021.07.08 209
13 Installing Latest Tensor flow and Keras on RASPBERRY PI file 졸리운_곰 2019.11.12 285
12 라즈베리파이 qemu : Raspberry Pi Emulator for Windows 10 file 졸리운_곰 2019.11.05 678
11 Raspberry Pi 3에 LAMP (Linux, Apache, MySQL, PHP) 설치하는 방법 file 졸리운_곰 2019.10.30 258
10 라즈베리파이에 OpenCV와 텐서플로(Tensorflow) 설치하기 file 졸리운_곰 2019.10.25 435
9 라즈베리파이 아두이노 연동 file 졸리운_곰 2019.10.25 517
8 TensorFlow 1.9 Officially Supports the Raspberry Pi : 라즈베리파이에서의 공식적인 텐서플로 사용 file 졸리운_곰 2019.03.18 304
7 라즈베리파이 Raspberry Pi 3 Model B+ 회로도 : raspberry pi schematic file 졸리운_곰 2019.03.17 1375
6 [Yocto] 욕토 프로젝트의 참고 링크 (학습링크) 졸리운_곰 2015.11.07 563
5 라즈베리파이 강좌모음 링크 file 졸리운_곰 2014.11.11 2938
4 라즈베리파이 클러스터 구축 : Clustering on RaspberryPi.pdf file 졸리운_곰 2014.11.11 658
3 라즈베리 파이 커널 소스 컴파일 하는 방법 졸리운_곰 2014.09.07 617
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED