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

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/

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
53 라즈베리파이에 OpenCV와 텐서플로(Tensorflow) 설치하기 file 졸리운_곰 2019.10.25 435
52 라즈베리파이 아두이노 연동 file 졸리운_곰 2019.10.25 517
51 홈파이: 텔레그램으로 제어하는 홈 오토메이션 (명령어 리스트) 졸리운_곰 2019.10.25 682
50 홈파이: 텔레그램 메신저로 제어하는 홈 오토메이션 file 졸리운_곰 2019.10.25 417
49 TensorFlow 1.9 Officially Supports the Raspberry Pi : 라즈베리파이에서의 공식적인 텐서플로 사용 file 졸리운_곰 2019.03.18 304
48 라즈베리파이 Raspberry Pi 3 Model B+ 회로도 : raspberry pi schematic file 졸리운_곰 2019.03.17 1375
47 로봇공학 : 기 초 file 졸리운_곰 2019.03.17 361
46 아두이노 우노 를 이용한 부트로더 굽기 ATMEGA328 file 졸리운_곰 2018.01.04 475
45 아두이노 부트로더 굽기(Arduino boorloader burning) file 졸리운_곰 2018.01.04 526
44 임베디드 기사 합격하셨는데요 어떻게 준비를해서 합격하겼나요 졸리운_곰 2017.12.28 610
43 2008 디지털제어산업기사 최종합격! file 졸리운_곰 2017.08.27 371
42 아두이노를 이용한 미니 웹 서버 만들기 - LED 제어 file 졸리운_곰 2017.08.03 494
» 아두이노를 이용한 미니 웹 서버 만들기 - 예제 분석 file 졸리운_곰 2017.08.03 596
40 아두이노를 이용한 미니 웹 서버 만들기 - 시작하기 file 졸리운_곰 2017.08.03 431
39 CSEduino : 아두이노 호환 : PCB 주문하여 납땜 조립가능 소형 보드 file 졸리운_곰 2017.08.02 441
38 KiCAD: Advanced Tutorials:Arduino UNO with KiCAD 졸리운_곰 2017.08.02 582
37 Top PCB Design Software Tools for Electronics Engineers: 46 Must-Have Tools to Streamline PCB Design file 졸리운_곰 2017.07.22 1623
36 회로 시뮬레이션 및 아두이노 시뮬레이터 Autodesk의 123D Circuits file 졸리운_곰 2017.06.10 794
35 '입문자용 로봇키트 Best 10' / '로보틱스트렌드 닷컴' 발표 file 졸리운_곰 2017.04.10 342
34 브레드보드 위에 아두이노 만들기- Arduino Breadboard DIY file 졸리운_곰 2016.11.20 671
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED