본문 바로가기

애플리케이션 개발/HRC(Home Remote Control)

4-1. Node MCU를 통해 Web Scraping해서 정보 가져오기

Node MCU를 통해 Web page의 HTML문을 받아오는 것은 지난 포스팅을 참고하면 될

것이다. (taeminator1.tistory.com/15?category=924221)

이제 받아온 HTML문에서 원하는 정보를 가져와 보자. 

 

Examples의 BasicHTTPClient에서 약간의 수정이 필요하다. 

먼저, setup()에서 Node MCU에 내장되어 있는 LED Indicator pin을 출력 핀으로 할당해 주고, 초기 값을 0으로 세팅하였다. (0일 때, LED가 켜진다)

그다음, loop()를 수정해야 한다. Wep page를 기준으로 통신을 하기 때문에, Web page에 있는 check box의 상태를 담을 수 있는 buttonState를 boolean 배열로 선언하여 초기값은 false로 할당하였다. 그리고 반복문을 통해 HTML문의 특정  String을 찾고, check box의 상태를 buttonState에 저장한다. 아래 코드를 보면 알겠지만, 이전 포스팅 2-2(taeminator1.tistory.com/14)에서 살펴본 코드와 거의 유사한 것을 알 수 있다. 

buttonState를 눈으로 확인하기 위해 setup()에서 할당했던 LED를 buttonState에 따라 변하게 코드를 추가하였다. 그리고 지연시간도 10초에서 5초로 바꿔 주었다. 

 

수정된 코드는 다음과 같다. 

 

MutatedBasicHTTPClient.ino

void setup() {

  ...
  
  Serial.println();

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 0);
  
  ...
  
}

void loop() {
  // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    ...
    
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
          String payload = http.getString();
//          Serial.println(payload);

          boolean buttonState[2] = {false, false};
          int index = 0;
          for (int i = 0; i < payload.length(); i++) {
            if(payload.charAt(i) == '\"' && 
                payload.charAt(i + 1) == 'l' && 
                payload.charAt(i + 2) == 'a' && 
                payload.charAt(i + 3) == 'b' && 
                payload.charAt(i + 4) == 'e' && 
                payload.charAt(i + 5) == 'l') {
                  
              String buff = "false";
              buff = payload.substring(i + 10, i + 15);
              if (buff == "true ") {
                buttonState[index] = true;
              } else {
                buttonState[index] = false;
              }
              
              index++;
              if (index == 2) {
                index = 0;
                break;
              }
            }
          }
          digitalWrite(LED_BUILTIN, buttonState[0]);
        }
      } 
      
      ...
      
  }
  delay(5000);
}

 

업로드를 하면 Web page의 버튼 상태에 따라 Node MCU에 있는 LED가 변하는 것을 관찰할 수 있다. 딜레이 시간이 있어, LED가 바로바로 반응하진 않지만, 프로젝트를 수행하는데 큰 상관은 없어 보인다. 

 

 

이제 핀을 할당하여, buttonState에 따라 각각의 동작을 구현하면 된다.