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关于广播地址,我不是网络人,无法解释得更好。
所以这是你需要做的。
- 创建一个 UdpClient 并在端口 3702 上连接到 IP 192.168.1.255
- 创建 SOAP 消息以请求网络摄像机提供其 IP 地址
- 使用您的 UdpClient 发送此肥皂消息。
- 等待回复
- 收到响应后,将该字节数据转换为字符串
- 此字符串包含您需要的 IP 地址。
- 阅读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;
}
我的objective是通过C#代码列出给定网络中的所有网络摄像头。
我可以使用 GetIpNetTable(C# 代码)列出我网络上的所有 IP 地址here。
sharppcap在这方面有什么帮助吗?
请注意,我对网络完全陌生,所以请多多包涵。
或者有没有其他方法可以给定一个 ip 地址,我可以先验证它是否是一个 ip cam,然后获取它的详细信息。请注意,网络摄像头可以是任何品牌。
IP 摄像机使用 onvif 标准。据此,您可以通过使用 UDP 协议向端口 3702 上的广播 ip 地址发送 xml soap 消息来列出网络上的所有 ip 摄像头。
因此,如果您在单级网络上,那么您的广播地址将为 192.168.1.255。请google关于广播地址,我不是网络人,无法解释得更好。
所以这是你需要做的。
- 创建一个 UdpClient 并在端口 3702 上连接到 IP 192.168.1.255
- 创建 SOAP 消息以请求网络摄像机提供其 IP 地址
- 使用您的 UdpClient 发送此肥皂消息。
- 等待回复
- 收到响应后,将该字节数据转换为字符串
- 此字符串包含您需要的 IP 地址。
- 阅读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;
}