SharpPcap 可以用来在 C# 中找到我的网络中的 ip 摄像机吗

Posted

技术标签:

【中文标题】SharpPcap 可以用来在 C# 中找到我的网络中的 ip 摄像机吗【英文标题】:Can SharpPcap be used to find ip cameras in my network in C# 【发布时间】:2016-08-14 08:49:42 【问题描述】:

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

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

sharppcap 可以在这方面提供帮助吗?

请注意,我对网络完全陌生,所以请耐心等待。

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

【问题讨论】:

【参考方案1】:

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

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

所以这是你需要做的。

    创建 UdpClient 并在端口 3702 上连接到 IP 192.168.1.255 创建 SOAP 消息以请求网络摄像机提供其 IP 地址 使用您的 UdpClient 发送此 soap 消息。 等待回复 收到响应后,将该字节数据转换为字符串 此字符串包含您需要的 IP 地址。 阅读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;
        

【讨论】:

我将 List 的计数设为 0,这意味着未找到任何摄像头。也没有在任何地方引用 GetAddress 方法,我错过了什么吗? GetAddress 是我粘贴的代码 sn-p 中的最后一个方法。如果您得到 0 结果,请确保同一网络上有摄像机 ip,否则将广播 ip 地址更改为不同的范围。试试这个ip地址239.255.255.250 我发现广播地址是192.168.7.255。我使用了***.com/q/18551686/1977871 的可用信息。现在我得到了 45,这似乎是正确的。让我进一步分析一下。再次感谢。 我在示例中使用的soap消息是在device.wsdl中定义的探测请求,在network.wsdl中定义的NetworkVideoTransmitter请求用于检索RTSP流的url,它是基本上是视频流网址。然后,您可以使用 VLC 播放器或其他任何东西来观看流或使用 ffmpeg 将其转码为 mp4 如果你想知道你能做什么然后阅读这个页面上的wsdl规范onvif.org/Documents/Specifications.aspx

以上是关于SharpPcap 可以用来在 C# 中找到我的网络中的 ip 摄像机吗的主要内容,如果未能解决你的问题,请参考以下文章

SharpPcap - 传入的数据包被丢弃

C#使用sharppcap实现网络抓包-----2

如何从 C# 授予 Windows 10 中 Pcap 库的权限?

SharpPcap - 从标准输出捕获

c# 使用sharpPcap制作的网络监视器应用程序,每次调用应显示一个msgbox的方法每次调用显示多个msgbox

重新启动我的代码的一部分? SharpPCap 的问题