Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

Firmware Over-The-Air

Over-the-air programming(OTA)는 모바일폰, 셋탑박스, IoT 등의 디바이스에서, 설정데이터와 소프트웨어 등을 배포하기 위해 사용하는 다양한 방법들이다. 최신의 스마트폰들은 운영체제에 내장된 무선 업데이트 기능을 이용해서 USB등을 이용해서 컴퓨터에 연결하는 대신 무선 인터넷을 이용해서 소프트웨어 업데이트를 수행 할 수 있다. FOTA는 펌웨어를 OTA 방식으로 업데이트하는 기술이다.

구현

구현하는 사람 맘이다. 나름대로 구현 아이디어를 짜볼 생각이다.

Delta Update

전송되는 데이터의 크기를 줄이기 위해서 Delta Update기능을 가져야 할 것이다. 대량의 디바이스들을 관리하는 IoT 산업에서 중요한 기술일 것이다.

델타 업데이트는 소프트웨어 버전 변경시, 전체 소프트웨어를 다운로드 하는 대신에 변경된 점만 다운로드 해서 새 버전을 만드는 기술이다.

 FOTA 방식

직접 구현할 필요 없다. xdelta를 이용해서 만들어보자.

xdelta

xdelta는 오픈소스 binary diff 프로그램 툴이다. 이 툴을 이용하면 바이너리 파일의 변경점을 기록할 수 있고, 이 파일을 이용해서 원본으로 부터 새로운 파일을 복원 할 수 있다. 아래와 같이 "version 0.1" 프로그램을 만들어서 컴파일 한 후 바이너리 파일을 배포했다. 파일의 이름은 calc.go다.
package main

import "fmt"

func main() {
    fmt.Println("version 0.1")
    fmt.Println(sum(1, 3))
}

func sum(a, b int) int {
    return a + b
}
그런데 diff함수를 포함한 version 0.2를 개발해서 배포를 하게 됐다.
package main

import "fmt"

func main() {
    fmt.Println("version 0.2")
    fmt.Println(sum(1, 3))
    fmt.Println(diff(1, 3))
}

func sum(a, b int) int {
    return a + b
}
func diff(a, b int) int {
    return a - b
}
두 개 파일을 컴파일 한 결과 바이너리 파일의 크기는 아래와 같다. 파일의 크기는 같지만 다른 버전의 파일이다.
# ls -al hello.v.0.*
-rwxrwxr-x 1 yundream yundream 1860009 11월 27 23:49 hello.v.0.1
-rwxrwxr-x 1 yundream yundream 1860009 11월 27 23:49 hello.v.0.2
간단하게 hello.v.0.2 버전을 그대로 업데이트 할 수도 있겠으나 diff 파일을 만들기로 했다. hello.v.0.1 바이너리를 이미 다운로드한 유저는 전체 파일을 다운로드 하는 대신에 diff 파일을 다운로드해서 복원하면 된다.

xdelta 를 이용해서 patch 파일을 만들었다.
# xdelta delta hello.v.0.1 hello.v.0.2 hello.patch
# ls -al hello.delta 
-rw-rw-r-- 1 yundream yundream 1932 11월 27 23:53 hello.patch
19k 크기의 patch 파일을 만들었다. 이제 hello.v.0.1과 hello.patch 파일을 이용해서 hello.v.0.2 파일을 복원해 보자.
# xdelta patch hello.patch hello.v.0.1 hello.new
# ./hello.new
version 0.2
4
-2
복원 성공. 이제 클라이언트는 19k를 다운로드 받는 것으로 소프트웨어를 업데이트 할 수 있다.

버전별 patch 관리

원리적으로는 하나의 원본 파일과 버전별 patch 파일을 유지하는 것으로 FOTA 파일들을 유지 할 수 있다. 하지만 여러번의 업데이트가 발생하므로 좋은 방법은 아니다. 바로 윗 버전의 patch만 유지하거나 몇 개의 patch만 유지하는 식으로 운영을 해야 할 것 같다. 오랫동안 업데이트를 하지 않은 디바이스라면, 최신 원본을 다운로드 받는 등 소프트웨어 업데이트 주기에 따른 응용이 필요한 영역이다.