SharpPcap 可以用于在 C# 中查找我的网络中的 ip 摄像头吗

Can SharpPcap be used to find ip cameras in my network in C#

我的objective是通过C#代码列出给定网络中的所有网络摄像头。

我可以使用 GetIpNetTable(C# 代码)列出我网络上的所有 IP 地址here

sharppcap在这方面有什么帮助吗?

请注意,我对网络完全陌生,所以请多多包涵。

或者有没有其他方法可以给定一个 ip 地址,我可以先验证它是否是一个 ip cam,然后获取它的详细信息。请注意,网络摄像头可以是任何品牌。

IP 摄像机使用 onvif 标准。据此,您可以通过使用 UDP 协议向端口 3702 上的广播 ip 地址发送 xml soap 消息来列出网络上的所有 ip 摄像头。

因此,如果您在单级网络上,那么您的广播地址将为 192.168.1.255。请google关于广播地址,我不是网络人,无法解释得更好。

所以这是你需要做的。

  1. 创建一个 UdpClient 并在端口 3702 上连接到 IP 192.168.1.255
  2. 创建 SOAP 消息以请求网络摄像机提供其 IP 地址
  3. 使用您的 UdpClient 发送此肥皂消息。
  4. 等待回复
  5. 收到响应后,将该字节数据转换为字符串
  6. 此字符串包含您需要的 IP 地址。
  7. 阅读onvif specs and see what you can do. or 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;
        }