• Nenhum resultado encontrado

5.7 Registro e Descoberta de Serviços baseada em Qualidade de Contexto

5.7.3 Descoberta baseada em Consultas

Nesta abordagem, a aplicação consumidora só poderá descobrir os serviços disponíveis se definir e publicar uma consulta de serviços. Uma vez publicada, a consulta será recebida e resolvida por um diretório (local ou global) que publicará, em um tópico conhecido apenas pelo solicitante, a resposta contendo uma lista de serviços

5.7 Registro e Descoberta de Serviços baseada em Qualidade de Contexto 118 compatíveis com os critérios especificados na consulta. Os critérios das consultas podem levar em consideração todos os atributos da informação de contexto, inclusive os atributos de QoC. A linguagem utilizada para a especificação da consulta é a EPL Esper, o que garante uma grande expressividade de requisitos de contexto e de QoC.

A definição de qual diretório resolverá a consulta, se local ou global, dependerá do tipo de conexão do publicador. Se o publicador estiver conectado apenas ao Micro Broker Local, isso significa que apenas o diretório local responderá a consulta. Se o publicador estiver conectado ao Server Broker, a priori, apenas o diretório global pode responder a consulta. Entretanto, existe ainda a possibilidade do cliente publicar consultas visíveis por diretórios locais de outros clientes, dispensando o uso de um diretório global. Entretanto, isso requer uma configuração opcional que define um tópico de publicação de consultas comum para todos os clientes do domínio CDDL.

As Figuras 5.9 e 5.10 mostram os diagramas de sequências referentes ao processo de consulta. Pode-ser observar que a única diferença está no tipo de diretório que resolve e responde a consulta, sendo que na primeira é o Local

Directory Service, pois é uma consulta local, enquanto que na segunda é o

Global Directory Service, pois se trata de uma consulta global.

O processo inicia-se com o diretório de serviços enviando uma solicitação de subscrição no tópico em que as consultas serão publicadas. Em seguida, a aplicação consumidora se registra no tópico onde as respostas das consultas serão publicadas, de modo que esteja pronta para receber a reposta antes mesmo de efetuar a consulta. Concluída a subscrição, a aplicação define e publica uma consulta. Na sequência, o diretório recebe, resolve e publica a resposta da consulta. Por fim, a aplicação consumidora recebe a resposta da consulta. Observa-se que toda a comunicação entre a aplicação e o broker passa antes obrigatoriamente pelos componentes de subscrição e conexão. O mesmo vale para toda a comunicação entre os diretórios e o broker.

A fim de dar suporte a diferentes cenários de IoT, a M-Hub/CDDL define e implementa dois tipos de consulta: instantânea e contínua. A consulta instantânea retorna, uma única vez, uma lista contendo os publicadores e serviços disponíveis que satisfazem os critérios definidos pela aplicação, no momento em que a consulta é realizada. Após a resposta ser entregue, a execução da consulta é encerrada. A consulta contínua, por sua vez, além de retornar a lista de publicadores e serviços disponíveis

Figura 5.9: Diagrama de Sequência do Processo de Descoberta de Serviços (Local)

no momento da primeira execução da consulta, permanece em execução por tempo indeterminado, fazendo com que a aplicação requisitante seja notificada em caso de surgimento de novos provedores de serviços que atendam os requisitos da consulta. A aplicação consumidora pode cancelar a execução da consulta contínua à qualquer momento.

Naturalmente, em cenários de grande dinamismo e mobilidade (com conexões e desconexões de dispositivos acontecendo a todo momento), como IoMT, a consulta contínua tende a ser mais adequada, pois permite que a aplicação consumidora seja periodicamente notificada do surgimento de novos objetos inteligentes. Levando-se em consideração a QoC, a descoberta contínua agrega a vantagem de permitir que a aplicação consumidora tenha conhecimento do surgimento de serviços com QoC superior aos já assinados/utilizados. Desse modo, a aplicação poderá substituir o provedor de serviço em uso por aquele que apresenta

5.7 Registro e Descoberta de Serviços baseada em Qualidade de Contexto 120

Figura 5.10: Diagrama de Sequência do Processo de Descoberta de Serviços (Global)

maior QoC, o que poderá impactar positivamente no funcionamento da aplicação e na qualidade de experiência dos usuários.

A Listagem 5.14 mostra um exemplo de como a aplicação publica consultas usando o CDDL. Neste exemplo, a aplicação invoca o método query (QueryType

queryType, String epl)do componente Publisher. Este método recebe como um

seus parâmetros a consulta EPL a ser publicada. A consulta especificada procura todos os serviços de localização cuja precisão seja inferior a 5 m. O exemplo faz referência a mensagens do tipo ServiceInformationMessage na cláusula EPL uma vez que esta é a estrutura de dados que contém a descrição dos serviços. Neste exemplo, a consulta é contínua, portanto, o consumidor receberia todos os serviços disponíveis compatíveis com a consulta conforme forem descobertos.

Listing 5.14: Exemplo de consulta contínua

//obtem referencia para o publicador default e subscritor default publisher = DefaultPublisher.getInstance();

subscriber = DefaultSubscriber.getDefaultSubscriber(); // especifica os criterios da consulta

String query = ‘‘serviceName = ’LOCATION’ and accuracy < 5’’; // codigo de retorno pode ser usado para cancelar a consulta int returnCode = publisher.query(QueryType.CONTINUOUS, query); // cria um listener para receber as notificacoes

subscriber.setSubscriberListener(new ISubscriberListener() { @Override

public void onMessageArrived(Message message) { // trata as respostas da consulta

if (message instanceof QueryResponseMessage) {

QueryResponseMessage response = (QueryResponseMessage) message; // is the query response about location of [email protected]? if (message.returnCode == returnCode) {

// obtem a lista de servicos contidos na resposta da consulta List<ServiceInformationMessage> services =

response.getServiceInformationMessageList();

// subscreve-se em todos os servicos contidos na resposta for(ServiceInformationMessage info : services) {

subscriber.subscribeServiceTopic(info.getTopic()) }

} return; }

// trata mensagens contendo os dados de sensores if (message instanceof SensorDataMessage) {

SensorDataMessage sensorDataMessage = (SensorDataMessage) message; // simula a exibicao da mensagem na tela

showMessageOnUI(message); return;

} }

// caso a aplicacao precise cancelar a consulta // publisher.cancelQuery(returnCode)

5.8 Detecção de Variações de Contexto baseada em Qualidade de Contexto 122