• Nenhum resultado encontrado

Os dispositivos de armazenamento também estão modelados conforme exibe a Figura 4.19. Todos os drivers de armazenamento devem ser subclasses ou instâncias de Storage, que define quais são os atributos básicos que um ContextDriver precisa ter para fornecer informações necessárias à plataforma.

Com base nos requisitos especificados anteriormente a entidade Storage define o fornecimento das seguintes informações de contexto: capacidade total, uso atual, percentual usado e quantidade de espaço livre.

68

Comunicação

Como o próprio nome define, esta é a camada responsável por toda comunicação na plataforma. Ela é um middleware de rede que tem como função realizar a comunicação através do melhor meio disponível no momento, considerando o contexto do usuário e do dispositivo. Para ser capaz de realizar esta função, a camada de comunicação é diretamente dependente da camada de contexto e das informações providas pelos drivers de rede. Além disso um de seus princípios fundamentais é tornar o desenvolvimento de aplicações e serviços distribuídos mais simples e confiável, aumentando a capacidade de comunicação e oferecendo agilidade que a publicação de consumo de serviços móveis exigem.

A arquitetura interna desta camada foi baseada na especificação do µORB (Micro

ORB) [58] sendo dividida em quatro subcamadas: Objetos Remotos, Interoperabilidade,

Apresentação e Transporte. Sua estrutura é bem simples para não onerar a plataforma do ponto de vista de desempenho e utilização da rede. Ela foi projetada para suportar implementações de múltiplos tipos de comunicação distribuída, pois uma camada esconde os detalhes de implementação das demais.

Basicamente existem duas formas de realizar a comunicação na plataforma: uma utilizando o serviço de objetos remotos, outra utilizando diretamente a subcamada de transporte. A seguir serão detalhadas todas as subcamadas citadas. A Figura 4.20 ilustra a arquitetura interna da camada de comunicação.

Figura 4-20 - Subcamadas da Comunicação

Transporte

69

enviar e receber mensagens por todas as interfaces de rede do dispositivo, além de esconder do resto da plataforma os detalhes de baixo nível da comunicação. Ela é quem de fato se utiliza da camada de contexto para decidir qual procedimento será adotado para cada mensagem enviada pela plataforma. O transporte é realizado sem que a camada tome conhecimento do que está sendo transportado, tudo é realizado de forma transparente e para ela apenas se trata de uma sequência de bytes desestruturados. Na Figura 4.21 são exibidas as entidades que formam esta camada.

O TransportManager é a porta principal de entrada para a camada de transporte. Ele é responsável pela inicialização dos agentes de envio e recebimento de mensagem, além de preparar a fila de mensagens para agendamento de envio. A comunicação com a camada superior é feita por meio do TransportListener, que se registra no TransportManager para ser notificado quando uma mensagem é recebida pela rede e encapsulada em um

TransportMessage. O TransportMessage é uma entidade muito simples, a matéria prima da

camada de transporte, utilizada em todas suas operações. Esta entidade é composta apenas pela URL para onde deve ser enviada, o meio que deve ser utilizado para o envio (WiFi, GPRS, Bluetooth, SMS, 3G), e o buffer de bytes a ser transmitido.

Figura 4-21 - Relacionamentos das Entidades de Transporte

O TransportQueue é a entidade que implementa a fila de mensagens assíncronas, possibilitando que estas sejam postadas para envio posterior. Para operacionalizar este envio a implementação deve fazer uso de toda a infra-estrutura de contexto para planejar a estratégia de envio de cada mensagem. O acesso ao TransportQueue é realizado por meio do

TransportManager que esconde das demais entidades qual a implementação atual, e sua

função é também instanciá-la e configurá-la.

70

representa um socket genérico, independente da interface de rede, que abstrai aos seus utilizadores as particularidades e os detalhes das pilhas de protocolos relacionadas a cada uma. Toda a comunicação na plataforma é realizada através dele e assim como o

TransportQueue ele também utiliza a infra-estrutura de contexto para gerenciar as conexões e

tomar decisões relacionadas à comunicação. O TransportSocket deve ser utilizado diretamente pela plataforma ou pelas aplicações, quando desejarem se comunicar de forma instantânea e/ou síncrona, onde não seja aplicável o uso do TransportQueue.

Apresentação

A camada de apresentação é responsável por dar estrutura à sequência de bytes recebida e transformar em sequência de bytes a estrutura enviada. A implementação desta camada é flexível em relação à estrutura da mensagem, podendo dar suporte a vários tipos de comunicação distribuída, por exemplo, web services. Estas transformações são realizadas por meio da entidade abstrata Codec, que deve ser estendida por implementações capazes de codificar e decodificar algum formato de mensagem específico. A modelagem ainda provê o

DefaultCodec, que implementa um codificador genérico que serializa e deserializa instâncias

de objetos, que nesse caso representam as mensagens enviadas e recebidas.

A comunicação com a camada superior é feita por meio do PresentationListener, que se registra no PresentationManager para ser notificado quando uma mensagem for recebida da camada de transporte, for decodificada e transformada em um outro tipo de mensagem. Esta mensagem é definida e interpretada pela camada logo acima da camada de apresentação.

O PresentationManager é a entidade que faz o gerenciamento da camada, inicializaando os Codecs e permitindo o registro dos PresentationListeners.

Figura 4-22 - Modelagem da Camada de Apresentação

Interoperabilidade

71

responsável pela implementação do protocolo de comunicação que permite a invocação remota de operações. Ela gerencia as requisições em andamento e, quando é o caso, as respostas correspondentes. Além disso, define e monitora o tempo máximo que cada chamada de uma operação remota pode ter, gerando uma exceção para a camada superior quando este tempo expirar.

O InteroperabilityManager é a fachada de acesso às funcionalidades da camada, realizando o gerenciamento descrito anteriormente. Ele permite que a camada superior se registre por meio da interface InteroperabilityListener para receber notificações de mensagens recebidas das camadas mais abaixo. A comunicação para o envio ou recebimento de mensagem é realizada por meio de instâncias de InteroperabilityMessage, uma entidade simples capaz de informar a URL que a representa, a origem ou o destino da mensagem, uma

flag que identifica se a mensagem que transita pela camada é um request ou um reply. Tanto o InteroperabilityManager como o InteroperabilityMessage devem ser estendidos para prover

funcionalidades específicas ao protocolo de comunicação distribuída utilizado na implementação da camada.

Figura 4-23 - Modelagem da Camada de Interoperabilidade

Documentos relacionados