我将使用Apache CXF进行ONVIF兼容的网络摄像机服务。它使用 WS-Discovery 来查找设备和服务,cxf 开箱即用地支持它:
cxf-services-ws-discovery-service jar 将注册一个 ServerLifecyleListener,将自动发布"Hello" 消息。它还将响应与 它已发布的服务。
cxf 将如何检测要发送ProbeMatches
响应的设备类型?如何指定我的设备是网络摄像机(例如,我需要在 ProbeMatch 响应中设置具体的设备类型NetworkVideoTransmitter
(?
在查看了 CXF 源代码(WSDiscoveryServiceImpl
类(后,我找到了答案:
public ProbeMatchesType handleProbe(ProbeType pt) {
List<HelloType> consider = new LinkedList<HelloType>(registered);
//step one, consider the "types"
//ALL types in the probe must be in the registered type
if (pt.getTypes() != null && !pt.getTypes().isEmpty()) {
ListIterator<HelloType> cit = consider.listIterator();
while (cit.hasNext()) {
HelloType ht = cit.next();
boolean matches = true;
for (QName qn : pt.getTypes()) {
if (!ht.getTypes().contains(qn)) {
matches = false;
}
}
if (!matches) {
cit.remove();
}
}
}
//next, consider the scopes
matchScopes(pt, consider);
if (consider.isEmpty()) {
return null;
}
ProbeMatchesType pmt = new ProbeMatchesType();
for (HelloType ht : consider) {
ProbeMatchType m = new ProbeMatchType();
m.setEndpointReference(ht.getEndpointReference());
m.setScopes(ht.getScopes());
m.setMetadataVersion(ht.getMetadataVersion());
m.getTypes().addAll(ht.getTypes());
m.getXAddrs().addAll(ht.getXAddrs());
pmt.getProbeMatch().add(m);
}
return pmt;
}
简而言之 - 它迭代已发布的服务并比较 QNames。如果在已发布中找到搜索的 qname,则会将其添加到 ProbeMatch
中。所以我应该使用所需的 QName 实现和发布服务来修复它。