본문 바로가기
Study/ESP8266(WIFI),ESP32(BLE,WIFI)

ESP8266 OTA(Over The Air) 사용하기 - 업데이트하기

by Answer Choi 2019. 3. 18.
반응형


참고 소스코드



저번에 OTA 준비작업을 하였다면 이번에는 실제로 업데이트를 해보겠습니다.


저번과 조금은 방법을 바꿔서 해보도록 하겠습니다.



부팅할때마다 서버에 파일업데이트를 확인하는 방법입니다.


그러기 위해서 소스에서 버전관리를 해줘야 합니다.


1
2
String version="sensorview 1";
String nextVersion="esp8266/sensorview2.bin";
cs


이런식으로 현재버전과 앞으로 업데이트 할 버전을 관리합니다.


그리고 서버쪽에는 업데이트 할 버전의 파일을 만들어서 넣어두면


부팅시 접속하여 업데이트 할 버전의 파일을 다운로드 합니다.


물론 새 버전에서는 위의 버전을 한단계씩 바꿔줘야 합니다.


ota를 할 함수는 재부팅시마다 실행되는데


ota 코드는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String updateAddr="http://Server Address/"+nextVersion;
    
    t_httpUpdate_return ret = ESPhttpUpdate.update(updateAddr);
    switch (ret) {
          case HTTP_UPDATE_FAILED:
            debug.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
            debug.println("");
            break;
    
          case HTTP_UPDATE_NO_UPDATES:
            debug.println("HTTP_UPDATE_NO_UPDATES");
            break;
    
          case HTTP_UPDATE_OK:
            debug.println("HTTP_UPDATE_OK");
            break;
        }
cs


Line 1 : OTA 파일 확인을 위한 주소입니다.


이제 컴파일및 다운로드를 합니다.


주의할 점은 flash size를 올바르게 설정해줘야 합니다.



제가 사용한 칩은 wroom-02인데 내부 플래쉬가 2M입니다.


그렇다 보니 Flash size를 2M로 설정해 줍니다.



다운로드가 완료된 후 디버깅 로그를 보면 파일이 없다고 나옵니다.


아직은 업데이트 할 파일이 서버에 없어서 그렇습니다.


서버에 파일을 복사한 후 다시 재부팅 합니다.



별도의 에러메세지가 나타나지 않고 잠깐 동안 딜레이가 걸리는데


파일을 다운로드하고 설치하는 시간입니다.


중간쯤 2칸이 비워져 있는 부분입니다.


그리고 재부팅이 됩니다.



재부팅이 되면 버전이 2로 바뀌어 있는 것을 볼 수 있습니다.


그리고 다음 버전은 없으므로 파일을 찾을 수 없다고 나타납니다.


P.S 만약 403에러가 나타난다면 서버쪽에 방화벽으로 인해


파일에 접근할 수 있는 권한이 없는 경우이므로 방화벽을 풀어주세요.~



추가로 ide Size 가져오는 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uint32_t realSize = ESP.getFlashChipRealSize();
uint32_t ideSize = ESP.getFlashChipSize();
FlashMode_t ideMode = ESP.getFlashChipMode();
    
debug.printf("Flash real id:     %08X\n", ESP.getFlashChipId());
debug.printf("Flash real size: %u bytes\n\n", realSize);
    
debug.printf("Flash ide  size: %u bytes\n", ideSize);
debug.printf("Flash ide speed: %u Hz\n", ESP.getFlashChipSpeed());
debug.printf("Flash ide mode:  %s\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN"));
    
if (ideSize != realSize) {
    debug.println("Flash Chip configuration wrong!\n");
else {
    debug.println("Flash Chip configuration ok.\n");
}
cs


반응형

인기글