- 전체
- 안드로이드 플랫폼
- 아두이노
- 라즈베리 파이
- 안드로이드 ADK
- Embedded HardWare
- Embedded FirmWare
- Embedded Platform
- Embedded SoftWare
- 임베디드 리눅스
- Hobby Electronics
- 임베디드기사 - 국가기술자격
- VHDL 디지털설계
- M2M_IoT_사물지능통신
- 아마추어 로봇
- EDA - Electronic CAD
- 로봇공학
- 국가기술자격 로봇 제작 개발 자격증
- IoT (임베디드 인터넷)
아두이노 아두이노를 이용한 미니 웹 서버 만들기 - 예제 분석
2017.08.03 22:43
아두이노를 이용한 미니 웹 서버 만들기 - 예제 분석
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. 아두이노 이더넷 예제
아두이노 코드를 보시면, 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/
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 1 | KiCAD: Advanced Tutorials:Arduino UNO with KiCAD | 졸리운_곰 | 2017.08.02 | 582 |


