2016-04-21 16 views
0
zu finden

Mein Ziel ist es, alle IP-Kameras in einem bestimmten Netzwerk nach C# -Code aufzulisten.Kann SharpPcap verwendet werden, um IP-Kameras in meinem Netzwerk in C#

Ich bin in der Lage, alle IP-Adressen in meinem Netzwerk mit dem GetIpNetTable (C# -Code) here aufzulisten.

Kann sharppcap in dieser Hinsicht eine Hilfe sein?

Hinweis Ich bin absolut neu im Networking, also bitte tragen Sie mit mir.

Oder gibt es einen anderen Weg, mit dem eine IP-Adresse gegeben wurde, konnte ich zuerst überprüfen, ob es eine IP-Kamera ist und dann ihre Details erhalten. Beachten Sie, dass die IP-Kamera von jeder Marke sein könnte.

Antwort

2

IP-Kameras verwenden onvif Standard. Dementsprechend können Sie alle IP-Kameras in Ihrem Netzwerk auflisten, indem Sie eine XML-Soap-Nachricht an die Broadcasting-IP-Adresse auf Port 3702 mit dem UDP-Protokoll senden.

Wenn Sie also ein Single-Level-Netzwerk haben, lautet Ihre Broadcast-Adresse 192.168.1.255. Bitte google über Broadcasting-Adresse, da ich kein Netzwerk-Mensch bin und kann es nicht besser erklären.

Also hier ist, was Sie tun müssen.

  1. eine UdpClient erstellen und ihre IP-Adresse eine Verbindung zum IP 192.168.1.255 auf Port 3702
  2. Erstellen einer SOAP-Nachricht Netzwerk-Kameras anfordern
  3. geben senden diese Seife Nachricht Ihre UdpClient verwenden.
  4. Warten auf Antworten
  5. Sobald eine Antwort eingetroffen ist, das Byte-Daten in String konvertieren
  6. Diese Zeichenfolge enthält die IP-Adresse, die Sie benötigen.
  7. Lesen Sie onvif specs und sehen Sie, was Sie tun können. oder read this

Ich paste Code für Ihre Referenz einfügen.

private static async Task<List<string>> GetSoapResponsesFromCamerasAsync() 
     { 
      var result = new List<string>(); 

      using (var client = new UdpClient()) 
      { 
       var ipEndpoint = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 3702); 
       client.EnableBroadcast = true; 
       try 
       { 
        var soapMessage = GetBytes(CreateSoapRequest()); 
        var timeout = DateTime.Now.AddSeconds(TimeoutInSeconds); 
        await client.SendAsync(soapMessage, soapMessage.Length, ipEndpoint); 

        while (timeout > DateTime.Now) 
        { 
         if (client.Available > 0) 
         { 
          var receiveResult = await client.ReceiveAsync(); 
          var text = GetText(receiveResult.Buffer); 
          result.Add(text); 
         } 
         else 
         { 
          await Task.Delay(10); 
         } 
        } 
       } 
       catch (Exception exception) 
       { 
        Console.WriteLine(exception.Message); 
       } 
      } 

      return result; 
     } 

     private static string CreateSoapRequest() 
     { 
      Guid messageId = Guid.NewGuid(); 
      const string soap = @" 
      <?xml version=""1.0"" encoding=""UTF-8""?> 
      <e:Envelope xmlns:e=""http://www.w3.org/2003/05/soap-envelope"" 
      xmlns:w=""http://schemas.xmlsoap.org/ws/2004/08/addressing"" 
      xmlns:d=""http://schemas.xmlsoap.org/ws/2005/04/discovery"" 
      xmlns:dn=""http://www.onvif.org/ver10/device/wsdl""> 
      <e:Header> 
      <w:MessageID>uuid:{0}</w:MessageID> 
      <w:To e:mustUnderstand=""true"">urn:schemas-xmlsoap-org:ws:2005:04:discovery</w:To> 
      <w:Action a:mustUnderstand=""true"">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</w:Action> 
      </e:Header> 
      <e:Body> 
      <d:Probe> 
      <d:Types>dn:Device</d:Types> 
      </d:Probe> 
      </e:Body> 
      </e:Envelope> 
      "; 

      var result = string.Format(soap, messageId); 
      return result; 
     } 

     private static byte[] GetBytes(string text) 
     { 
      return Encoding.ASCII.GetBytes(text); 
     } 

     private static string GetText(byte[] bytes) 
     { 
      return Encoding.ASCII.GetString(bytes, 0, bytes.Length); 
     } 

     private string GetAddress(string soapMessage) 
     { 
      var xmlNamespaceManager = new XmlNamespaceManager(new NameTable()); 
      xmlNamespaceManager.AddNamespace("g", "http://schemas.xmlsoap.org/ws/2005/04/discovery"); 

      var element = XElement.Parse(soapMessage).XPathSelectElement("//g:XAddrs[1]", xmlNamespaceManager); 
      return element?.Value ?? string.Empty; 
     } 
+0

Ich bekomme die Zählung als 0 für Liste , was bedeutet, dass keine Nocken gefunden werden. GetAddress-Methode wird auch nirgendwo referenziert, fehlt mir etwas? – VivekDev

+1

GetAddress ist die letzte Methode im Code-Snippet, die ich eingefügt habe. Wenn Sie das Ergebnis 0 erhalten, vergewissern Sie sich, dass sich im selben Netzwerk Kameras befinden oder ändern Sie die IP-Adresse des Broadcasts auf einen anderen Bereich. Versuchen Sie diese IP-Adresse 239.255.255.250 – adeel41

+0

Ich hatte festgestellt, dass die Broadcast-Adresse 192.168.7.255 ist. Ich habe die Info avaialbe unter http://stackoverflow.com/q/18551686/1977871 benutzt. Jetzt bekomme ich 45, was richtig zu sein scheint. Lass mich ein bisschen weiter analysieren. Noch einmal vielen Dank. – VivekDev