Узел добавления Java Milo OPC-UA

Я использую Milo и его пример сервера и клиента. Я добавляю узлы на сервер, но не могу понять, как добавить EuInformation, т.е. единицу измерения и описание. Я думал об использовании ExtensionObject, но поскольку EuInformation не реализует Serializable, я не знаю, как передать его ExtensionObject. Я также хотел бы знать, как я могу получить идентификатор пространства имен и URI на стороне клиента. Пока я просто устанавливаю их статически, так как у меня есть доступ к классам.

Я реализовал 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);
}

person Rick    schedule 12.04.2017    source источник
comment
Думаю, обо всем по порядку: реализовали ли вы службу AddNodes на своем сервере? В противном случае вы не сможете добавить этот узел из клиента.   -  person Kevin Herron    schedule 12.04.2017
comment
Уже сделал это. Добавление узлов работает правильно. Я также умею читать и писать им.   -  person Rick    schedule 12.04.2017


Ответы (1)


Хорошо, поэтому вы должны добавить новый VaribleNode с определением типа свойства (Identifiers.PropertyType).

Затем вы должны написать в его атрибут Value, чтобы он содержал объект EUInformation:

EUInformation euInformation = ...

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

...write the value to the node you created...
person Kevin Herron    schedule 12.04.2017
comment
Спасибо. Добавил, что я сделал, к моему первоначальному вопросу. - person Rick; 14.04.2017