2013年5月15日 星期三

ONVIF -- Update System Firmware


1. ONVIF 設計了兩個命令,可用來更新系統韌體,分別是 UpgradeSystemFirmware 與 StartFirmwareUpgrade。
a. UpgradeSystemFirmware
其作法是使用 HTTP Post 送出一個 UpgradeSystemFirmware Request,直接將 Firmware 以 MTOM 的編碼方式放在此 http 封包中,傳送給 IPCAM,進行韌體更新。MTOM簡介可參考這裡


b. StartFirmwareUpgrade
依照下列五個步驟進行韌體更新
  • 1. Client calls StartFirmwareUpgrade.
  • 2. Device service responds with upload URI and optional delay value.
  • 3. Client waits for delay duration if specified by server.
  • 4. Client transmits the firmware image to the upload URI using HTTP POST.
  • 5. Server reprograms itself using the uploaded image, then reboots. 
若有錯誤發生時,則回應兩種錯誤碼,分別是
  • 韌體有誤 “415 Unsupported Media Type”, 
  • 更新失敗 “500 Internal Server Error”
另外傳送時,記得要將 content-type 設定為 “application/octet-stream”。
c. 若要實作更新韌體此功能,建議是先從 StartFirmwareUpgrade著手,較為簡單。


2. 如何得知  IPCAM 是否支援 firmware update 機制
當回傳的 GetServiceCapabilitiesResponse 中,有設定下列兩個值,便是有支援 FirmwareUpgrade,如下:
  • <tt:FirmwareUpgrade>true</tt:FirmwareUpgrade>         
  • <tt:HttpFirmwareUpgrade>true</tt:HttpFirmwareUpgrade>
若有 FirmwareUpgrade,表示支援 UpgradeSystemFirmware 命令。
若有 HttpFirmwareUpgrade,表示支援 StartFirmwareUpgrade 命令。


3. 如何驗證 firmware update 是否正確實作。
a. ONVIF Device Manager 會使用 GetCapabilities 來確認 IPCAM 是否有韌體更新的能力。 
b. 若回覆 FirmwareUpgrade=true, 會使用 UpgradeSystemFirmware 的方式,進行韌體更新。
其作法是使用 ONVIF 定義的 UpgradeSystemFirmware
HTTP 會送出兩個 multipart part,
第一個是 UpgradeSystemFirmware xml。
第二個是 firmware,要求 IPCAM 進行更新。
c. 若回 HttpFirmwareUpgrade=true, 並無法選擇更新韌體。 

註:Spec規定傳送的 Firmware 應該要使用 MTOM 編碼,但實際測試發現也有使用其他編碼傳送的例子,因此針對此部分,實作時還是應該要判斷 HTTP content-encoding,進行對應的decode以避免錯誤。


參考資料
1. http://sourceforge.net/projects/onvifdm/
2. ONVIF-Core-Specification-v221.pdf
    chapter 8.3.9 Firmware upgrade
    chapter 8.3.10 Start firmware upgrade