udi

name=UDI | version=0.1 | accountable=Rafael Vasconcelos | depdency= DDS

UDI

A Universal DDS Interface (UDI) é uma API similar a do DDS, mas que abstrai os detalhes específicos de diferentes produtos DDS, e inclui wrappers de tópicos DDS para cada produto DDS. Permite também a definição de politicas e perfis de QoS que são mapeados para as primitivas específicas de cada produto DDS. O uso da UDI facilita muito a troca entre produtos DDS. Atualmente, a UDI está disponível para os produtos: RTI Connext, DDS Open Splice Community Edition, e CoreDX DDS.

O UDI implementa os mesmos elementos básicos usados no DDS: Domain Participants, Publishers, Subscribers, Tópicos, DataReaders e DataWriters. O exemplo abaixo mostra como se faz isso para um tópico.Message.

  this.dds = UniversalDDSLayerFactory.getInstance();
  this.dds.createParticipant(UniversalDDSLayerFactory.CNET_DOMAIN);
  this.dds.createPublisher();
  this.dds.createSubscriber();
 
  GroupDefinerListener groupDefinerDDSListener = new GroupDefinerListener(this);
 
  Object messageTopic = this.dds.createTopic(Message.class, Message.class.getSimpleName());
 
  this.dds.createDataReader(groupDefinerDDSListener, messageTopic);
  this.dds.createDataWriter(messageTopic);

E o listener do exemplo acima recebe objetos do tipo Message e precisa implementar o callback onNewData, como segue:

public class GroupDefinerListener implements UDIDataReaderListener<ApplicationObject> {
    /** 
   * {@inheritDoc}
   */
  @Override
  public void onNewData(ApplicationObject nodeMessage) {
    //do something…
  }
}

Para utilizar os Extensible and Dynamic Topic Types for DDS (DDS-XTypes), é bem simples. Precisa ser criado o tópico, isto é, o seu nome e atributos, o qual é armazenado no Metadata Sharing Service. Feita a criação do tópico, os publicados e assinantes podem usar o tópico dinâmico.

Um tópico dinâmico é representação por uma estrutura do tipo chave-valor, onde a chave é o nome do atributo e o valor é o valor que o atributo terá.

O código abaixo inicializa a UDI usando RTI no domínio “_domainId”.

      this.dds = UniversalDDSLayerFactory.getInstance(SupportedDDSVendors.RTI);
      this.dds.createParticipant(this._domainId);

Para verificar se o tópico dinâmico “SDDLLocation” já foi criado, recuperar sua representação, assinar o tópico e por fim enviar um dado do tipo SDDLLocation, utiliza-se o seguinte código.

    private void startApplication()
    {
        _metadata = this.dds.getMetadataByName("SDDLLocation");
 
        if(_metadata == null)
        {
            System.out.println("Could not retrieve the specified metadata");
            return;
        }
 
        System.out.println("Retrieved metadata: " + _metadata.toString());
 
        // Creates a (or uses an existing) dynamic topic with this Metadata
        DynamicDDSTopic dynamicDDSTopic = dds.createDynamicDDSTopic(_metadata);
        dynamicDDSTopic.subscribe(this);
    }
 
    @Override
    public void onNewDynamicData(String topicName, HashMap<String, Object> hashMapRepresentation)
    {
        System.out.println("TopicName : " + topicName + "\nValues: " + hashMapRepresentation.toString());
    }
 
    private void writeData()
    }
        HashMap<String, Object> newInstance = _metadata.getHashMapInstanceRepresentation();
 
        newInstance.put("uuid", "1234"); //"String", 
 
        dynamicDDSTopic.publish(newInstance);
    }

Para criar um novo tópico dinâmico, pode-se utilizar o seguinte código:

    private void createEntities()
    {
        Metadata newMetadata = createSDDLLocationMetadata();
 
        System.out.println("Created metadata: " + "\n" + newMetadata.toString());
 
        // Adds the entity on the service
        //_metadataSharingService.addMetadata(newMetadata);
        dds.addMetadata(newMetadata);
    }
 
    private static Metadata createSDDLLocationMetadata()
    {
        String  name    = "SDDLLocation";
        String  kind    = "EventType";
        String  info    = "Sent by mobile nodes with location data.";
        boolean enabled = true;
 
        Metadata newMetadata = new Metadata(name, kind, info, enabled);
 
        ArrayList<MetadataMember> members = new ArrayList<MetadataMember>();
 
        MetadataMember stringUUIDMember     = new MetadataMember("uuid", "String", 1024, true, "The UUID of the monitored node that sent the SDDLLocation.");
        members.add(stringUUIDMember);
 
        //...
 
        // Adds all the members to the new entity
        newMetadata.addMembers(members);
 
        return newMetadata;
    }

Para criar o listener do tópico dinâmico, a classe deve implementar a interface “DynamicDataListener”, que contém o método “onNewDynamicData”.

Mais detalhes podem ser obtidos do UDI Developer Guide (udi_developer_guide.pdf)

Descrever a arquitetura do componente. As principais classes e relações que sustentam o componente.

Detalhes de implementação, por exemplo, descrevendo as principais rotinas e os seus fluxos de execução, por onde o desenvolvedor deveria olhar para modificar esse componente.

Rafael Vasconcelos, UDI Developer Guide (release 0.2), October 2013. (udi_developer_guide.pdf)

  • udi.txt
  • Last modified: 2017/07/21 03:08
  • (external edit)