2012年7月18日 星期三

ONVIF 互通問題彙整分析

2012-07-19 更新

1. 取得 Image 屬性的方法

摘錄 ONVIF-Imaging-Service-Spec-v220.pdf  內容如下:
The available imaging settings can be retrieved through the GetVideoSources command part of the media service.  
If the Video Source supports any of the imaging settings as defined by the ImagingSettings type in the [ONVIF Schema], then it should be possible to retrieve the imaging settings from the device through the GetImagingSettings command



因此欲取得 Imaging 相關資訊(例如:Contrast, Brightness, Saturation, ...),可以使用兩種方式,分別是 GetVideoSources 或是 GetImagingSettings   
  • GetVideoSources,參考 media.wsdl, Imaging 相關參數屬於 optional,可以分別取得 ImagingSettings 與 ImagingSettings20。
  • GetImagingSettings參考 imaging.wsdl (Imaging 2.0), Imaging 參數也都屬於 optional, ImagingSettings20
實作建議: 
  • IPCam 應該同時支援這兩個 API,並且回復支援的 Image 屬性以供設定。 
  • NVR 則可以選擇其中一個 API 以取得 Image 屬性,或是同時使用兩個API。



2. 選擇與 IPCam 溝通的位址
參考 ONVIF-Core-Specification-v211.pdf,devicemanagement.wsdl 與 RFC3927
The default device configuration shall have both DHCP and dynamic link-local (stateless) address configuration enabled. Even if the device is configured through a static address configuration it should have the link-local address default enabled.
When a device is connected to an IPv4 network, address assignment priorities (link local versus routable address) should be done as recommended in [RFC3927]. 

ONVIF 定義 IPCam 可以支援 zero configuration、DHCP,或手動設定IP。因此以IPv4而言,針對 GetNetworkInterfacesResponse 回應的位址,可能會分別放在三處 Manual、LinkLocal與DHCP,參考下圖。

根據 ONVIF 的說明,IPCam會回的位址組合

  • FromDHCP + LinkLocal   
  • Manual + LinkLocal 
  • LinkLocal 

當 NVR 收到 GetNetworkInterfacesResponse 時,判斷要使用哪組 IP 的順序則是
  • 先判斷是否有 FromDHCP  
  • 檢查是否存在 Manual
  • 若兩者皆無,則使用 LinkLocal (169.254.1.0 through 169.254.254.255)。

3. 無法新增錄影的可能原因
曾經遇過一種情況,可以 preview IPCam 影像,但實際要進行錄影時卻失敗。其原因是因為錄影時會同時錄製影像與聲音,聲音部分沒有正確設定所導致。
例如:無法從 GetStreamUri 中取得 audio uri 

4. 檢查 IPCam 認證機制的方法
一般支援 ONVIF 的 IPCAM 應該要完全按照 ONVIF spec 規範實作。但許多IPCAM並未完全依照規範實作。因此需要一個方法來判斷IPCam使用哪種認證方式。我將其分種三種

  • 總是認證
  • 總是不認證
  • 遵從 ONVIF 規範,根據 Services 類型決定是否需要認證。

參考某家 NVR 的作法,其判別作法是先不帶帳號密碼,分別使用 GetNetworkInterface (ONVIF定義此需要認證),接著使用GetSystemDateAndTime (ONVIF定義此需要認證)。
若兩者皆收到正確回覆,表示此機型總是不需要認證。 
若兩者皆收到 FAULT 回覆,表示此機型總是需要認證。 
若GetNetworkInterface收到 FAULT 回覆,GetSystemDateAndTime收到正確回覆,表示此機型符合 ONVIF 規範的認證機制。

5. SetVideoEncoder 時間過長的問題
某些機型,當切換 codec 時會需要較長的時間,例如:20秒,如此一來,當使用者送出 SetVideoEncoderXXXRequest之後,便可能需要等待20秒才能收到 Response。
實際測試發現,NVR對於每個 Request 會設定一個預設的 timeout value ,例如:5秒 。因此在 IPCam 回應之前,NVR便會認為此次 Request timeout,開始進行後續的錯誤處理行為。
對於此種狀況,建議 IPCAM 的行為是收到 Request 之後,便設定一個 flag=true,此時收到任何與Video有關的Request都回 FAULT,待送出 Response 之後,設定 flag=false,此時才允許接收其他 Request。
問題現象可參考下列log


6. ToBeContinue