如何通过“已登录”用户设置不同的对象视图?

时间:2018-12-11 11:53:26

标签: open62541

假设我有两个用户-UserA和UserB。当UserA连接到基于open62541的OPC-UA服务器时,我希望他看到:

Data
    - MyData1
    - MyData2
    - MyData3

当UserB连接时,我希望他看到:

Data
    - MyData1

有可能吗?如果可以的话,在设置​​对象节点时该在哪里使用

UA_Server_addObjectNode(UA_Server *server, 
                    const UA_NodeId requestedNewNodeId,
                    const UA_NodeId parentNodeId,
                    const UA_NodeId referenceTypeId,
                    const UA_QualifiedName browseName,
                    const UA_NodeId typeDefinition,
                    const UA_ObjectAttributes attr,
                    void *nodeContext, 
                    UA_NodeId *outNewNodeId)

1 个答案:

答案 0 :(得分:1)

您不能直接通过UA_Server_addObjectNode来做到这一点。

您在OPC UA中寻找的概念称为“视图”。

根据OPC UA规范的第3部分:

  

查看NodeClass

     

底层系统通常很大,客户经常   仅对数据的特定子集感兴趣。他们不   需要或希望负担查看AddressSpace中的节点的负担   他们对此毫无兴趣。

     

为了解决这个问题,   标准定义了视图的概念。每个视图都定义了   地址空间中的节点。整个AddressSpace是默认的   视图。视图中的每个节点只能包含其引用的一个子集,   由视图的创建者定义。视图节点充当根节点   视图中的节点。使用View NodeClass定义视图,   在表5中指定。

     

视图中包含的所有节点应为   在以下环境中浏览时,可以从“视图”节点开始进行访问   风景。预期不能浏览所有包含的节点   直接从“查看”节点,而是从其他节点浏览   包含在视图中。

     

视图节点不仅可以用作其他   进入AddressSpace的入口点,但作为组织   因此,AddressSpace是该地址子集的唯一入口点   地址空间。因此,客户端在以下情况下不应忽略视图节点   公开AddressSpace。不处理视图的简单客户端   出于过滤目的,例如,可以像   类型为FolderType的对象(请参阅5.5.3)

因此,您需要做的是创建一个视图节点,并将相应的节点附加到该视图节点。然后,用户可以从该特定视图开始浏览。

相应的方法称为UA_Server_addViewNode。然后使用UA_Server_addReference方法引用您创建的视图节点中的其他节点。引用类型应为Organizes