IP攝像機使用onvif標準。據此,您可以通過使用UDP協議向端口3702上的廣播IP地址發送xml肥皂消息來列出網絡上的所有網絡攝像機。
所以,如果你在單層網絡,那麼你的廣播地址將是192.168.1.255。請谷歌關於廣播地址,因爲我不是一個網絡人,不能更好地解釋它。
所以這裏是你需要做的。
- 創建UdpClient並連接到IP 192.168.1.255端口3702
- 創建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;
}
我得到的計數爲0的列表,這意味着沒有發現攝像頭。 GetAddress方法也沒有引用任何地方,我錯過了什麼? –
VivekDev
GetAddress是我粘貼的代碼片段中的最後一個方法。如果您獲得0結果,請確保在相同網絡上有相機ips,否則請將廣播IP地址更改爲不同的範圍。試試這個IP地址239.255.255.250 – adeel41
我發現廣播地址是192.168.7.255。我在http://stackoverflow.com/q/18551686/1977871使用了info avaialbe。現在我得到45這似乎是正確的。讓我進一步分析一下。再次感謝。 – VivekDev