{{template>:doctable | 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. ===== Usage ===== 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 { /** * {@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 hashMapRepresentation) { System.out.println("TopicName : " + topicName + "\nValues: " + hashMapRepresentation.toString()); } private void writeData() } HashMap 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 members = new ArrayList(); 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|}}) ===== Architecture ===== Descrever a arquitetura do componente. As principais classes e relações que sustentam o componente. ===== Implementation Details ===== 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. ===== References ===== Rafael Vasconcelos, UDI Developer Guide (release 0.2), October 2013. ({{:udi_developer_guide.pdf|}})