iot remote update · ota updates · iot firmware
IoT remote update OTA 테스트 방법: ESP8266 firmware.bin 생성부터 웹서버 업로드까지
원격 업데이트(remote update) OTA를 실제로 테스트하는 방법이다. ESP8266 또는 ESP32를 USB로 매번 연결하지 않고, 웹서버에 올린 firmware.bin을 장치가 내려받아 업데이트하는 흐름을 만든다.
1. 준비물
보드
ESP8266 NodeMCU, Wemos D1 mini, ESP-01 또는 ESP32 계열 보드. 처음 1회는 USB로 OTA 지원 펌웨어를 올려야 합니다.
개발도구
Arduino IDE 또는 PlatformIO. Arduino IDE에서는 Export compiled Binary, PlatformIO에서는 pio run으로 bin 파일을 만든다.
웹서버
HTTPS가 가능한 Apache, Nginx, PHP 호스팅 또는 정적 파일 서버. 테스트는 HTTP도 가능하지만 운영은 HTTPS 권장.
업로드 파일
firmware.bin, version.txt, 선택적으로 manifest.json. 장치는 version.txt를 보고 업데이트 여부를 판단합니다.
2. OTA 소스코드 준비
아래 코드는 ESP8266 기준이다. 핵심은 현재 버전과 서버의 version.txt를 비교하고, 다르면 firmware.bin을 내려받아 OTA 업데이트를 실행하는 것이다.
"tok-pre">#include <ESP8266WiFi.h> "tok-pre">#include <ESP8266HTTPClient.h> "tok-pre">#include <ESP8266httpUpdate.h> "tok-key">const "tok-key">char* WIFI_SSID = "YOUR_WIFI"; "tok-key">const "tok-key">char* WIFI_PASS = "YOUR_PASSWORD"; "tok-key">const "tok-key">char* CURRENT_VERSION = "1.0.0"; "tok-key">const "tok-key">char* VERSION_URL = "https://example.com/iot/ota/version.txt"; "tok-key">const "tok-key">char* FIRMWARE_URL = "https://example.com/iot/ota/firmware.bin"; "tok-key">void "tok-fn">setup() { Serial."tok-fn">begin(115200); WiFi."tok-fn">mode(WIFI_STA); WiFi."tok-fn">begin(WIFI_SSID, WIFI_PASS); "tok-key">while (WiFi.status() != WL_CONNECTED) { "tok-fn">delay(500); Serial.print("."); } "tok-fn">checkOtaUpdate(); } "tok-key">void "tok-fn">loop() { // 실제 센서 측정이나 장치 동작 코드를 여기에 둔다. } "tok-key">void "tok-fn">checkOtaUpdate() { WiFiClientSecure client; client.setInsecure(); // 테스트용. 운영에서는 인증서 지문 또는 CA 검증 권장. HTTPClient http; http."tok-fn">begin(client, VERSION_URL); "tok-key">int code = http."tok-fn">GET(); "tok-key">if (code != HTTP_CODE_OK) { Serial."tok-fn">printf("version check failed: %d\n", code); http."tok-fn">end(); "tok-key">return; } "tok-key">String latest = http.getString(); latest."tok-fn">trim(); http."tok-fn">end(); Serial."tok-fn">printf("current=%s latest=%s\n", CURRENT_VERSION, latest.c_str()); "tok-key">if (latest == CURRENT_VERSION) { Serial."tok-fn">println("already latest"); "tok-key">return; } ESPhttpUpdate.setLedPin(LED_BUILTIN, LOW); t_httpUpdate_return result = ESPhttpUpdate."tok-fn">update(client, FIRMWARE_URL); "tok-key">switch (result) { "tok-key">case HTTP_UPDATE_FAILED: Serial."tok-fn">printf("OTA failed: %s\n", ESPhttpUpdate.getLastErrorString().c_str()); "tok-key">break; "tok-key">case HTTP_UPDATE_NO_UPDATES: Serial."tok-fn">println("no update"); "tok-key">break; "tok-key">case HTTP_UPDATE_OK: Serial."tok-fn">println("updated, rebooting"); "tok-key">break; } }
ESP32는 헤더가 #include <HTTPUpdate.h> 계열로 바뀌며, 업데이트 호출도 사용하는 코어 버전에 따라 약간 다르다. 검색 유입을 고려하면 글 제목에는 ESP8266 OTA, ESP32 OTA, iot firmware를 함께 넣는 것이 좋다.
3. firmware.bin 파일 생성법
Arduino IDE에서 생성
- 보드와 포트를 선택합니다. 예: NodeMCU 1.0 또는 LOLIN(WEMOS) D1 mini.
- OTA 코드에서
CURRENT_VERSION을 새 버전으로 수정합니다. 예:1.0.1. - 메뉴에서 Sketch → Export Compiled Binary를 실행합니다.
- 스케치 폴더 또는 build 폴더에 생성된
.bin파일을 찾습니다. - 파일명을 웹서버에서 쓰기 쉽게
firmware.bin으로 바꿉니다.
PlatformIO에서 생성
pio run # 생성 위치 예시 .pio/build/nodemcuv2/firmware.bin
4. 웹서버에 업로드할 파일
가장 단순한 구조는 아래와 같다. 장치는 version.txt를 먼저 읽고, 버전이 다르면 firmware.bin을 받는다.
/var/www/html/iot/ota/ firmware.bin version.txt manifest.json
version.txt에는 한 줄만 넣습니다.
1.0.1
여러 장치군을 관리하려면 manifest.json을 두고 모델명, 버전, 파일 URL을 함께 관리합니다.
{ "device": "esp8266-test-node", "version": "1.0.1", "firmware": "https://example.com/iot/ota/firmware.bin", "notes": "OTA update test build" }
5. OTA 테스트 방법
- 처음 1회는 USB로 OTA 기능이 들어간 펌웨어를 업로드합니다.
- 웹서버에
version.txt와firmware.bin을 올립니다. - 브라우저에서
https://example.com/iot/ota/version.txt와firmware.bin이 열리는지 확인합니다. - ESP8266을 재부팅합니다.
- 시리얼 모니터에서 현재 버전과 서버 버전이 비교되는지 확인합니다.
- 업데이트가 성공하면 보드가 자동 재부팅됩니다.
- 다음 부팅에서
CURRENT_VERSION이 서버 버전과 같으면 업데이트를 건너뛰어야 정상입니다.
6. 실패할 때 보는 체크리스트
| 증상 | 확인할 것 |
|---|---|
| version check failed | URL 오타, HTTPS 인증서, 방화벽, 웹서버 권한 |
| OTA failed: not enough space | 플래시 크기와 파티션, ESP8266 OTA 공간 부족 |
| 재부팅 반복 | 새 펌웨어의 Wi-Fi 설정, 전원 불안정, 예외 발생 |
| bin 다운로드는 되는데 업데이트 실패 | 보드 종류 불일치, 잘못된 빌드 환경, 파일 손상 |
7. 운영 전에 추가할 것
실서비스용 IoT 원격 업데이트는 단순히 파일을 내려받는 것으로 끝나면 안 됩니다. 최소한 장치별 권한키, 버전 롤백, 업데이트 로그, 실패율 확인, 배터리 잔량 조건, 전원 안정성 체크가 필요합니다. 특히 현장 장비는 OTA 실패 시 직접 회수해야 할 수 있으므로, 작은 테스트 장치에서 충분히 검증한 뒤 적용해야 합니다.