Microsoft MVP성태의 닷넷 이야기
사물인터넷: 52. New NodeMCU v3(ESP8266)의 http 통신 [링크 복사], [링크+제목 복사],
조회: 21379
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 3개 있습니다.)

New NodeMCU v3(ESP8266)의 http 통신

지난번에 ESP8266 보드에 대한 간단한 코딩을 해봤는데요.

New NodeMCU v3 아두이노 호환 보드의 기본 개발 환경 구성
; https://www.sysnet.pe.kr/2/0/11595

New NodeMCU v3 아두이노 호환 보드의 내장 LED 및 입력 핀 사용법
; https://www.sysnet.pe.kr/2/0/11605

사실 NodeMCU의 가장 큰 장점은 WiFi 지원이므로 이를 위한 소켓 통신 - 그중에서도 HTTP 통신을 빼놓을 수 없습니다. 지난 글에서 WiFiServer 클래스를 이용해 웹 서버로 동작하는 간단한 코드를 작성해 봤으니, 이번에는 WiFiClient를 이용한 다른 웹 서버로의 접속을 간단하게 작성해 봤습니다.

// [참고 소스 코드] esp8266/Arduino
// https://github.com/esp8266/Arduino/blob/master/doc/esp8266wifi/client-examples.rst

#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServer.h>
#include <WiFiServerSecure.h>
#include <WiFiUdp.h>

const char *ssid = "...무선 ssdi...";
const char *password = "...무선 password..."; 
int _buildLedPin = 2;

void setup()
{
  Serial.begin(115200);
  delay(10);

  Serial.printf("%d: Connecting to %d\n", millis(), ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.print(".");
  }

  Serial.printf("\n%d: WiFi connected: %s\n", millis(), WiFi.localIP().toString().c_str());
  pinMode(_buildLedPin, OUTPUT);
}

void loop()
{
  WiFiClient client;
  String host = "www.naver.com";

  bool connected = client.connect(host, 80);

  Serial.printf("%d: Connected - %d\n", millis(), connected);

  do
  {
    if (connected == false)
    {
      break;
    }

    client.print(String("GET /") + " HTTP/1.1\r\n" + 
            "Host: " + host + "\r\n" +
            "Connection: close\r\n" + "\r\n");

    int readBytes = 0;
    while (client.connected() == 1)
    {
      if (client.available())
      {
        // 아래의 코드 영역만 원하는 용도에 맞게 재구성
        String line = client.readStringUntil('\n');
        readBytes += line.length();
      }
    }

    Serial.printf("%d: # of recv bytes: %d\n", millis(), readBytes);

    Blink(2000);
  } while (false);

  client.stop();
}

void Blink(int ledOnTime)
{
  digitalWrite(_buildLedPin, LOW);
  delay(ledOnTime);
  digitalWrite(_buildLedPin, HIGH);
  delay(ledOnTime);
}

(첨부 파일은 이 글의 예제를 vscode 양식으로 포함합니다.)




개발 환경으로 Visual Studio Code를 사용하는 경우, 빌드 후 배포한 다음 소스 코드 변경 없이 다시 Verify나 Upload를 하게 되면 다음과 같은 경고를 보게 됩니다.

[Warning] Output path is not specified. Unable to reuse previously compiled files. Upload could be slow. See README.

왜냐하면, Visual Studio Code는 "Output" 경로가 명시되어 있지 않으면 임시 폴더를 사용하게 되고 이게 빌드 때마다 생성하기 때문에 전체적으로 바이너리 생성 속도가 상당히 느립니다. 사용하게 되는 임시 폴더의 경로는 빌드 출력 결과에 보면 다음과 같은 식으로 찾을 수 있습니다. (빌드 완료 후 해당 폴더는 삭제됩니다.)

Uploading 262496 bytes from %LOCALAPPDATA%\Temp\arduino_build_200452/http_get.ino.bin to flash at 0x00000000

빌드 중간 결과물을 보존하게 되면 이후의 빌드에서 좀 더 빠르게 작업이 진행되는데 이를 위해 arduino.json 파일의,

./.vscode/arduino.json

설정에 "output" 항목을 다음과 같이 추가하면 됩니다.

{
    "sketch": "http_get.ino",
    "board": "esp8266:esp8266:d1",
    "configuration": "CpuFrequency=80,...[생략]...",
    "port": "COM3",
    "output": "../build"
}

쉽게 말해, output 설정은 거의 필수 항목이라고 봐도 무방합니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 5/5/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
11859정성태4/4/201920546디버깅 기술: 125. WinDbg로 EXE의 EntryPoint에서 BP 거는 방법
11858정성태3/27/201921394VC++: 129. EXE를 LoadLibrary로 로딩해 PE 헤더에 있는 EntryPoint를 직접 호출하는 방법파일 다운로드1
11857정성태3/26/201919312VC++: 128. strncpy 사용 시 주의 사항(Linux / Windows)
11856정성태3/25/201919553VS.NET IDE: 134. 마이크로소프트의 CoreCLR 프로파일러 리눅스 예제를 Visual Studio F5 원격 디버깅하는 방법 [1]파일 다운로드1
11855정성태3/25/201921678개발 환경 구성: 436. 페이스북 HTTPS 인증을 localhost에서 테스트하는 방법
11854정성태3/25/201917383VS.NET IDE: 133. IIS Express로 호스팅하는 사이트를 https로 접근하는 방법
11853정성태3/24/201920077개발 환경 구성: 435. 존재하지 않는 IP 주소에 대한 Dns.GetHostByAddress/gethostbyaddr/GetNameInfoW 실행이 느리다면? - 두 번째 이야기 [1]
11852정성태3/20/201919453개발 환경 구성: 434. 존재하지 않는 IP 주소에 대한 Dns.GetHostByAddress/gethostbyaddr/GetNameInfoW 실행이 느리다면?파일 다운로드1
11851정성태3/19/201923243Linux: 8. C# - 리눅스 환경에서 DllImport 대신 라이브러리 동적 로드 처리 [2]
11850정성태3/18/201922124.NET Framework: 813. C# async 메서드에서 out/ref/in 유형의 인자를 사용하지 못하는 이유
11849정성태3/18/201921583.NET Framework: 812. pscp.exe 기능을 C#으로 제어하는 방법파일 다운로드1
11848정성태3/17/201918227스크립트: 14. 윈도우 CMD - 파일이 변경된 경우 파일명을 변경해 복사하고 싶다면?
11847정성태3/17/201922764Linux: 7. 리눅스 C/C++ - 공유 라이브러리 동적 로딩 후 export 함수 사용 방법파일 다운로드1
11846정성태3/15/201921371Linux: 6. getenv, setenv가 언어/운영체제마다 호환이 안 되는 문제
11845정성태3/15/201921583Linux: 5. Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency) [3]
11844정성태3/14/201922869개발 환경 구성: 434. Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정 [1]파일 다운로드1
11843정성태3/14/201917827기타: 75. MSDN 웹 사이트를 기본으로 영문 페이지로 열고 싶다면?
11842정성태3/13/201916253개발 환경 구성: 433. 마이크로소프트의 CoreCLR 프로파일러 예제를 Visual Studio CMake로 빌드하는 방법 [1]파일 다운로드1
11841정성태3/13/201916555VS.NET IDE: 132. Visual Studio 2019 - CMake의 컴파일러를 기본 g++에서 clang++로 변경
11840정성태3/13/201918127오류 유형: 526. 윈도우 10 Ubuntu App 환경에서는 USB 외장 하드 접근 불가
11839정성태3/12/201922072디버깅 기술: 124. .NET Core 웹 앱을 호스팅하는 Azure App Services의 프로세스 메모리 덤프 및 windbg 분석 개요 [3]
11838정성태3/7/201925629.NET Framework: 811. (번역글) .NET Internals Cookbook Part 1 - Exceptions, filters and corrupted processes [1]파일 다운로드1
11837정성태3/6/201939643기타: 74. 도서: 시작하세요! C# 7.3 프로그래밍 [10]
11836정성태3/5/201923152오류 유형: 525. Visual Studio 2019 Preview 4/RC - C# 8.0 Missing compiler required member 'System.Range..ctor' [1]
11835정성태3/5/201921685.NET Framework: 810. C# 8.0의 Index/Range 연산자를 .NET Framework에서 사용하는 방법 및 비동기 스트림의 컴파일 방법 [3]파일 다운로드1
11834정성태3/4/201920548개발 환경 구성: 432. Visual Studio 없이 최신 C# (8.0) 컴파일러를 사용하는 방법
... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...