2016-04-21 68 views
0

我的目標是通過C#代碼列出給定網絡中的所有ip攝像頭。是否可以使用SharpPcap在我的網絡中查找IP攝像頭?C#

我能夠使用GetIpNetTable(C#代碼)here列出我的網絡上的所有IP地址。

可以sharppcap在這方面有什麼幫助嗎?

注意我對網絡來說是全新的,所以請耐心等待。

或者是否有任何其他方式給定一個IP地址,我可以首先驗證它是否是一個IP CAM,然後得到它的細節。請注意,ip-camera可以是任何製造。

回答

2

IP攝像機使用onvif標準。據此,您可以通過使用UDP協議向端口3702上的廣播IP地址發送xml肥皂消息來列出網絡上的所有網絡攝像機。

所以,如果你在單層網絡,那麼你的廣播地址將是192.168.1.255。請谷歌關於廣播地址,因爲我不是一個網絡人,不能更好地解釋它。

所以這裏是你需要做的。

  1. 創建UdpClient並連接到IP 192.168.1.255端口3702
  2. 創建SOAP消息來請求網絡攝像機給自己的IP地址
  3. 使用UdpClient發送SOAP消息。
  4. 等待對
  5. 一旦響應到達時,該字節的數據轉換成字符串
  6. 此字符串包含了你需要的IP地址。
  7. 閱讀onvif specs,看看你能做什麼。或read this

我粘貼代碼供您參考。

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

我得到的計數爲0的列表,這意味着沒有發現攝像頭。 GetAddress方法也沒有引用任何地方,我錯過了什麼? – VivekDev

+1

GetAddress是我粘貼的代碼片段中的最後一個方法。如果您獲得0結果,請確保在相同網絡上有相機ips,否則請將廣播IP地址更改爲不同的範圍。試試這個IP地址239.255.255.250 – adeel41

+0

我發現廣播地址是192.168.7.255。我在http://stackoverflow.com/q/18551686/1977871使用了info avaialbe。現在我得到45這似乎是正確的。讓我進一步分析一下。再次感謝。 – VivekDev