Study/ESP8266(WIFI),ESP32(BLE,WIFI)

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

Answer Choi 2019. 3. 18. 16:42
반응형


참고 소스코드



저번에 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


반응형