Можно ли использовать SharpPcap для поиска IP-камер в моей сети в C#
Моя цель - перечислить все ip-камеры в данной сети с помощью кода C#.
Я могу перечислить все IP-адреса в моей сети, используя GetIpNetTable(код C#) здесь.
Может ли Sharppcap помочь в этом отношении?
Обратите внимание, я абсолютно новичок в сети, поэтому, пожалуйста, потерпите меня.
Или есть какой-либо другой способ, с помощью которого, учитывая IP-адрес, я мог бы сначала проверить, является ли он IP-камерой, а затем получить его детали. Обратите внимание, что ip-камера может быть любой марки.
1 ответ
IP-камеры используют стандарт ONVIF. В соответствии с этим вы можете перечислить все ip-камеры в вашей сети, отправив мыльное сообщение xml на широковещательный IP-адрес на порт 3702, используя протокол UDP.
Так что если вы находитесь в одноуровневой сети, то ваш широковещательный адрес будет 192.168.1.255. Пожалуйста, Google о широковещательном адресе, потому что я не сетевой человек и не могу объяснить это лучше.
Итак, вот что вам нужно сделать.
- Создайте UdpClient и подключитесь к IP 192.168.1.255 через порт 3702
- Создайте сообщение SOAP, чтобы запросить сетевые камеры, чтобы дать их IP-адрес
- Отправьте это мыльное сообщение, используя свой UdpClient.
- Ждите ответов
- Как только получен ответ, преобразуйте эти байтовые данные в строку
- Эта строка содержит IP-адрес, который вам нужен.
- Прочтите спецификации onvif и посмотрите, что вы можете сделать. или прочитайте это
Я вставляю код для вашей справки.
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;
}