2017-04-12 2 views
0

Ich verwende Milo und seine Beispielserver und Client. Ich füge Knoten zum Server hinzu, aber ich kann nicht herausfinden, wie man EuInformation, d. H. Einheit und Beschreibung, hinzufügt. Ich dachte über die Verwendung der ExtensionObject, aber seit EuInformation nicht implementiert Serializable Ich weiß nicht, wie man es an die ExtensionObject übergeben. Ich würde auch gerne wissen, wie ich die Namespace-ID und URI auf der Client-Seite bekommen kann. Bisher habe ich sie nur statisch gesetzt, da ich Zugriff auf die Klassen habe.Java Milo OPC-UA Knoten hinzufügen

Ich habe die AddNodes auf Serverseite implementiert. Ich kann Knoten hinzufügen, Knoten lesen und auf Knoten schreiben. Hier ist, was ich auf Client-Seite tun:

// 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(); 

EDIT

Mit Hilfe von Kevin Herron Antwort ich etwas herausgearbeitet: Ich habe die write() in meinem Namespace-Klasse angepasst. Ich kann jetzt den Anzeigenamen und die Beschreibung des Knotens mit den Werten der EUInformation ändern. Hier ist meine write() Methode:

@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

Das Wichtigste zuerst, denke ich: implementiert haben Sie den AddNodes Dienst in Ihrem Server? Wenn nicht, können Sie diesen Knoten nicht vom Client hinzufügen. –

+0

Bereits getan, dass. Das Hinzufügen von Knoten funktioniert ordnungsgemäß. Ich kann ihnen auch lesen und schreiben. – Ricky

Antwort

0

Ok, so dass Sie würde eine neue VaribleNode mit einem Typedefinition von Immobilien (Identifiers.PropertyType) hinzuzufügen.

Dann würden Sie seinen Wert Attribut schreiben, damit es die EUInformation Objekt enthält:

EUInformation euInformation = ... 

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

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

Danke. Hinzugefügt, was ich mit meiner ursprünglichen Frage gemacht habe. – Ricky

Verwandte Themen