- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过一些Java代码来发现ONVIF设备。具体来说,我正在尝试获取他们的设备服务地址(我相信这只是他们的IP地址?),如ONVIF Core Spec指出的(在第4.3节中):“成功的发现将提供设备服务地址。设备服务地址,它可以通过设备服务接收详细的设备信息...”。我的目标是最终获得网络上ONVIF设备的详细信息。总的来说,我也在寻找有关使用ONVIF规范的指南。
我仍然对Web服务世界(以及一般而言的网络)还是陌生的,所以请原谅我。但是,我本人为此付出了很多努力:我读了很多ONVIF Core Spec,ONVIF Application Programmer's Guide和WS-Discovery Specification。如果可以的话,我将总结一下我所知道的,以便您可以告诉我我是否走在正确的轨道上:
“ Web服务”是使用平台和语言无关的Web服务标准(例如,通过IP网络的XML,SOAP和WSDL)的标准技术的名称。基本思想是我们希望能够从任何编程语言中调用有效的方法/函数(服务)。
Web服务通常托管在服务器上。但是在ONVIF用例中,Web服务提供商是ONVIF设备(例如IP摄像机)。因此,为了以任何语言与设备进行交互,我们可以使用Web服务操作/调用,因为Web服务调用可以以任何语言实现。
XML是数据描述语法(之所以使用,是因为它与语言无关;任何语言都可以解析它)。 SOAP是用于来回获取注入SOAP的XML文档的通信协议(基本上是进行我们的方法调用)。 WSDL用于描述服务(它是Web服务接口的基于XML的描述)。我已经下载了用于设备管理的WSDL here,并通过WSDL编译器wsimport
(由JDK提供)从WSDL中生成了Java类,以便在我的代码中使用。但我知道调用这些方法将在设备发现之后进行,对吗?
根据WS-Discovery规范发现了ONVIF设备。您发送Probe
消息,并且符合探针约束的设备会发回ProbeMatch
消息,如第13和14页in ONVIF Application Programmers Guide所述。
这是我开始感到困惑的地方。我如何用Java发送此消息? 《 ONVIF应用程序程序员指南》在第15页上提供了一些伪代码,但我不知道如何实现它。该指南明确指出了该指南中的4.3.1节。我知道“作用域”和“类型”只是您可以嵌入探针中的约束,但不是必需的(根据WS discovery spec的第5页)。因为我想发现所有设备,所以我认为启动不需要任何限制,对吗?
因此,该指南还在第110页上提供了用于发现的示例SOAP消息。从中删除类型声明(因为我不想使用该约束),我知道要发送的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/network/wsdl">
<e:Header>
<w:MessageID>uuid:84ede3de-7dec-11d0-c360-f01234567890</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/Pr
obe</w:Action>
</e:Header>
<e:Body>
<d:Probe>
</d:Probe>
</e:Body>
</e:Envelope>
XAddrs
,但不确定) 。我是否需要以某种方式将该SOAP消息的UDP广播发送到该地址?
最佳答案
经过反复试验,我找到了另一个解决方案。在大多数情况下,mpromonet可能是可行的方式,我只是想避免使用像Apache这样的大型依赖项。我还认为,仅使用一些简单的UDP消息传递就应该可行。
该解决方案还基于SO用户Thomas的有用代码here。我基本上只是通过删除线程来简化他的代码,并添加了一些注释。同样,他的解决方案可能比我的解决方案(表现更好)更好。但是,我的初学者(例如我)可能更容易理解。
这是代码:
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.net.*;
import javax.xml.namespace.QName;
import javax.xml.soap.*;
import java.util.*;
public class ONVIFDeviceDiscoveryFIN {
// Following constants are related to Discovery process
public static final int WS_DISCOVERY_TIMEOUT = 4000; // 4 seconds. Time to wait to receive a packet
public static final int WS_DISCOVERY_PORT = 3702;
public static final String WS_DISCOVERY_ADDRESS_IPv4 = "239.255.255.250";
// note that the probe below MUST be given a unique urn:uuid. Devices will NOT reply if the urn:uuid is not unique!
public static final String WS_DISCOVERY_PROBE_MESSAGE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
"<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:tds=\"http://www.onvif.org/ver10/device/wsdl\" xmlns:tns=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">\r\n" +
" <soap:Header>\r\n" +
" <wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action>\r\n" +
" <wsa:MessageID>urn:uuid:5e1cec36-03b9-4d8b-9624-0c5283982a00</wsa:MessageID>\r\n" +
" <wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>\r\n" +
" </soap:Header>\r\n" +
" <soap:Body>\r\n" +
" <tns:Probe>\r\n" +
" <tns:Types>tds:Device</tns:Types>\r\n" + // Constraint to find just ONVIF devices hopefully? Recall we are sending a probe on the 192.168.0.50 network; if we have no constraints, it would find everything there! WS-Discovery generally is for much more than ONVIF, like printers and stuff
" </tns:Probe>\r\n" +
" </soap:Body>\r\n" +
"</soap:Envelope>";
private static ArrayList<String> getResponsesToProbe(String uuid) throws IOException{
// TODO: add in ability to send scope and type constraints
// NOTE: We do need to know the address of the network interface to discover devices on...
// Function composes and sends a Probe to discover devices on the network. uuid is the urn:uuid to put in the probe. Functions returns all the SOAP-Infused XML responses (all the ProbeMatches).
// give the probe a unique urn:uuid (we must do this for each probe!). This is generated outside function
final String probe = WS_DISCOVERY_PROBE_MESSAGE.replaceAll("<wsa:MessageID>urn:uuid:.*</wsa:MessageID>", "<wsa:MessageID>urn:uuid:" + uuid + "</wsa:MessageID>");
// set up the "sender and receiver"; this is the socket that we send our probe from, and where we receive back the ProbeMatch responses.
// NOTE: that we do need to know the address of the network interface to discover devices on... (port could be anything)
final int port = 55000;
DatagramSocket senderAndReceiver = new DatagramSocket(port, InetAddress.getByName("192.168.0.50")); // so you do need to know the address of your network interface to discover devices on...
senderAndReceiver.setSoTimeout(WS_DISCOVERY_TIMEOUT);
// send the probe
DatagramPacket probeMsg = new DatagramPacket(probe.getBytes(), probe.length(), InetAddress.getByName(WS_DISCOVERY_ADDRESS_IPv4), WS_DISCOVERY_PORT);
senderAndReceiver.send(probeMsg);
// read in the responses
ArrayList<String> responses = new ArrayList(); // this is the collection of all SOAP-infused XML ProbeMatch responses
byte[] receiverBuffer = new byte[8192];
DatagramPacket receiverPacket = new DatagramPacket(receiverBuffer, receiverBuffer.length); // this is the packet that receive the response in. Get's updated with the next response on each call to .receive()
while (true) {
try {
senderAndReceiver.receive(receiverPacket);
responses.add(new String(receiverPacket.getData()));
} catch (SocketTimeoutException e) {
// System.out.println("Socket read timeout; taken to mean that there is no more responses -- i.e., no more Probe Matches");
break;
}
}
// close the socket
senderAndReceiver.close();
return responses;
}
public static void main(String[] args) throws IOException, SOAPException {
final String uuid = UUID.randomUUID().toString(); // generate the uuid to add to the Probe message
ArrayList<String> responses = getResponsesToProbe(uuid); // responses is a collection of all the SOAP-infused XML ProbeMatches . It's all of our responses to the probe; it's basically the devices we've discovered!
}
}
arp -a
命令(不确定在Mac或Linux上如何执行此操作),然后找到相机的IP。它所属的接口是您要用作“ 192.168.0.50”的接口。以我的有限理解,这些接口基本上可以分割您的网络,因此您需要选择合适的接口来查找设备。我认为(?)Thomas的代码通过找到所有这些网络接口避免了这个问题,这是在
his code中的第81-100行中完成的。
WS_DISCOVERY_PROBE_MESSAGE
中)中使用了硬编码的UUID进行了测试。这将一次发现设备;但是之后,如果您发送具有相同UUID的探测,则设备似乎根本不会回复。您也不会收到任何错误响应,因此为什么我很难找出答案。就像设备保留了所有收到的所有探针的UUID的内部日志一样。如果您发送带有旧UUID的探测,它只会拒绝它。至少,对于我正在测试的符合ONVIF的相机(AXIS M3045-V),情况就是如此。我不确定ONVIF规范是否需要此行为,但是至少在AXIS M3045-V中是明显的。
关于java - 如何使用WS-Discovery规范在Java中发现网络上的ONVIF设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56379926/
我们有一个 Java 项目,每天晚上使用 TeamCity 对 Java 类进行静态分析,以查找代码中容易出现的错误。我们想告诉 TeamCity 寻找开发人员可能引入的与 == 与 .equals
Promises/A+ 这是一个开放标准,旨在让不同开发者实现的 JavaScript Promise 能够无缝衔接并应用——由前辈们制定,为其他后来者提供参考 一个 promise 所
前言 🍊缘由 Git分支管理好,走到哪里都是宝 🏀事情起因: 最近翻看博客中小伙伴评论时,发现文章【规范】看看人家Git提交描述,那叫一个规矩一条回复: 本狗亲测在我司中使用规范
使用带有不存在的命名空间的命名空间限定关键字来定义规范是否被认为是不好的做法?我想在公共(public) domain 命名空间中定义实体映射...所以为了避免在合并规范时丢失数据,我使用约定 :en
有没有办法在调用 clojure.spec.test.alpha/check 时覆盖核心谓词函数的生成器? 可以通过 s/gen 中的路径覆盖谓词生成器: (gen/generate (s/gen
以内核 rpm 为例,它允许在一个系统上同时安装多个版本。规范文件中究竟是什么允许的? 我想打包一个已经存在的具有不同安装前缀的多个版本的项目。 最佳答案 百胜 找到了让 yum 安装而不是更新的方法
我正在尝试用 C# 编写 PDF 解析器,但我遇到了一个问题,我不确定如何解释规范。 除非另有说明,否则 PDF 文档中的用户空间为 1/72 英寸(即 1pt)。 Tf 运算符提供的比例将字体从标准
我正在编写一些代码,需要能够获取两个 pdf 并将它们附加到页面级别(例如,如果它们都是 2 页文档,则有一个 4 页文档,其中所有 4 页都与原始文档相同). 在不使用库的情况下,最好的方法是什么?
是否有序言语言语法,或接近它的通常用作引用的东西?我正在使用 SWI-prolog,所以有一个适合这种风格的会很好,否则一般的 prolog 语言语法/规范也能工作。 最佳答案 自 1995 年起,P
我需要一个函数来过滤参数和构建查询。我有 4 个参数,因此如果我尝试为每个条件实现查询,我将不得不写 16 (2^4)实现 - 这不是一个好主意。 我尝试使用界面改进我的代码 Specificatio
这个 ExtGState 对象对图像做了什么: > 我有 PDF 规范,但一点也不清楚。显然,这将身份函数(什么的身份?单位矩阵?)从 [0.0 1.0] 映射到 [0.0 1.0](相同),这是没有
只是想获得有关 ePub 规范的一些帮助。toc.ncx 是否必须具有 src(即 xhtml)。我观察到 .opf 文件中也提供了相同的内容 src。 最佳答案 是的,这是强制性的,这是一个设计问题
让我们看看莱宁根项目 map 的真实示例 :global-vars : ;; Sets the values of global vars within Clojure. This example
我正在开发一个 LOB 框架,它具有 SL 和 MVC 前端、WCF 后端以及在服务器上运行的几个服务模块。我一直在查看 Spec#,看它是否对我有任何帮助。不可空类型和检查异常本身非常好,但我还没有
Promises/A+规范是最小的规范之一。因此,实现它是理解它的最佳方法。福布斯·林德赛(Forbes Lindesay)的以下回答将引导我们完成实现Promises / A +规范Basic Ja
哪个文档指定了 MySQL definer 格式? 具体来说,definer admin@% 中的 % 是什么意思(以及为什么使用这个符号)? 最佳答案 这里MySQL使用的格式定义在the MySQ
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
在 css 规范中,什么会影响更多的 inline 样式或外部 !important 外部“style.css”: #di{color: green!important;} div 文本颜色是红色还
我正在努力思考 CSS 的一些细节,我从 W3 CSS Visual Formatting Spec 9.2.2 中找到了这部分摘录。特别迟钝: Inline-level boxes that are
这个问题在这里已经有了答案: Are (non-void) self-closing tags valid in HTML5? (8 个答案) 关闭 9 年前。 在 HTML5 中你应该使用 或
我是一名优秀的程序员,十分优秀!