2017-04-12 121 views
0

我使用Milo及其例如服務器和客戶端。我加入的節點服務器,但我無法弄清楚如何添加EuInformation,即單位和描述。我想過使用ExtensionObject,但由於EuInformation沒有實現Serializable我不知道如何將它傳遞給ExtensionObject。我也想知道如何在客戶端獲得名稱空間ID和URI。到目前爲止,我只是靜靜地設置它們,因爲我可以訪問這些類。的Java米洛OPC-UA添加節點

我已經實現了服務器端的AddNodes。我可以添加節點,讀取節點並寫入節點。 這裏是我做的客戶端是什麼:

// Should somehow get the namespace ID and namespace dynamically. 
// Maybe by iterating through all nodes?? 
ExpandedNodeId parentNodeId = new ExpandedNodeId(
            new nodeId(2,DatatypeNamespace.NODE_IDENTIFIER), 
            datatypeNamespace.NAMESPACE_URI, 0); 

NodeId referenceTypeId = Identifiers.String; 

// Define the new node. 
ExpandedNodeId requestedNewNodeId = new ExpandedNodeId(new NodeId(2, "NewNode"), 
                DatatypeNamespace.NAMESPACE_URI, 0); 

QualifiedName browseName = new QualifiedName(2, "NewNode"); 

// How to get this to the server?? 
EUInformation euinfo = new EUInformation(null,-1,LocalizedText.english("MyUnit"), 
               LocalizedText.english("My Description")); 

ExpandedNodeId typeDef = new ExpandedNodeId(Identifiers.BaseVariableType, 
                DatatypeNamespace.NAMESPACE_URI, 0); 

AddNodesItem newItem = new AddNodesItem(parentNodeId, referenceTypeId, 
       requestedNewNodeId,rowseName,NodeClass.VariableType, null, typeDef); 

List<AddNodesItem> items = new ArrayList<AddNodesItem>(); 
     items.add(newItem); 

client.addNodes(items).get(); 

編輯

與凱文·赫倫的答案的幫助我工作的東西了:我在命名空間中的類調整write()。我現在可以使用EUInformation的值修改節點的顯示名稱和描述。這裏是我的write()方法:

@Override 
public void write(WriteContext context, List<WriteValue> writeValues) { 
    List<StatusCode> results = Lists.newArrayListWithCapacity(writeValues.size()); 

    for (WriteValue writeValue : writeValues) { 
     ServerNode node = server.getNodeMap().get(writeValue.getNodeId()); 

     if (node != null) { 
      // Get the type of the variant thats about to be written to the node 
      NodeId variantType = writeValue.getValue().getValue().getDataType().get(); 
      if (variantType.equals(Identifiers.Structure)) { 
       ExtensionObject o = (ExtensionObject) writeValue.getValue().getValue().getValue(); 
       if (o.getEncodingTypeId().equals(Identifiers.EUInformation_Encoding_DefaultBinary)) { 

        EUInformation euInformation = (EUInformation) o.decode(); 
        node.setDescription(euInformation.getDescription()); 
        node.setDisplayName(euInformation.getDisplayName()); 
        System.out.println("Wrote EUInformation " + euInformation); 
        results.add(StatusCode.GOOD); 
        context.complete(results); 
        return; 
       } 
      } 
      try { 

       node.writeAttribute(new AttributeContext(context), writeValue.getAttributeId(), 
         writeValue.getValue(), writeValue.getIndexRange()); 

       results.add(StatusCode.GOOD); 

       System.out.println(String.format("Wrote value %s to %s attribute of %s", 
         writeValue.getValue().getValue(), 
         AttributeId.from(writeValue.getAttributeId()).map(Object::toString).orElse("unknown"), 
         node.getNodeId())); 
      } catch (UaException e) { 
       System.out.println(String.format("Unable to write %s", writeValue.getValue())); 
       results.add(e.getStatusCode()); 
      } 
     } else { 
      results.add(new StatusCode(StatusCodes.Bad_NodeIdUnknown)); 
     } 
    } 

    context.complete(results); 
} 
+0

首先第一件事情,我想:你在你的服務器實現的AddNodes服務?如果不是,您將無法從客戶端添加此節點。 –

+0

已經做到了。添加節點工作正常。我也可以讀寫他們。 – Ricky

回答

0

好了,你將添加一個新的VaribleNode與物業的類型定義(Identifiers.PropertyType)。

那麼你會因此它包含EUInformation對象寫入它的Value屬性:

EUInformation euInformation = ... 

Variant v = new Variant(ExtensionObject.encode(euInformation)); 

...write the value to the node you created... 
+0

謝謝。添加了我對原始問題的解答。 – Ricky