过滤事件类型

问题描述

我只尝试接收来自特定事件类型的事件。这个想法是然后为服务器上每个可用的 EventType 创建一个自定义的 Eventfilter,只允许接收 EventType 特定的属性。但是一旦我实现了 Contentfilter(where 子句),就不会再收到任何事件。

在这个例子中,我想过滤掉除 BaseEvents 之外的所有事件。有人知道如何为此编写正确的 Contentfilter 吗?提前致谢。

EventFilter eventFilter = new EventFilter(
            new SimpleAttributeOperand[]{
                new SimpleAttributeOperand(
                    Identifiers.BaseEventType,new Qualifiedname[]{new Qualifiedname(0,"EventId")},AttributeId.Value.uid(),null)
            },new ContentFilter(new ContentFilterElement[]{
                new ContentFilterElement(
                    FilterOperator.Equals,new ExtensionObject[]{
                        ExtensionObject.encode(client.getSerializationContext(),new SimpleAttributeOperand(
                                Identifiers.BaseEventType,"BaseEventType")},null))
                    }
                )
            })
        );

解决方法

我不知道这是否是全部错误,但一方面,保存事件类型的变量的 BrowseName 是“EventType”,而不是“BaseEventType”,因此您的 SimpleAttributeOperand 定位错误财产。

其次,Equals 运算符将需要 2 个操作数(它将“EventType”的值与什么进行比较?)。因此,您需要另一个操作数,它只是 BaseEventType 的 NodeId(因此可能包含 LiteralOperandVariant 包含 Identifiers.BaseEventType)。

所以可能是这样的:

ContentFilter contentFilter = new ContentFilter(new ContentFilterElement[]{
    new ContentFilterElement(
        FilterOperator.Equals,new ExtensionObject[]{
            ExtensionObject.encode(
                client.getStaticSerializationContext(),new SimpleAttributeOperand(
                    Identifiers.BaseEventType,new QualifiedName[]{new QualifiedName(0,"EventType")},AttributeId.Value.uid(),null
                )
            ),ExtensionObject.encode(
                client.getStaticSerializationContext(),new LiteralOperand(new Variant(Identifiers.BaseEventType))
            )
        }
    )
});