2016-04-21 37 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