2011-04-12 71 views
10

stackoverflow。我最近開始了一項新工作,並且首次涉及.NET和所有相關軟件,模式,概念甚至語言。使用Visual Studios 2010的.NET 4.0中的ONVIF身份驗證

我的任務是嘗試建立與建築物中的ONVIF攝像頭的通信,最終升級公司的domotic解決方案以自動識別ONVIF攝像頭並能夠設置並使用他們的服務。

我已經能夠收集到一些基本的信息像它的模型,它的MAC地址和固件版本是這樣的:

 EndpointAddress endPointAddress = new EndpointAddress("<mycameraurl:<mycameraport>/onvif/device_service"); 
     CustomBinding bind = new CustomBinding("DeviceBinding"); 
     DeviceClient temp = new DeviceClient(bind, endPointAddress); 
     String[] arrayString = new String[4]; 
     String res = temp.GetDeviceInformation(out arrayString[0], out arrayString[1], out arrayString[2], out arrayString[3]); 
     MessageBox.Show("Model " + arrayString[0] + ", FirmwareVersion " + arrayString[1] + ", SerialNumber " + arrayString[2] + ", HardwareId " + arrayString[3]); 

我有我的應用程序的customBinding這個XML規範。配置文件:

<customBinding> 
    <binding name="DeviceBinding"> 
     <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" 
      messageVersion="Soap12" writeEncoding="utf-8"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </textMessageEncoding> 
     <httpTransport manualAddressing="false" maxBufferPoolSize="524288" 
      maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous" 
      bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard" 
      keepAliveEnabled="false" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous" 
      realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" 
      useDefaultWebProxy="true" /> 
    </binding> 
    </customBinding> 

我的問題是,它我不可能深入瞭解我可以問的相機。對於我嘗試的任何事情,我都會得到「400 - 錯誤的請求」錯誤,根據我讀到的內容,因爲我需要處理相機的身份驗證。

問題是,因爲我是初學者,所以我發現的有關WS-Security(似乎被ONVIF使用)的一切都真的很困惑,並且有很多不同的解決方案,爲了我。例如,this post here使它聽起來很簡單,但我試圖創建一個UserNameSecurityToken,並且仍然收到400個錯誤的請求錯誤。因爲我不知道是否因爲我寫了我的令牌系統錯誤,如果是因爲相機不支持我嘗試做的...

我已經嘗試過WSHttpBinding並將其放入用戶名模式,但使用WSHttpBinding打破了我能夠創建的基本信息發現(帶有MustUnderstand錯誤)...

任何指針爲我?簡單的WS-Security/.NET,C#/ ONVIF教程,一切都將被接受。

請原諒我的任何英語錯誤,我不是母語的人。我也知道我的要求非常模糊,所以很抱歉,但我真的很喜歡這個,第一次在互聯網上尋求幫助。

+1

這是一個附註......事實上,你似乎表明你是C#的新手,並且你能夠獲得如此巨大的成績令人印象深刻。 – 2011-04-12 18:34:20

+1

好吧,我已經做了多年的JAVA,最終它比幾年前明顯更容易,現在你通常可以在互聯網上找到一些代碼片段 – user704419 2011-04-13 06:44:41

回答

11

好吧,我希望這最終將幫助其他人的卡,好像我是:

的EndpointAddress serviceAddress =新的EndpointAddress( 「/ ONVIF/device_service」);

HttpTransportBindingElement httpBinding = new HttpTransportBindingElement();

httpBinding.AuthenticationScheme = AuthenticationSchemes.Digest;

var messageElement = new TextMessageEncodingBindingElement();

messageElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12,AddressingVersion.None);

CustomBinding bind = new CustomBinding(messageElement,httpBinding);

//添加我們的自定義行爲 - 這需要Microsoft WSE 3。0 SDK

PasswordDigestBehavior behavior = new PasswordDigestBehavior(CameraASCIIStringLogin,CameraASCIIStringPassword);

DeviceClient client = new DeviceClient(bind,serviceAddress);

client.Endpoint.Behaviors.Add(behavior);

//現在,我們可以要求信息

client.GetSystemDateAndTime();

client.GetNetworkInterfaces();

client.GetScopes();

client.GetRelayOutputs();

client.GetWsdlUrl();

的問題是,攝像機所需提供認證超越了簡單的人的任何信息之前,和最棘手的部分是最後搭上使用XML ONVIF消息重新在我自己的軟件。

+2

對於那些不熟悉PasswordDigestBehavior的人來說,請看這篇博文:http:// blog.benpowell.co.uk/2010/11/supporting-ws-i-basic-profile-password.html – 2012-08-15 20:45:58