使用Apache CXF进行WS-Discovery。如何指定设备类型?

时间:2014-12-03 08:52:20

标签: web-services cxf onvif ws-discovery

我将使用Apache CXF进行兼容ONVIF的ip camera服务。它使用WS-Discovery查找设备和服务,并使用cxf supports it开箱即用:

  

cxf-services-ws-discovery-service jar将注册一个   ServerLifecyleListener将自动发布“Hello”   消息。它还将响应与之匹配的任何Probe请求   已发布的服务。

cxf如何检测要在ProbeMatches响应中发送的设备类型?如何指定我的设备是ip camera(我需要在ProbeMatches响应中设置具体设备类型,例如NetworkVideoTransmitter)?

1 个答案:

答案 0 :(得分:0)

在查看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来实现和发布服务来修复它。