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