2016-04-21 2 views
0

Моя цель - перечислить все IP-камеры в данной сети кодом C#.Can SharpPcap можно использовать для поиска ip-камер в моей сети в C#

Я могу перечислить все IP-адреса в своей сети, используя GetIpNetTable (код C#) here.

Может ли sharppcap оказать какую-либо помощь в этом отношении?

Примечание. Я абсолютно не знаком с сетью, поэтому, пожалуйста, несите меня.

Или существует какой-либо другой способ, с помощью которого предоставляется ip-адрес, я мог бы сначала проверить, есть ли его ip-камера, а затем получить ее данные. Обратите внимание, что ip-камера может быть любой.

ответ

2

IP-камеры используют стандарт onvif. В соответствии с этим вы можете перечислить все ip-камеры в своей сети, отправив сообщение с мылом xml для трансляции IP-адреса на порт 3702 с использованием протокола UDP.

Так что если вы находитесь на одном уровне сети, тогда ваш широковещательный адрес будет 192.168.1.255. Пожалуйста, сообщите об адресе вещания, поскольку я не являюсь сетевым человеком и не могу объяснить это лучше.

Итак, вот что вам нужно сделать.

  1. Создать UdpClient и подключиться к IP 192.168.1.255 порт 3702
  2. Создать сообщение SOAP для запроса сетевых камер, чтобы дать их адрес IP-
  3. Отправить это мыло сообщение с помощью UdpClient.
  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. Я использовал информацию avaialbe по адресу http://stackoverflow.com/q/18551686/1977871. Теперь я получаю 45, что кажется правильным. Позвольте мне проанализировать немного дальше. Еще раз спасибо. – VivekDev

Смежные вопросы