2012年12月28日 星期五

使用 gSoap 2.8.12 產生 ONVIF 程式碼


20121229 更新

1. gSOAP 最新版本為 2.8.12, 此版本在 FAQ 中註明了 ONVIF 程式產生時的 define namespace prefix and type bindings,如此在開發程式時可有一個統一的命名規則。如下:

tds = "http://www.onvif.org/ver10/device/wsdl" tev = "http://www.onvif.org/ver10/events/wsdl" tls = "http://www.onvif.org/ver10/display/wsdl" tmd = "http://www.onvif.org/ver10/deviceIO/wsdl" timg = "http://www.onvif.org/ver20/imaging/wsdl" trt = "http://www.onvif.org/ver10/media/wsdl" tptz = "http://www.onvif.org/ver20/ptz/wsdl" trv = "http://www.onvif.org/ver10/receiver/wsdl" trc = "http://www.onvif.org/ver10/recording/wsdl" tse = "http://www.onvif.org/ver10/search/wsdl" trp = "http://www.onvif.org/ver10/replay/wsdl" tan = "http://www.onvif.org/ver20/analytics/wsdl" tad = "http://www.onvif.org/ver10/analyticsdevice/wsdl" tdn = "http://www.onvif.org/ver10/network/wsdl" tt = "http://www.onvif.org/ver10/schema"

2012年11月6日 星期二

ONVIF -- SIEMENS Vectis HX add a new device


SIEMENS Vectis HX  add a new device (使用 ONVIF 規範)

|Time     | 192.168.0.28                          |
|         |                   | 192.168.0.10      |                
|43.599738000|         POST /onvif/device_           |HTTP/XML: POST /onvif/device_service HTTP/1.1

2012年10月14日 星期日

gSoap -- 小技巧分享

紀錄使用 gSoap 開發 ONVIF 時所用的一些小技巧。

1. 取出 Client 所送的 HTTP data。
若需要存取HTTP的原始資料,可以直接使用 zsoap->buf, zsoap->buflen 這兩個資料結構。

2012年10月6日 星期六

RTSP -- QuickTime HTTP log


使用 QuickTime 與 sixties.mov 連接
使用的URL 為 rtsp://quicktime.tc.columbia.edu:554/users/lrf10/movies/sixties.mov
QuickTime 設定使用 HTTP 進行連接

==============================
GET /users/lrf10/movies/sixties.mov HTTP/1.0
User-Agent: QuickTime/7.7.1 (qtver=7.7.1;os=Windows NT 6.1)
x-sessioncookie: 76ii3yNZAABRIw0ABIAAAA
Accept: application/x-rtsp-tunnelled
Pragma: no-cache
Cache-Control: no-cache
==============================

RTSP -- QuickTime UDP log


因為所開發的 RTSP 與 QuickTime 互通時有點問題,因此收集 QuickTime log 以供後續分析

使用 QuickTime 與 sixties.mov 連接
使用的URL 為 rtsp://quicktime.tc.columbia.edu:554/users/lrf10/movies/sixties.mov


Log 摘錄如下:

DESCRIBE rtsp://quicktime.tc.columbia.edu:554/users/lrf10/movies/sixties.mov RTSP/1.0
CSeq: 1
Accept: application/sdp
Bandwidth: 512000
Accept-Language: en-GB
User-Agent: QuickTime/7.7.1 (qtver=7.7.1;os=Windows NT 6.1)

2012年9月25日 星期二

ONVIF -- Authentication



ONVIF 的運作過程中,可以分別在 HTTP Level 或是 web service leve 進行使用者認證,根據使用者提供的帳號密碼,可將用戶分成以下四類:
  1. Administrator 
  2. Operator
  3. User
  4. Anonymous
注意:沒有認證的用戶皆歸類於 Anonymous,原文摘錄如下
Unauthenticated users are placed into the anonymous category and a device shall not allow users to be added to the anonymous user level category

2012年9月12日 星期三

The difference between ONVIF Test Tool 11.12 and 12.06

在通過 ONVIF Test Tool 11.12 之後,便想試試看 ONVIF Test Tool 12.06,此時發現測試工具一開始定義 ipcam 的 features 便已經不正確了,無法進行正確的測試。茲將測試時,自己發現的差異處整理如下:

1. 由於初始的 features define 有誤,因此後續的測試範例預期結果會與 11.12 將會不同。
例如:DEVICE-1-1-17,若測試工具所偵測的 features 包含 imaging,則此測試範例預期要成功,否則預期此範例要失敗。

2012年9月4日 星期二

RTP -- interleaved 的用法

基本的 RTSP 協定,在Setup階段會協商兩端之間將使用的 RTP/RTCP port,原則是 RTP port 為偶數,RTCP port = RTP port+1,當傳送RTP/RTCP時分別在建立兩條連線,如下例:(RTP使用3056, RTCP使用3057)
SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0
   CSeq: 1
   Transport: RTP/AVP/UDP;unicast;client_port=3056-3057

但若是RTSP 使用 interleaved 的方式,則後續的RTP/RTCP則可以沿用已經建立的連線,不需要指定對應的埠號,另外建立連線,而是在原來的TCP連線之下,改成使用 channel id 來辨別封包內容為 RTP 或 RTCP,例如:
SETUP rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
  Cseq: 3
  Transport: rtp/avp/tcp; interleaved=0-1

此表示 channel id 0 用來傳送 RTP,channel id 1 用來傳送 RTCP。


2012年8月26日 星期日

[LINUX] 在ubuntu環境編譯 skull 的方法

編譯LDD3書上範例 skull時,遇到了一些問題,茲記錄如下:

程式碼範例下載:http://www.oreilly.com.tw/product_linux.php?id=a184
測試機器編譯環境:Linux 3.2.0-23-generic #36-Ubuntu SMP

書上的範例是適用於 Linux 2.4/2.6 版本的,因此在 3.2.0-23 核心下編譯會造成許多錯誤訊息,以下針對scull的編譯錯誤作一整理說明。

2012年8月8日 星期三

ONVIF event handling



ONVIF Event 主要基於Web Service的兩份標準 [WS-BaseNotification] 和 [WS-Topics] 而制定,分別提供了 PUSH 與 PULL 的方式,讓使用者可取得系統資訊。參考 ONVIF-Core-Specification-v211.pdf chapter9 的內容,整理如後:

一、基本定義
** Event 定義
Event是設備上主動發生或被動產生的事件,IPCam 設備會偵測系統上發生了哪些事件(Event),並讓用戶能夠訂閱此資訊。 
An event is an action or occurrence detected by a device that a client can subscribe to.
** Property 定義
Property是許多值(name value pairs)的結合,並且以 Event 的方式封裝。 
A Property is a collection of name and value pairs representing a unique and addressable set of data. They are uniquely identified by the combination of their Topic, Source and Key values and are packaged like ordinary events. A Property also contains an additional flag, stating whether it is newly created, has changed or has been deleted.

2012年8月6日 星期一

ONVIF -- Exacq NVR add a new device


Exacq NVR 新增IPCame的流程(符合 ONVIF 規範)

|Time     | 192.168.0.169                         |
|         |                   | 192.168.0.92      |                   
|43.555815000|         SetSystemDateAndTim           |SOAP/ONVIF: SetSystemDateAndTime
|         |(49184)  ------------------>  (80)     |
|44.821582000|         SetSystemDateAndTim           |SOAP/ONVIF: SetSystemDateAndTimeResponse
|         |(49184)  <------------------  (80)     |
|44.855474000|         GetDeviceInformatio           |SOAP/ONVIF: GetDeviceInformation
|         |(49185)  ------------------>  (80)     |
|45.300501000|         GetDeviceInformatio           |SOAP/ONVIF: GetDeviceInformationResponse
|         |(49185)  <------------------  (80)     |
|45.302059000|         GetNetworkInterface           |SOAP/ONVIF: GetNetworkInterfaces
|         |(49186)  ------------------>  (80)     |
|46.105645000|         GetNetworkInterface           |SOAP/ONVIF: GetNetworkInterfacesResponse
|         |(49186)  <------------------  (80)     |
|46.111014000|         GetRelayOutputs               |SOAP/ONVIF: GetRelayOutputs
|         |(49187)  ------------------>  (80)     |
|46.719881000|         GetRelayOutputsResp           |SOAP/ONVIF: GetRelayOutputsResponse
|         |(49187)  <------------------  (80)     |
|46.721747000|         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |(49188)  ------------------>  (80)     |
|47.218333000|         GetCapabilitiesResp           |SOAP/ONVIF: GetCapabilitiesResponse
|         |(49188)  <------------------  (80)     |
|47.220273000|         GetProfiles                   |SOAP/ONVIF: GetProfiles
|         |(49189)  ------------------>  (80)     |
|48.472021000|         GetProfilesResponse           |SOAP/ONVIF: GetProfilesResponse
|         |(49189)  <------------------  (80)     |
|48.475146000|         GetVideoEncoderConf           |SOAP/ONVIF: GetVideoEncoderConfigurationOptions
|         |(49190)  ------------------>  (80)     |
|49.428644000|         GetVideoEncoderConf           |SOAP/ONVIF: GetVideoEncoderConfigurationOptionsResponse
|         |(49190)  <------------------  (80)     |
|49.429872000|         GetMetadataConfigur           |SOAP/ONVIF: GetMetadataConfigurations
|         |(49191)  ------------------>  (80)     |
|50.141905000|         GetMetadataConfigur           |SOAP/ONVIF: GetMetadataConfigurationsResponse
|         |(49191)  <------------------  (80)     |
|50.144926000|         AddMetadataConfigur           |SOAP/ONVIF: AddMetadataConfiguration
|         |(49192)  ------------------>  (80)     |
|50.415851000|         AddMetadataConfigur           |SOAP/ONVIF: AddMetadataConfigurationResponse
|         |(49192)  <------------------  (80)     |
|50.418226000|         GetStreamUri                  |SOAP/ONVIF: GetStreamUri
|         |(49193)  ------------------>  (80)     |
|52.539069000|         GetStreamUriRespons           |SOAP/ONVIF: GetStreamUriResponse
|         |(49193)  <------------------  (80)     |
|52.541886000|         SetNTP    |                   |SOAP/ONVIF: SetNTP
|         |(49194)  ------------------>  (80)     |
|52.844648000|         SetNTPResponse                |SOAP/ONVIF: SetNTPResponse
|         |(49194)  <------------------  (80)     |
|53.848110000|         SetRelayOutputState           |SOAP/ONVIF: SetRelayOutputState
|         |(49197)  ------------------>  (80)     |
|54.103767000|         SetRelayOutputState           |SOAP/ONVIF: SetRelayOutputStateResponse
|         |(49197)  <------------------  (80)     |

2012年7月31日 星期二

Open DHCP Server


以下紀錄 Open DHCP Server 的使用心得。經過筆者測試,Windows XP 與 Windows 7 64bit皆可正常使用。

1. 軟體安裝
至 http://sourceforge.net/projects/dhcpserver/ 可以下載程式(此時最新版為V1.50)
下載後,雙擊程式後會自動安裝至 C:\OpenDHCPServer 或是 C:\Program Files\OpenDHCPServer

ONVIF -- Test Tool 11.12 測試環境設定注意事項


執行 ONVIF 11.12 測試工具時,幾點注意事項整理如後

  • Static IP 測試,會將IP位址為目前IP位址+1,例如:原始的IP位址為 192.168.0.30, 設定後的位址會是 192.168.0.31。因此設定IPCam位址時,需要注意區域網路上不能夠存在有相同或相鄰的位址。
  • 因為測試過程會使用 DHCP 取得新的 IP Address,DHCP取得的位址與靜態設定的位址可能屬於不同網域,例如:static ip=192.168.0.90, DHCP IP=192.168.82.90因此測試工具機器可能需要設定兩組IP位址。否則 DHCP 測試之後便會無法正常運行。
  • 需要設定Events,包含event topic 與 Topic namespaces
  • 每台IPCam處理訊息與重新啟動的時間不同,因此需要針對各機器的特性設定不同的timeout 值。
  • 執行 Test Tool時,要記得使用administrator的權限

ONVIF -- Test Tool 與 Core spec 版本對應關係

Below list the latest version of ONVIF test tool.

2012年7月29日 星期日

ONVIF -- Genetec NVR add a new device


Genetec NVR version SR1 新增IPCame的流程(使用 ONVIF 規範)

|Time     | 192.168.0.169                         |
|         |                   | 192.168.0.30      |                   
|3.138    |         GetNetworkInterface           |SOAP/ONVIF: GetNetworkInterfaces
|         |(49575)  ------------------>  (80)     |
|3.215    |         Fault     |                   |SOAP/ONVIF: Fault
|         |(49575)  <------------------  (80)     |

ONVIF -- Milestone NVR add a new device


MileStone NVR 新增 IPCam 的流程

|Time     | 192.168.0.241                         | 192.168.0.30                          |
|         |                   | 192.168.0.240     |                   
|9.148984 |         HTTP/1.1 200 OK               |                   |HTTP/XML: HTTP/1.1 200 OK 
|         |(2869)   ------------------>  (1212)   |                   |
|24.187365|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1218)   ------------------>  (80)     |
|24.432826|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1218)   <------------------  (80)     |
|24.437700|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1219)   ------------------>  (80)     |
|24.577916|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1219)   <------------------  (80)     |
|34.201754|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1249)   ------------------>  (80)     |
|34.339486|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1249)   <------------------  (80)     |
|34.342224|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1250)   ------------------>  (80)     |
|34.496421|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1250)   <------------------  (80)     |
|35.033815|         HTTP/1.1 200 OK               |                   |HTTP/XML: HTTP/1.1 200 OK 
|         |(2869)   ------------------>  (1251)   |                   |
|44.217232|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1254)   ------------------>  (80)     |
|44.416000|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1254)   <------------------  (80)     |
|44.426606|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1255)   ------------------>  (80)     |
|44.574057|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1255)   <------------------  (80)     |
|48.782766|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1256)   ------------------>  (80)     |
|49.133063|                   |         GetCapabilitiesResp           |SOAP/ONVIF: GetCapabilitiesResponse
|         |                   |(1256)   <------------------  (80)     |
|49.144355|                   |         GetNetworkProtocols           |SOAP/ONVIF: GetNetworkProtocols
|         |                   |(1257)   ------------------>  (80)     |
|49.364338|                   |         GetNetworkProtocols           |SOAP/ONVIF: GetNetworkProtocolsResponse
|         |                   |(1257)   <------------------  (80)     |
|49.374824|                   |         GetDeviceInformatio           |SOAP/ONVIF: GetDeviceInformation
|         |                   |(1258)   ------------------>  (80)     |
|49.576957|                   |         GetDeviceInformatio           |SOAP/ONVIF: GetDeviceInformationResponse
|         |                   |(1258)   <------------------  (80)     |
|49.583928|                   |         GetVideoEncoderConf           |SOAP/ONVIF: GetVideoEncoderConfigurationOptions
|         |                   |(1259)   ------------------>  (80)     |
|49.935724|                   |         GetVideoEncoderConf           |SOAP/ONVIF: GetVideoEncoderConfigurationOptionsResponse
|         |                   |(1259)   <------------------  (80)     |
|49.944473|                   |         GetVideoEncoderConf           |SOAP/ONVIF: GetVideoEncoderConfigurations
|         |                   |(1261)   ------------------>  (80)     |
|50.149230|                   |         GetVideoEncoderConf           |SOAP/ONVIF: GetVideoEncoderConfigurationsResponse
|         |                   |(1261)   <------------------  (80)     |
|50.154842|                   |         GetVideoSources               |SOAP/ONVIF: GetVideoSources
|         |                   |(1262)   ------------------>  (80)     |
|50.299977|                   |         GetVideoSourcesResp           |SOAP/ONVIF: GetVideoSourcesResponse
|         |                   |(1262)   <------------------  (80)     |
|50.305202|                   |         GetImagingSettings            |SOAP/ONVIF: GetImagingSettings
|         |                   |(1263)   ------------------>  (80)     |
|50.507408|                   |         GetImagingSettingsR           |SOAP/ONVIF: GetImagingSettingsResponse
|         |                   |(1263)   <------------------  (80)     |
|50.515345|                   |         GetOptions|                   |SOAP/ONVIF: GetOptions
|         |                   |(1264)   ------------------>  (80)     |
|50.722685|                   |         GetOptionsResponse            |SOAP/ONVIF: GetOptionsResponse
|         |                   |(1264)   <------------------  (80)     |
|50.735629|                   |         GetAudioEncoderConf           |SOAP/ONVIF: GetAudioEncoderConfigurationOptions
|         |                   |(1265)   ------------------>  (80)     |
|50.952790|                   |         GetAudioEncoderConf           |SOAP/ONVIF: GetAudioEncoderConfigurationOptionsResponse
|         |                   |(1265)   <------------------  (80)     |
|50.955850|                   |         GetAudioEncoderConf           |SOAP/ONVIF: GetAudioEncoderConfigurations
|         |                   |(1266)   ------------------>  (80)     |
|51.218220|                   |         GetAudioEncoderConf           |SOAP/ONVIF: GetAudioEncoderConfigurationsResponse
|         |                   |(1266)   <------------------  (80)     |
|51.227107|                   |         GetAudioSourceConfi           |SOAP/ONVIF: GetAudioSourceConfigurations
|         |                   |(1267)   ------------------>  (80)     |
|51.448708|                   |         GetAudioSourceConfi           |SOAP/ONVIF: GetAudioSourceConfigurationsResponse
|         |                   |(1267)   <------------------  (80)     |
|51.456690|                   |         GetProfiles                   |SOAP/ONVIF: GetProfiles
|         |                   |(1268)   ------------------>  (80)     |
|51.743706|                   |         GetProfilesResponse           |SOAP/ONVIF: GetProfilesResponse
|         |                   |(1268)   <------------------  (80)     |
|51.746977|                   |         GetRelayOutputs               |SOAP/ONVIF: GetRelayOutputs
|         |                   |(1269)   ------------------>  (80)     |
|51.926615|                   |         GetRelayOutputsResp           |SOAP/ONVIF: GetRelayOutputsResponse
|         |                   |(1269)   <------------------  (80)     |
|51.947577|                   |         GetNetworkInterface           |SOAP/ONVIF: GetNetworkInterfaces
|         |                   |(1270)   ------------------>  (80)     |
|52.130577|                   |         GetNetworkInterface           |SOAP/ONVIF: GetNetworkInterfacesResponse
|         |                   |(1270)   <------------------  (80)     |
|54.231426|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1272)   ------------------>  (80)     |
|54.344283|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1272)   <------------------  (80)     |
|54.350844|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1273)   ------------------>  (80)     |
|54.505541|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1273)   <------------------  (80)     |
|64.246181|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1276)   ------------------>  (80)     |
|64.352016|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1276)   <------------------  (80)     |
|64.365884|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1277)   ------------------>  (80)     |
|64.517547|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1277)   <------------------  (80)     |
|74.259460|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1280)   ------------------>  (80)     |
|74.376467|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1280)   <------------------  (80)     |
|74.379551|                   |         GetCapabilities               |SOAP/ONVIF: GetCapabilities
|         |                   |(1281)   ------------------>  (80)     |
|74.527776|                   |         Fault     |                   |SOAP/ONVIF: Fault
|         |                   |(1281)   <------------------  (80)     |

2012年7月25日 星期三

ONVIF -- 透過 gSOAP 產生程式碼



gSOAP 可以幫忙將 wsdl 所定義的 schema 轉換成對應的程式碼,以下紀錄如何轉換的過程。


操作步驟

一、下載 gSOAP
連結 http://gsoap2.sourceforge.net/,下載 gSOAP,此篇文章撰寫時的最新版本為 2.8.9 。
 
二、利用 wsdl2h.exe ,產生 header files,此處以 media.wsdl 為例
wsdl2h.exe -c -o media.h http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.w3.org/2006/03/addressing/ws-addr.xsd 

三、使用 header file 產生程式碼,若 header file 較大,則需較長的產生時間。
soapcpp2 -C –I../../import  media.h
註:"-C"表示產生Client端的程式碼,改成"-S"便會產生Server端程式碼。

四、成功後,會產生 149 個檔案,如下
media.h
MediaBinding.AddAudioDecoderConfiguration.req.xml
MediaBinding.AddAudioDecoderConfiguration.res.xml
MediaBinding.AddAudioEncoderConfiguration.req.xml
MediaBinding.AddAudioEncoderConfiguration.res.xml
MediaBinding.AddAudioOutputConfiguration.req.xml
MediaBinding.AddAudioOutputConfiguration.res.xml
MediaBinding.AddAudioSourceConfiguration.req.xml
MediaBinding.AddAudioSourceConfiguration.res.xml
MediaBinding.AddMetadataConfiguration.req.xml
MediaBinding.AddMetadataConfiguration.res.xml
MediaBinding.AddPTZConfiguration.req.xml
MediaBinding.AddPTZConfiguration.res.xml
MediaBinding.AddVideoAnalyticsConfiguration.req.xml
MediaBinding.AddVideoAnalyticsConfiguration.res.xml
MediaBinding.AddVideoEncoderConfiguration.req.xml
MediaBinding.AddVideoEncoderConfiguration.res.xml
MediaBinding.AddVideoSourceConfiguration.req.xml
MediaBinding.AddVideoSourceConfiguration.res.xml
MediaBinding.CreateProfile.req.xml
MediaBinding.CreateProfile.res.xml
MediaBinding.DeleteProfile.req.xml
MediaBinding.DeleteProfile.res.xml
MediaBinding.GetAudioDecoderConfiguration.req.xml
MediaBinding.GetAudioDecoderConfiguration.res.xml
MediaBinding.GetAudioDecoderConfigurationOptions.req.xml
MediaBinding.GetAudioDecoderConfigurationOptions.res.xml
MediaBinding.GetAudioDecoderConfigurations.req.xml
MediaBinding.GetAudioDecoderConfigurations.res.xml
MediaBinding.GetAudioEncoderConfiguration.req.xml
MediaBinding.GetAudioEncoderConfiguration.res.xml
MediaBinding.GetAudioEncoderConfigurationOptions.req.xml
MediaBinding.GetAudioEncoderConfigurationOptions.res.xml
MediaBinding.GetAudioEncoderConfigurations.req.xml
MediaBinding.GetAudioEncoderConfigurations.res.xml
MediaBinding.GetAudioOutputConfiguration.req.xml
MediaBinding.GetAudioOutputConfiguration.res.xml
MediaBinding.GetAudioOutputConfigurationOptions.req.xml
MediaBinding.GetAudioOutputConfigurationOptions.res.xml
MediaBinding.GetAudioOutputConfigurations.req.xml
MediaBinding.GetAudioOutputConfigurations.res.xml
MediaBinding.GetAudioOutputs.req.xml
MediaBinding.GetAudioOutputs.res.xml
MediaBinding.GetAudioSourceConfiguration.req.xml
MediaBinding.GetAudioSourceConfiguration.res.xml
MediaBinding.GetAudioSourceConfigurationOptions.req.xml
MediaBinding.GetAudioSourceConfigurationOptions.res.xml
MediaBinding.GetAudioSourceConfigurations.req.xml
MediaBinding.GetAudioSourceConfigurations.res.xml
MediaBinding.GetAudioSources.req.xml
MediaBinding.GetAudioSources.res.xml
MediaBinding.GetCompatibleAudioDecoderConfigurations.req.xml
MediaBinding.GetCompatibleAudioDecoderConfigurations.res.xml
MediaBinding.GetCompatibleAudioEncoderConfigurations.req.xml
MediaBinding.GetCompatibleAudioEncoderConfigurations.res.xml
MediaBinding.GetCompatibleAudioOutputConfigurations.req.xml
MediaBinding.GetCompatibleAudioOutputConfigurations.res.xml
MediaBinding.GetCompatibleAudioSourceConfigurations.req.xml
MediaBinding.GetCompatibleAudioSourceConfigurations.res.xml
MediaBinding.GetCompatibleMetadataConfigurations.req.xml
MediaBinding.GetCompatibleMetadataConfigurations.res.xml
MediaBinding.GetCompatibleVideoAnalyticsConfigurations.req.xml
MediaBinding.GetCompatibleVideoAnalyticsConfigurations.res.xml
MediaBinding.GetCompatibleVideoEncoderConfigurations.req.xml
MediaBinding.GetCompatibleVideoEncoderConfigurations.res.xml
MediaBinding.GetCompatibleVideoSourceConfigurations.req.xml
MediaBinding.GetCompatibleVideoSourceConfigurations.res.xml
MediaBinding.GetGuaranteedNumberOfVideoEncoderInstances.req.xml
MediaBinding.GetGuaranteedNumberOfVideoEncoderInstances.res.xml
MediaBinding.GetMetadataConfiguration.req.xml
MediaBinding.GetMetadataConfiguration.res.xml
MediaBinding.GetMetadataConfigurationOptions.req.xml
MediaBinding.GetMetadataConfigurationOptions.res.xml
MediaBinding.GetMetadataConfigurations.req.xml
MediaBinding.GetMetadataConfigurations.res.xml
MediaBinding.GetProfile.req.xml
MediaBinding.GetProfile.res.xml
MediaBinding.GetProfiles.req.xml
MediaBinding.GetProfiles.res.xml
MediaBinding.GetServiceCapabilities.req.xml
MediaBinding.GetServiceCapabilities.res.xml
MediaBinding.GetSnapshotUri.req.xml
MediaBinding.GetSnapshotUri.res.xml
MediaBinding.GetStreamUri.req.xml
MediaBinding.GetStreamUri.res.xml
MediaBinding.GetVideoAnalyticsConfiguration.req.xml
MediaBinding.GetVideoAnalyticsConfiguration.res.xml
MediaBinding.GetVideoAnalyticsConfigurations.req.xml
MediaBinding.GetVideoAnalyticsConfigurations.res.xml
MediaBinding.GetVideoEncoderConfiguration.req.xml
MediaBinding.GetVideoEncoderConfiguration.res.xml
MediaBinding.GetVideoEncoderConfigurationOptions.req.xml
MediaBinding.GetVideoEncoderConfigurationOptions.res.xml
MediaBinding.GetVideoEncoderConfigurations.req.xml
MediaBinding.GetVideoEncoderConfigurations.res.xml
MediaBinding.GetVideoSourceConfiguration.req.xml
MediaBinding.GetVideoSourceConfiguration.res.xml
MediaBinding.GetVideoSourceConfigurationOptions.req.xml
MediaBinding.GetVideoSourceConfigurationOptions.res.xml
MediaBinding.GetVideoSourceConfigurations.req.xml
MediaBinding.GetVideoSourceConfigurations.res.xml
MediaBinding.GetVideoSources.req.xml
MediaBinding.GetVideoSources.res.xml
MediaBinding.nsmap
MediaBinding.RemoveAudioDecoderConfiguration.req.xml
MediaBinding.RemoveAudioDecoderConfiguration.res.xml
MediaBinding.RemoveAudioEncoderConfiguration.req.xml
MediaBinding.RemoveAudioEncoderConfiguration.res.xml
MediaBinding.RemoveAudioOutputConfiguration.req.xml
MediaBinding.RemoveAudioOutputConfiguration.res.xml
MediaBinding.RemoveAudioSourceConfiguration.req.xml
MediaBinding.RemoveAudioSourceConfiguration.res.xml
MediaBinding.RemoveMetadataConfiguration.req.xml
MediaBinding.RemoveMetadataConfiguration.res.xml
MediaBinding.RemovePTZConfiguration.req.xml
MediaBinding.RemovePTZConfiguration.res.xml
MediaBinding.RemoveVideoAnalyticsConfiguration.req.xml
MediaBinding.RemoveVideoAnalyticsConfiguration.res.xml
MediaBinding.RemoveVideoEncoderConfiguration.req.xml
MediaBinding.RemoveVideoEncoderConfiguration.res.xml
MediaBinding.RemoveVideoSourceConfiguration.req.xml
MediaBinding.RemoveVideoSourceConfiguration.res.xml
MediaBinding.SetAudioDecoderConfiguration.req.xml
MediaBinding.SetAudioDecoderConfiguration.res.xml
MediaBinding.SetAudioEncoderConfiguration.req.xml
MediaBinding.SetAudioEncoderConfiguration.res.xml
MediaBinding.SetAudioOutputConfiguration.req.xml
MediaBinding.SetAudioOutputConfiguration.res.xml
MediaBinding.SetAudioSourceConfiguration.req.xml
MediaBinding.SetAudioSourceConfiguration.res.xml
MediaBinding.SetMetadataConfiguration.req.xml
MediaBinding.SetMetadataConfiguration.res.xml
MediaBinding.SetSynchronizationPoint.req.xml
MediaBinding.SetSynchronizationPoint.res.xml
MediaBinding.SetVideoAnalyticsConfiguration.req.xml
MediaBinding.SetVideoAnalyticsConfiguration.res.xml
MediaBinding.SetVideoEncoderConfiguration.req.xml
MediaBinding.SetVideoEncoderConfiguration.res.xml
MediaBinding.SetVideoSourceConfiguration.req.xml
MediaBinding.SetVideoSourceConfiguration.res.xml
MediaBinding.StartMulticastStreaming.req.xml
MediaBinding.StartMulticastStreaming.res.xml
MediaBinding.StopMulticastStreaming.req.xml
MediaBinding.StopMulticastStreaming.res.xml
soapC.c
soapClient.c
soapClientLib.c
soapH.h
soapStub.h

五、參考 soapStub.h,實作對應的函數,例如:soap_serve___ns2__GetStreamUri(struct soap*);,此處,我將所有相關的函數統一放在soapStub.c內。


六、若要產生完整的 onvif API,則可以加入所有 onvif 所定義的 wsdl, 參考下列指令

wsdl2h.exe -c -o onvif.h
http://www.onvif.org/onvif/ver10/schema/onvif.xsd
http://www.w3.org/2006/03/addressing/ws-addr.xsd
http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
http://www.onvif.org/onvif/ver10/deviceio.wsdl
http://docs.oasis-open.org/wsrf/rw-2.wsdl
http://docs.oasis-open.org/wsn/bw-2.wsdl
http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl
http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl
http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl


問題釋疑

1. Critical error: #import: Cannot open file "ns1.h" for reading.
    wsdl2h.exe 使用時加入 http://www.w3.org/2006/03/addressing/ws-addr.xsd 即可。


2. 編譯時發現少了 stdsoap2.h
    此檔案可在 \gsoap_2.8.9\gsoap-2.8\gsoap\ 取得。
    複製時應該同時複製 stdsoap2.h 與 stdsoap2.c


3. Makefile 舉例,因為我在 Windows 使用 mingw 來編譯,其Makefile 如下
OBJS = stdsoap2.o soapC.o soapClient.o soapClientLib.o soapStub.o
all: onvif_media
%.o: %.c soapH.h soapStub.h import/*.h
gcc -c $< -o $@
onvif_media: $(OBJS)
gcc $(OBJS) -o $@
clean:
rm -f *.o onvif_media.exe

參考資料:

  1. wsdl2h 與 soapcpp2 用法
  2. gSOAP 中文使用介紹
  3. http://www.cppblog.com/qiujian5628/archive/2008/10/11/54019.html

 



2012年7月24日 星期二

[日文][歌詞] 瞳をとじて


http://vlog.xuite.net/play/ZVV1UzV0LTE5MjAzMTAuZmx2/平井堅-輕閉雙眼?html5=1


每當早晨醒來 你脫下的軀殼總在身邊
過去總能感受到你背後的溫暖 今天卻是一陣寒冷
停止苦笑 拉開沉重的窗簾 炫目的朝陽 每天追趕著我
那天 讓你見到我哭泣的臉 眼淚映照著夕陽
每當我祈禱著能夠卸下肩膀上的溫暖
我的心 與身體 卻都牢記著你

[日文][歌詞] 明日晴れるかな


http://www.youtube.com/watch?v=TEnLqRGgg_Q&feature=related


熱情的眼淚和戀愛的呼喊都是如此
閃耀著的日子消失去了哪裡?
如果明天也是在不確定的道路上徬徨
繼續這樣也無法回到原點

耳朵如果澄淨下來, 心中的聲音
到底是要告訴傳達什麼給我呢?
現在在污穢的街道的一角
每每想起那時的天空

[日文][歌詞] ORION

http://vlog.xuite.net/play/c1JNaFdOLTE1ODE1MjMuZmx2/-PV-中島美嘉-ORION?html5=1 



我總是在哭泣
因為你告訴我
不讓人看見你的軟弱
並不代表你很堅強
I believe

在寒冷的回家路上
只有星星陪伴著我

就連剛剛深信不疑
你淡淡的體溫
似乎都快要遺忘

直到現在才第一次意識到
喜歡上一個人的心情

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

PMP renew

PMP考完也快三年了,最近一直收到PMI寄來通知renew的信件。有點猶豫是否還需要這份證照,畢竟拿了這麼久,也沒有因為這張證照加薪過。總之,先研究研究 renew的流程吧,若是只花點小錢的話,那就繼續拿PMP證照吧。

PMP證照是有效期的,每三年就需要 renew此份證照。其renew條件為需取得滿60 PDUs,官方網站建議了10種取得PDU的方式,簡單整理幾個如下。

網際網路上用來找尋設備的方法

欲實作NVR,第一步就是要能夠找到想要連接的IP Camea。
茲將網際網路上常用來找尋設備的方法整理如下:
  • WS-Discovery (ONVIF組織定義的方法)
  • SSDP  (DLNA組織定義的方法)
  • Multicast Domain Name Service(mDNS)
  • ADwin Config
  • Bonjour

2012年7月4日 星期三

ONVIF -- 自動偵測IPCam 的流程分析


使用一台符合 ONVIF 標準的 NVR 與 IPCam,測試並記錄其自動偵測 IPCam 以及加入 IPCam 的流程,以(Gxxx NVR為例)


自動偵測 IPCam

1. NVR 會使用 multicast的方式,
   傳送資料到 239.255.255.250 port 3702(ws-discovery)
 
2. 若網路上存在 IPCam,則會回應此訊息

3. NVR 與 IPCam 完成 ws-discovery 流程之後,其實此時就已經找到 IPCam了
   後續便可以改成使用 ONVIF 的訊息進行溝通


JPEG/RTP 封包分析


MJPEG(MotionJPEG)封包分析

RFC2435 定義了 RTP 上傳送的 JPEG 影像,由於各家廠商實作方式不同,曾在互通測試時產生問題,NVR所接收到的MJPEG無法正常顯示,所以特別針對此份規則書以及可能產生問題的封包加以分析。

2012年7月3日 星期二

RFC 2435 中文版


组织:中国互动出版网(http://www.china-pub.com/
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm
E-mailouyang@china-pub.com
译者:范晨 (fanchen  fan-chen@china.com)
译文发布时间:2001-9-11
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须
保留本文档的翻译及版权信息。


Network Working Group                                       R. Pereira
Request for Comments: 2435                        TimeStep Corporation
Obsoletes: 2035                                               R. Adams
Category: Standards Track                            Cisco Systems Inc.
                                                         November 1998

针对JPEG压缩视频的RTP荷载格式
RFC2435——RTP Payload Format for JPEG-compressed Video


本备忘录状态
本文档讲述了一种Internet通信的标准Internet跟踪协议,并对其改进提出了讨论和建
议。请参考最新版本的"Internet Official Protocol Standards" (STD 1) 来获得本协议的
标准化进程和状态,此备忘录的发布不受任何限制。
版权注意
版权归因特网协会(1998)所有,保留一切权利。

摘要
本文档描述了针对JPEG视频流的RTP荷载格式。此种包格式针对编码器参数基本不变化
的实时视频流进行了优化。
本文档是IETF下的视音频传输工作组的产品。意见或建议请发到该工作组的邮件列表
conf@es.net或直接发给作者。
   本备忘录的大部分与RFC2035一致,对协议的改动见附录D

2012年6月29日 星期五

ONVIF API 2.0 快速查詢表格


ONVIF 2.0 API 快速查詢表格

大部分 shcema 與 1.0 是相同,需特別注意1.0/2.0差異(Imaging 與 PTZ),此可能會造成產品互通時的問題。

DeviceIO (http://www.onvif.org/ver10/deviceio.wsdl)
  • GetAudioOutputConfiguration
  • GetAudioOutputConfigurationOptions
  • GetAudioOutputs
  • GetAudioSourceConfiguration
  • GetAudioSourceConfigurationOptions
  • GetAudioSources
  • GetDigitalInputs
  • GetRelayOutputOptions
  • GetRelayOutputs
  • GetSerialPortConfiguration
  • GetSerialPortConfigurationOptions
  • GetSerialPorts
  • GetServiceCapabilities
  • GetVideoOutputConfiguration
  • GetVideoOutputConfigurationOptions
  • GetVideoOutputs
  • GetVideoSourceConfiguration
  • GetVideoSourceConfigurationOptions
  • GetVideoSources
  • SendReceiveSerialCommand
  • SetAudioOutputConfiguration
  • SetAudioSourceConfiguration
  • SetRelayOutputSettings
  • SetRelayOutputState
  • SetSerialPortConfiguration
  • SetVideoOutputConfigurationSetVideoSourceConfiguration

2012年6月25日 星期一

Zero configuration networking (zeroconf)



一般而言,網路管理者需要設定電腦的網路狀態,例如使用DHCP,或是手動設定IP位址。
而 zeroconf 則省略了上述步驟,提供一種用來自動設定IP網路的技術。

zeroconf主要基於三種技術

1. 給定網路設備對應的 IP位址 (address autoconfiguration)。會分配的位址如下:
IPv4:169.254.0.0/16
IPv6:fe80::/10

2012年6月24日 星期日

ONVIF 測試工具安裝步驟


ONVIF Device Test Tool 用來測試 IPCam 所實作的功能是否符合 ONVIF所定義的規範。
以下說明此工具的安裝步驟

作業系統: Windows XP (Orcal VirtualBox)
測試工具: ONVIF_Test_Tool_v11.12

2012年6月14日 星期四

軟體開發完成後的憑證處理


在開發網頁的應用程式時,每次測試時總是要先更改 IE的安全性。
當開發完成之後,總不能也要求使用者進行此類操作吧,此時就需要申請憑證,對軟體進行認證囉。

1. 憑證種類
對於自行開發程式的研發人員而言,在發行軟體時可能會用到下列憑證
  • Microsoft Authenticode Digital ID
  • Sun Java Signing Digital ID
  • Netscape Object Signing Digital ID
  • Microsoft Office and VBA Signing Digital ID
  • Macromedia Shockwave Digital ID
  • Marimba Castanet Channel Signing Digital ID

由於我們這次所撰寫的專案是使用 .cab 與 .jar。所以我只需要申請
  • Microsoft Authenticode Digital ID
  • Sun Java Signing Digital ID

2012年6月13日 星期三

ONVIF Core Streaming 心得


ONVIF是一個定義網路影像監控系統的國際標準組織,ONVIF-Streaming-Spec-v211 則介紹網路影像監控系統上的串流機制,包含如何封裝 JPEG/RTP,並針對 RTSP 的控制作了幾個功能擴充,此篇會針對 Streaming-Spec 作一基本介紹。

2012年6月12日 星期二

MileStone NVR 基本設定筆記

MileStone NVR 基本設定筆記

1. 先確認本機 port 80 是否有被使用,若有,需要更改伺服器預設的 port

2. 執行 "XProtect Management Application"
   [進階設定] -> [硬體裝置] -> 刪除所有硬體裝置後, 新增硬體裝置, 預設名稱為"攝影機1"
   輸入測試 camera ip,例如:192.168.0.31,驅動程式選擇 ONVIF Conformant Device
   選擇"攝影機1",若設定正確,此時將能夠檢視 ipcam 所傳來的畫面。
   若此部分連接有問題,使用wireshark檢查封包。

2012年6月11日 星期一

live555 程式碼分析 -- RTSP Server on demand


分析 testOnDemandRTSPServer.cpp 運作流程

1. 建立一個新的 RTSPServer 實體,向 taskScheduler 註冊 incomingConnectionHandlerRTSP()。當收到 RTSP Request 時,便會建立 RTSPClientSession。

2. 對於此伺服器可以接收的各種媒體,都先建立對應的 session以及subsession,等待 client 建立連線。

2012年6月8日 星期五

live555 程式碼分析 -- RTSP Client


Live555 是一套以 C++ 實作的Multimedia Streaming library,這套函數庫實做了RTP/RTCP/RTSP/SIP 等標準協議,支援MPEG, H.264, H.263+, DV, JPEG 等格式。

Live555 為GNU Lesser General Public License(LGPL)自由軟體,因此只要不更改其原始碼,
我們可以使用其函數庫進行商業產品開發,並且保留自己的程式碼。例如 VLC media player 就是使用 live555 來實作其 RTSP 協議。

使用方式可以參考 live555 的 testprogs 目錄,以下以 RTSP Client 為例說明其運作方式


2012年6月5日 星期二

live555原始程式碼簡介



live555原始程式碼簡介
liveMedia項目的原始程式碼包括四個基本的庫,各種測試代碼以及IVE555 Media Server

四個基本的庫分別是UsageEnvironment&TaskSchedulergroupsockliveMediaBasicUsageEnvironment

2012年6月4日 星期一

串流軟體封包分析 -- RealPlayer


直接撥放影片
其作法是使用 Macromedia 公司自訂的協議
透過 smip 協議與 Macromedia - Flash Communication Server 溝通 

所以 RealPlayer 預設的撥放方式也並不是透過 RTSP 協議。

串流軟體封包分析 -- youtube


分析 Youtube 串流封包,是否與 RTSP 有關。

一、使用 Flash Player

1. 下載 flash player
GET /strat/components/YTPlayer/1.0/YTPlayer.swf HTTP/1.1\r\n

串流軟體封包分析 -- Hifree


使用 hifree 應用程式,觀察其播放媒體的方式,分別使用哪種協議。

一、選擇"頻道"撥放
其作法是直接下載整首歌曲後播放,並非使用RTSP協議。

1. hifree 先向伺服器取得歌曲清單
[truncated] GET /get_channel_song.php?enc=u&oenc=kkt&hw_vendor=kkbox&hw_model=fttx&sid=V0000a.739500000000000000000000000000AbED05335PoQDS001Fn6Jjc9e1&ksid=V0000a.739500000000000000000000000000AbED05335PoQDS001Fn6Jjc9e1&kkid=KKBOX-VZQSCFAG
User-Agent: KKBOX air(Get Song List)\r\n
Host: api.kkbox.com.tw\r\n
Cookie: PPHPSESSID=267759049478910113475\r\n

MMS(Microsoft Media Server)

此處所描述的MMS,並非多媒體簡訊(Multimedia Message Service),而是微軟之前發展的一個串流機制,稱為Microsoft Media Server (MMS),2003年時微軟決定由 RTSP 取代此機制,並且於2008年正式廢除此機制。

所以現在使用 "mms://" 與 "rtsp://" 基本上都是使用 RTSP 協議。

2012年5月31日 星期四

RTSP例子


RTSP是一個用來建立並控制終端間的媒體會談的協議。

RTSP 在語法和操作上與 HTTP/1.1 類似,因此 HTTP 的擴展機制在多數情況下可加入 RTSP
預設的傳輸埠號為 554 。

以下以一個例子說明 RTSP的運作過程。
假設情境為用戶C 想要觀看媒體伺服器 A 與 V上的影片,而對應的媒體描述則是放在伺服器W。

2012年5月30日 星期三

SDP (Session Description Protocol) 閱讀心得


SDP (Session Description Protocol): RFC4566

SDP通常會用在會談初始化過程,用來傳送會談參與者的能力列表,以協調會談雙方的各項參數,例如:媒體的種類為 audio或 video,用來承載SDP的協定(RTP/UDP/IP, etc.),媒體的編碼方式(H.261 video, MPEG video, etc.)

以 RTSP為例,在 RTSP 的溝通過程中,當用戶端詢問伺服器端URL的相關資訊時(發出 DESCRIBE),伺服器會將相關資訊以SDP的格式回復。用戶端可以藉此資訊決定要使用哪種codec與伺服器溝通。

主要用到 SDP的協議,包括SAPRTPRTSPSIPHTTPEmailMIME extension

SDP的基本格式為
<type>=<value>
< type >exactly one case-significant character. ASCII編碼
<value>is structured text whose format depends on <type>. 支援所有ISO 10646所定義的字元,使用UTF-8編碼

2012年5月25日 星期五

SONY液晶電視進入工程模式方法


SONY液晶電視進入工程模式方法:

1. 開機,播電視節目一小會。

2. 按遙控器上「電源/待機」鍵,進入待機模式

3. 按「顯示」鍵

4. 按數字「5」鍵

2012年5月24日 星期四

如何連接多個SONY VISCA 攝像頭

文章轉自 http://helmme.com/?id=61


索尼的视频会议摄像头拥有一个VISCA协议,他支持将多个摄像头级联使用。
在级联VISCA镜头时,第一个镜头与控制器间通过VISCA控制电缆来进行连接。

2012年5月23日 星期三

KH-- ITN實作問題--1080-60i-OSD與背景分離


IT-N 實作問題釋疑

1.      OSD畫面在 1080 60p顯示正常,1080 60i顯示有誤。畫面如下

1080 60p
1080 60i


此問題與 ITN系統 interlace mode(隔行掃瞄) 的實作有關,當輸出設定為 interlace時,此系統會先輸出影像與OSD背景(使用PrivacyMask實作),之後再輸出 OSD字元。

所以針對整個螢幕的座標系統將會是
Before interlace: 1920*1080
After  interlace:1920*540  ,此時才輸出OSD字元。


只要將OSD輸出時的座標根據1920*540來重新定位,就可以正常顯示了。

1080 60i (Old)
1080 60i (New)