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

Моя цель - перечислить все ip-камеры в данной сети с помощью кода C#.

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

Может ли Sharppcap помочь в этом отношении?

Обратите внимание, я абсолютно новичок в сети, поэтому, пожалуйста, потерпите меня.

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

1 ответ

Решение

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

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

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

  1. Создайте UdpClient и подключитесь к IP 192.168.1.255 через порт 3702
  2. Создайте сообщение SOAP, чтобы запросить сетевые камеры, чтобы дать их IP-адрес
  3. Отправьте это мыльное сообщение, используя свой UdpClient.
  4. Ждите ответов
  5. Как только получен ответ, преобразуйте эти байтовые данные в строку
  6. Эта строка содержит IP-адрес, который вам нужен.
  7. Прочтите спецификации onvif и посмотрите, что вы можете сделать. или прочитайте это

Я вставляю код для вашей справки.

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;
        }
Другие вопросы по тегам