可以用SharpPcap在我的网络中用C#

时间:2016-04-21 09:01:50

标签: c# networking ip-camera sharppcap

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

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

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

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

或者是否有任何其他方式给定一个IP地址,我可以先验证它是否是一个ip cam然后获取其详细信息。请注意,ip-camera可以是任何品牌。

1 个答案:

答案 0 :(得分:3)

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

因此,如果您使用的是单级网络,那么您的广播地址将为192.168.1.255。请谷歌关于广播地址,因为我不是网络人员,不能更好地解释它。

所以这就是你需要做的。

  1. 创建UdpClient并连接到端口3702上的IP 192.168.1.255
  2. 创建SOAP消息以请求网络摄像机提供其IP地址
  3. 使用您的UdpClient发送此肥皂消息。
  4. 等待回复
  5. 到达响应后,将该字节数据转换为字符串
  6. 此字符串包含您需要的IP地址。
  7. 阅读onvif specs,看看你能做些什么。或read this
  8. 我正在粘贴代码供您参考。

    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;
            }