我的目标是通过 C# 代码列出给定网络中的所有网络摄像机。
我可以在此处使用 GetIpNetTable(C# 代码)列出我网络上的所有 IP 地址。
Sharppcap在这方面有什么帮助吗?
注意我对网络完全陌生,所以请多多包涵。
或者有没有其他方法可以给定一个 IP 地址,我可以先验证它是否是一个 ip cam,然后获取它的详细信息。请注意,网络摄像机可以是任何品牌。
IP 摄像机使用onvif标准。据此,您可以通过使用 UDP 协议向端口 3702 上的广播 IP 地址发送 xml soap 消息来列出网络上的所有 IP 摄像机。
因此,如果您在单级网络上,那么您的广播地址将是 192.168.1.255。请谷歌关于广播地址,因为我不是网络人,无法更好地解释它。
所以这就是你需要做的。
我正在粘贴代码供您参考。
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;
}