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.
若有錯誤發生時,則回應兩種錯誤碼,分別是c. 若要實作更新韌體此功能,建議是先從 StartFirmwareUpgrade著手,較為簡單。
另外傳送時,記得要將 content-type 設定為 “application/octet-stream”。
- 韌體有誤 “415 Unsupported Media Type”,
- 更新失敗 “500 Internal Server Error”
2. 如何得知 IPCAM 是否支援 firmware update 機制
當回傳的 GetServiceCapabilitiesResponse 中,有設定下列兩個值,便是有支援 FirmwareUpgrade,如下:
若有 FirmwareUpgrade,表示支援 UpgradeSystemFirmware 命令。
- <tt:FirmwareUpgrade>true</tt:FirmwareUpgrade>
- <tt:HttpFirmwareUpgrade>true</tt:HttpFirmwareUpgrade>
若有 HttpFirmwareUpgrade,表示支援 StartFirmwareUpgrade 命令。
3. 如何驗證 firmware update 是否正確實作。
a. ONVIF Device Manager 會使用 GetCapabilities 來確認 IPCAM 是否有韌體更新的能力。
b. 若回覆 FirmwareUpgrade=true, 會使用 UpgradeSystemFirmware 的方式,進行韌體更新。
其作法是使用 ONVIF 定義的 UpgradeSystemFirmwarec. 若回 HttpFirmwareUpgrade=true, 並無法選擇更新韌體。
HTTP 會送出兩個 multipart part,
第一個是 UpgradeSystemFirmware xml。
第二個是 firmware,要求 IPCAM 進行更新。
註: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