본문 바로가기
아두이노 관련/NodeMCU

NodeMCU - NodeMCU 웹클라이언트 HTTP 접속하기

by Bugwhale 2020. 2. 19.

1. 개요

추후 진행할 프로젝트에서 접속하고자하는 웹서버의 HTTP Response 나 웹페이지에서 필요한 정보를 사용하기 위해서 NodeMCU 보드를 웹클라이언트(WebClient)로서 사용하여 HTTP 사이트 접속방법을 설명합니다.

1.1 요약 정리

마이크로컨트롤러(NodeMCU) 제어보다는 웹에 대한 정보로서 기본지식이 없는 상황이라면 이해하기 어렵습니다. 웹, 특히나 이 글에서는 HTTP 프로토콜까지 설명해야하는데 설명하자면 글이 너무 길어지니 소스코드가 어떻게 동작하는지 큰 맥락만 설명합니다.

1. HTML 언어로 웹페이지 구성 (라즈베리파이)
2. 구성한 웹페이지를 웹서버에 업로드 (라즈베리파이)
3. 라즈베리파이를 Wi-Fi에 연결 (라즈베리파이)
4. 라즈베리파이를 웹서버로 구동 (라즈베리파이)
5. 웹클라이언트 NodeMCU 보드로 웹서버(라즈베리파이)에 웹페이지 요청 (NodeMCU 보드)
6. 웹클라이언트러부터 요청이 오면 웹페이지를 응답 (라즈베리파이)
7. 웹서버로부터 받은 웹페이지 내용을 출력(NodeMcu 보드)

1.2 준비물

  • NodeMCU 개발보드(이 글에서는 NodeMCU v3)
  • Micro 5pin USB

2. 웹서버 만들기(라즈베리파이, 옵션)

필자처럼 라즈베리파이를 이용하여 웹서버를 만들어 테스트하고자 한다면 라즈베리파이 라즈비안 APM(Apache, PHP, MySql, phpMyAdmin) 설치하기 글에서 기본적인 웹서버를 구축하는데 필요한 정보를 얻을 수 있습니다.

2.1 웹페이지 만들기

라즈베리파이 라즈비안 OS 기준으로 설명합니다. 아래 명령어로 http.html 파일을 생성, 편집을 열어줍니다.

sudo nano /var/www/html/http.html

아래 내용을 적어주고 "Ctrl + X", "Y", "Enter" 를 순서대로 눌러줘서 저장합니다.

HTTP Test Webpage

3. 소스코드

3.1 전체 소스코드

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

const char* ssid     = "Wi-Fi 아이디";
const char* password = "Wi-Fi 비밀번호";
const char* host = "Host 주소";

WiFiClient client;
HTTPClient http;

void setup() {
	Serial.begin(115200);
	Serial.println("");
	Serial.print("Connect to ");
	Serial.println(ssid);
	
	WiFi.mode(WIFI_STA);
	WiFi.begin(ssid, password);
	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}
	Serial.print("IP address: ");
	Serial.println(WiFi.localIP());
}

void loop() {
	Serial.printf("Connect to %s\n", host);
	http.begin(client, host);
	http.setTimeout(1000);
	int httpCode = http.GET();

	if(httpCode > 0) {
		Serial.printf("GET code : %d\n\n", httpCode);
		
		if (httpCode == HTTP_CODE_OK) {
			String payload = http.getString();
			Serial.println(payload);
		}
	} 
	else {
		Serial.printf("GET failed, error: %s\n", http.errorToString(httpCode).c_str());
	}
	http.end();

	delay(5000);
}

3.2 소스코드 설명

#include <ESP8266HTTPClient.h>

HTTP 프로토콜을 위해 ESP8266HTTPClient 파일을 Include 해줍니다

const char* ssid     = "Wi-Fi 아이디";
const char* password = "Wi-Fi 비밀번호";
const char* host = "Host 주소";

가장 중요한 부분으로 사용하는 Wi-Fi ID, 비밀번호를 정확하게 입력해줍니다. 그리고 Host 주소에는 접속하고자 하는 http://웹사이트주소를 입력합니다. 이 글에서 설명한 라즈베리파이를 사용한다면 "http://라즈베리파이IP/http.html" 를 입력해주면 됩니다.

HTTPClient http;

http 이름으로 HTTPClient 객체 생성

	Serial.printf("Connect to %s\n", host);

시리얼 모니터에 접속하고자 하는 웹페이지를 출력

	http.begin(client, host);
	http.setTimeout(1000);

begin() 메소드는 host 주소로 접속을 시도하는 메서드로 HTTP Request 과정이라고 보면 됩니다. setTimeout() 메소드는 연결 타임아웃 시간을 설정해주며 설정해준 시간안에 웹페이지에 접속하지 못한다면 더 이상 시도하지 말고 그냥 넘어가라는 의미입니다.

	int httpCode = http.GET();

HTTP Request 를 하면 웹서버에서 요청에 따라 HTTP Code 라는 것을 보내게 되며 GET() 메소드는 HTTP Code 값을 얻어오며 그 값을 int httpCode 변수에 넣어 줍니다.

여기서 HTTP Code 를 응답 상태코드로 예를 들어 200 이라는 값이 반환하면 "응답 성공" 이라는 의미이며 404 값은 "(요청한 페이지를) 찾을 수 없음" 이라는 의미입니다.

if(httpCode > 0) {

HTTP 응답코드가 정상적이라면(404 같은 값도 이 소스코드에서는 기본적으로는 정상이라고 봅니다. 정상이 아니면 0 값이다.)

		Serial.printf("GET code : %d\n\n", httpCode);
		
		if (httpCode == HTTP_CODE_OK) {
			String payload = http.getString();
			Serial.println(payload);
		}

HTTP 응답코드를 시리얼 모니터에 띄워준 뒤 응답코드를 한번 더 비교해줍니다. (여기서 HTTP_CODE_OK 값은 상수값으로 200) 즉, "응답 성공"이라면 getString() 메소드로 웹페이지 내용을 payload에 저장 후 시리얼 모니터에 출력시켜줍니다.

	else {
		Serial.printf("GET failed, error: %s\n", http.errorToString(httpCode).c_str());
	}

HTTP 응답코드가 비정상이라면(0 이하 값) 에러메세지를 시리얼 모니터에 출력시켜줍니다.

	http.end();

end() 메서드로 http 연결을 종료합니다.

4. 동작 결과

빨간상자는 접속한 Wi-Fi 이름과 부여받은 IP 를 나타내고 파란 상자는 "http://192.168.1.100/http.html" 로 접속을 시도함을 알려주며, 응답 결과로 200 코드 값을 얻을 것을 알 수 있습니다. 초록 상자는 위에서 작성한 http.html 파일 내용입니다.

5. 참조

-

댓글