问题描述
我只尝试接收来自特定事件类型的事件。这个想法是然后为服务器上每个可用的 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(因此可能包含 LiteralOperand
的 Variant
包含 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))
)
}
)
});