2011-04-12 12 views
10

स्टैक ओवरफ्लो के साथ .NET 4.0 में ONVIF प्रमाणीकरण। मैंने हाल ही में एक नया काम शुरू कर दिया है, और मैं पहली बार .NET और सभी संबंधित सॉफ्टवेयर, पैटर्न, अवधारणाओं और यहां तक ​​कि भाषाओं को भी छू रहा हूं।विजुअल स्टूडियो 2010

मेरा काम इमारत में एक ओएनवीआईफ़ कैमरे के साथ संचार स्थापित करने का प्रयास करना है, अंत में, कंपनी के डोमोटिक समाधान को स्वचालित रूप से ओएनवीआईएफ कैमरे को पहचानने और उन्हें स्थापित करने और उनकी सेवाओं का उपयोग करने में सक्षम होने के लिए अपग्रेड करना है।

मैं पहले से ही इस तरह से अपने मॉडल, अपने मैक पता और उसके फर्मवेयर संस्करण की तरह कुछ बुनियादी जानकारियां इकट्ठा करने में सक्षम हूँ:

 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 के लिए इस एक्सएमएल विनिर्देश की है। कॉन्फ़िग फ़ाइल:

<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 - खराब अनुरोध" त्रुटियां मिलती हैं, और जो मैंने पढ़ा है उसके अनुसार मुझे ऐसा इसलिए है क्योंकि मुझे कैमरे के लिए प्रमाणीकरण को संभालने की आवश्यकता है।

समस्या यह है कि, क्योंकि मैं शुरुआत करने वाला हूं, मुझे डब्लूएस-सिक्योरिटी (जिसे ओएनवीआईएफ द्वारा उपयोग किया जाता है) के बारे में जो कुछ भी मिलता है, वह वास्तव में बहुत सारे समाधानों के साथ वास्तव में उलझन में है, और वास्तव में कुछ भी काम नहीं कर रहा है मेरे लिए। उदाहरण के लिए, this post here इसे बहुत आसान बनाते हैं, लेकिन मैंने UserNameSecurityToken बनाने की कोशिश की है और मुझे अभी भी 400 खराब अनुरोध त्रुटियां मिलती हैं। चूंकि मुझे नहीं पता कि ऐसा इसलिए है क्योंकि मैंने अपना टोकन सिस्टम गलत लिखा है, अगर ऐसा इसलिए है क्योंकि कैमरा ऐसा करने का प्रयास नहीं करता है जो मैं करने की कोशिश करता हूं ...

मैंने पहले से ही WSHttp बाइंडिंग की कोशिश की है और इसे उपयोगकर्ता नाम में डाल दिया है मोड, लेकिन WSHttp बाइंडिंग का उपयोग करके मूल सूचना खोज को तोड़ने में सक्षम था (एक MustUnderstand त्रुटि के साथ) ...

मेरे लिए कोई संकेतक? सरल डब्ल्यूएस-सुरक्षा/.NET, सी #/ओएनवीआईएफ ट्यूटोरियल, सब कुछ स्वीकार किया जाएगा।

कृपया मुझे किसी भी अंग्रेजी त्रुटियों के लिए क्षमा करें, मैं मूल निवासी नहीं हूं। मुझे यह भी पता है कि मेरा अनुरोध बहुत अस्पष्ट है, इसलिए खेद है, लेकिन मैं इस पर एक वास्तविक नोब हूं, पहली बार इंटरनेट पर मदद मांग रहा हूं।

+1

यह एक साइड नोट है ... तथ्य यह है कि आप संकेत देते हैं कि आप सी # के लिए नए हैं और आप इसे अब तक प्रभावशाली बनाने में सक्षम थे। –

+1

वैसे मैंने वर्षों से जावा किया है, और अंत में यह कुछ साल पहले निश्चित रूप से आसान है, अब आप आमतौर पर इंटरनेट पर छोटे कोड स्निपेट पा सकते हैं – user704419

उत्तर

11

ठीक है, मुझे आशा है कि यह अंततः मदद करेंगे अन्य लोगों अटक जैसे मैं था:

EndpointAddress serviceAddress = नए EndpointAddress ("/ ONVIF/device_service");

HttpTransportBindingElement httpBinding = new HttpTransportBindingElement();

httpBinding.AuthenticationScheme = प्रमाणीकरणSchemes.Digest;

var messageElement = new textMessageEncodingBindingElement();

संदेश एलिमेंट.मेसेजवर्सन = संदेशवर्सन। क्रेटवर्सन (लिफाफावर्सन। सोप 12, एड्रेसिंगवर्सन.None);

कस्टम बाइंडिंग बाइंड = नया कस्टम बाइंडिंग (संदेश एलिमेंट, http बाइंडिंग);

// हमारे कस्टम व्यवहार जोड़ें - इसके लिए माइक्रोसॉफ्ट डब्लूएसई 3 की आवश्यकता है।0 एसडीके

पासवर्डडिजिस्ट व्यवहार व्यवहार = नया पासवर्ड डिज़ाइन व्यवहार (कैमराASCIIStringLogin, CameraASCIIStringPassword);

डिवाइस क्लाइंट क्लाइंट = नया डिवाइस क्लाइंट (बाइंड, सर्विस एड्रेस);

क्लाइंट। एंडपॉइंट.विहाविर्स। जोड़ें (व्यवहार);

// अब हम

client.GetSystemDateAndTime जानकारी के लिए पूछ सकते हैं();

क्लाइंट। GetNetworkInterfaces();

ग्राहक। गेटस्कोप();

क्लाइंट। GetRelayOutputs();

ग्राहक। GETWsdlUrl();

समस्या यह थी कि कैमरा को सरलतम से परे किसी भी जानकारी देने से पहले प्रमाणीकरण की आवश्यकता होती है, और सबसे कठिन हिस्सा अंततः अपने स्वयं के सॉफ़्टवेयर में इसे फिर से बनाने के लिए एक काम कर रहे xml onvif संदेश को पकड़ना था।

+2

उन लोगों के लिए जिन्हें पासवर्डडिजिस्टबैवियर से परिचित नहीं है, इस ब्लॉग पोस्ट को देखें: http: // blog.benpowell.co.uk/2010/11/supporting-ws-i-basic-profile-password.html –

संबंधित मुद्दे