INSTITUTO FEDERAL DO ESPÍRITO SANTO
PÓS-GRADUAÇÃO LATO SENSU EM ENGENHARIA ELÉTRICA COM ÊNFASE
EM SISTEMAS INTELIGENTES APLICADOS À AUTOMAÇÃO
GABRIEL LORENZONI BENZ
SISTEMA MULTIPLATAFORMA DE AQUISIÇÃO DE DADOS
VITÓRIA
2015
GABRIEL LORENZONI BENZ
SISTEMA MULTIPLATAFORMA DE AQUISIÇÃO DE DADOS
Monografia apresentada ao Curso de PósGraduação Lato Sensu em Engenharia Elétrica
com Ênfase em Sistemas Inteligentes Aplicados à
Automação do Instituto Federal do Espírito Santo
como requisito parcial para obtenção do
certificado
de
Especialista
em
Sistemas
Inteligentes Aplicados à Automação.
Orientador: Prof. Me. Marcelo Brunoro
VITÓRIA
2015
(Biblioteca Nilo Peçanha do Instituto Federal do Espírito Santo)
B471s Benz, Gabriel Lorenzoni.
Sistema multiplataforma de aquisição de dados / Gabriel
Lorenzoni benz. – 2015.
65 f. : il. ; 30 cm
Orientador: Marcelo Brunoro.
Monografia (especialização) – Instituto Federal do Espírito
Santo, Coordenadoria de Pós-Graduação em Engenharia Elétrica,
Curso Pós-Graduação Lato Sensu em Engenharia Elétrica com
Ênfase em Sistemas Inteligentes Aplicados à Automação, 2015.
1. Engenharia elétrica. 2. Sistemas embarcados
(Computadores). 3. Integração de aplicações corporativas (Sistemas
de computação). 4. Engenharia de Sistemas. I. Brunoro, Marcelo. II.
Instituto Federal do Espírito Santo. III. Título.
CDD 21 – 621.3
GABRIEL LORENZONI BENZ
SISTEMA MULTIPLATAFORMA DE AQUISIÇÃO DE DADOS
Monografia apresentada ao Curso de PósGraduação Lato Sensu em Engenharia Elétrica
com Ênfase em Sistemas Inteligentes Aplicados à
Automação do Instituto Federal do Espírito Santo
como requisito parcial para obtenção do
certificado
de
Especialista
em
Sistemas
Inteligentes Aplicados à Automação.
Aprovada em 16 de março de 2015
COMISSÃO EXAMINADORA DECLARAÇÃO DO AUTOR
Declaro, para fins de pesquisa acadêmica, didática e técnico-científica, que este
Trabalho de Conclusão de Curso pode ser parcialmente utilizado, desde que se faça
referência à fonte e ao autor.
Vitória, 16 de março de 2015
Dedico a minha família e ao meu avô Roberto, por não terem medido esforços para
que eu concluísse mais esta etapa e por serem fiéis incentivadores da minha eterna
busca por conhecimento.
RESUMO O aumento do número de dispositivos com capacidade de se conectar à Internet
contribui para uma rede de comunicação de dados cada vez mais difusa e
heterogênea. Dessa forma, prover uma comunicação confiável entre dispositivos
cada vez mais distintos em arquitetura e em recursos computacionais se torna uma
tarefa complexa. O objetivo deste trabalho é, portanto, propor uma forma de
comunicação entre sistemas heterogêneos, estruturando um sistema multiplataforma
de aquisição de dados, que coleta e transmite informações para um sistema de
interface web remoto, onde os dados podem ser analisados e monitorados. Para
isso, o sistema é composto por um Middleware Orientado a Mensagens, que é
projetado para suportar uma vasta gama de protocolos, ser utilizável em uma ampla
variedade de servidores de aplicação e possuir clientes em diferentes linguagens de
programação, possibilitando o sistema de aquisição de dados a enviar informações
para o sistema de monitoramento de diferentes formas, de acordo com sua
capacidade e interoperabilidade.
Palavras Chave: Internet das coisas. Sistemas embarcados. Integração de sistemas.
Middleware orientado a mensagens.
ABSTRACT
The increasing number of internet-capable devices contributes to a data
communication network increasingly diffuse and heterogeneous. Thus, to provide a
reliable communication among devices that are distinct in architecture and
computational resources becomes complex over time. Therefore, the purpose of this
paper is to suggest a configuration of communication among heterogeneous devices
and systems, by structuring a multi platform data acquisition system, which collects
and transmits data to a remote web application, where the data can be analyzed and
monitored. To perform this, it's used a message-oriented middleware, designed to
support a large number of Cross Language Clients, to speak a wide range of
Protocols and to be usable in a wide variety of Containers, allowing the acquisition
system to send information to the monitoring system in different ways, according to
their capacity and interoperability.
Keywords: Internet of Things. Embedded Systems. Message Oriented Middleware.
LISTA DE FIGURAS
Figura 1 - Modelo de comunicação com M.O.M. ...................................................... 11
Figura 2 - Sistema de Baixo Custo para Termometria de Grãos. ............................. 14
Figura 3 - Sistema Web de Monitoração de Dados .................................................. 14
Figura 4 - Sistema com utilização de Computação nas Nuvens ............................... 15
Figura 5 - Modelo de Comunicação Síncrona ........................................................... 18
Figura 6 - Modelo de Comunicação Assíncrona ....................................................... 19
Figura 7 - Acoplamento do MOM com aplicações .................................................... 23
Figura 8 - Fila de Mensagens com produtores e consumidores ............................... 24
Figura 9 - Fluxograma do Sistema ............................................................................ 28
Figura 10 - Sistema de Aquisição de Dados - Beaglebone....................................... 30
Figura 11 - Diagrama de Circuitos ............................................................................ 30
Figura 12 - Console de Administração do ActiveMQ ................................................ 32
Figura 13 - Diagrama de blocos ................................................................................ 34
Figura 14 - Log do Sistema de Aquisição na Beaglebone ........................................ 38
Figura 15 - Lista de tópicos do ActiveMQ - dl.topic.data ........................................... 39
Figura 16 - Lista de filas do ActiveMQ - dl.newData.queue ...................................... 39
Figura 17 - Organização dos projetos ....................................................................... 41
Figura 18 - Dashboard do Sistema de Monitoramento ............................................. 42
Figura 19 - Página de Listagem de Data (informação) ............................................. 43
Figura 20 - Página Real Time com informações dos últimos 5 minutos ................... 43
Figura 21 - Página de Listagem de Devices (dispositivos) ....................................... 44
Figura 22 - Página de Formulário de Device (dispositivo) ........................................ 44
Figura 23 - Página de Listagem de Setpoints ........................................................... 45
Figura 24 - Página de Formulário de Setpoints......................................................... 45
Figura 25 - Página de Notifications (notificações) ..................................................... 46
Figura 26 - Console de Administração - Amazon EC2.............................................. 47
SUMÁRIO
1
INTRODUÇÃO ............................................................................................... 9
1.1
OBJETIVO GERAL ....................................................................................... 10
1.2
ORGANIZAÇÃO DO TRABALHO ................................................................ 12
2
REFERENCIAL TEÓRICO ........................................................................... 13
2.1
TRABALHOS CORRELATOS ...................................................................... 13
2.2
FUNDAMENTAÇÃO TEÓRICA .................................................................... 15
2.2.1
Data Logger ................................................................................................. 16
2.2.2
Aplicações Web .......................................................................................... 17
2.2.3
Modelos de Comunicação ......................................................................... 17
2.2.3.1 Comunicação Síncrona ................................................................................ 18
2.2.3.2 Comunicação Assíncrona ............................................................................. 18
2.2.4
Middleware e a Integração de Sistemas ................................................... 20
2.2.5
Middleware orientado a mensagens ......................................................... 21
2.2.6
Gerenciadores de Fila de Mensagens ...................................................... 23
2.2.7
JMS – Java Message Service .................................................................... 25
2.2.7.1 Topic – tópicos ............................................................................................. 25
2.2.7.2 Queues – filas ............................................................................................... 26
3
METODOLOGIA .......................................................................................... 27
3.1
SISTEMA DE AQUISIÇÃO DE DADOS ....................................................... 28
3.2
SISTEMA GERENCIADOR DE MENSAGENS ............................................ 31
3.3
SISTEMA DE MONITORAMENTO DE DADOS ........................................... 32
3.4
PUBLICAÇÃO NA NUVEM .......................................................................... 35
4
IMPLEMENTAÇÃO E RESULTADOS ......................................................... 36
4.1
SISTEMA DE AQUISIÇÃO DE DADOS ....................................................... 36
4.2
SISTEMA DE GERENCIAMENTO DE MENSAGENS ................................. 38
4.3
SISTEMA DE MONITORAMENTO .............................................................. 40
4.4
PUBLICAÇÃO NA NUVEM .......................................................................... 50
5
CONCLUSÕES E TRABALHOS FUTUROS ............................................... 49
REFERÊNCIAS ............................................................................................ 53
APÊNDICE A - Código do Sistema de Aquisição de Dados (Beaglebone White) .... 56
APÊNDICE B - Código e configuração do ActiveMQ ................................................ 63
9 1 INTRODUÇÃO
A inserção de dispositivos computacionais inteligentes no mercado e no cotidiano
das pessoas é um fato inquestionável. Pesquisas evidenciam que o número de
dispositivos capazes de se conectar à Internet é cada vez maior.
Stamford (2013) cita um estudo feito pela empresa de consultoria e pesquisa
Gartner Inc., concluindo que essa quantidade de dispositivos com a capacidade de
se conectar à Internet chegará a 26 bilhões em 2020. Outra pesquisa, realizada pela
ABI Research, estima que esse número será ainda maior no mesmo ano, chegando
a expressivos 30 bilhões de dispositivos.
É importante ressaltar que esses dispositivos não são apenas smartphones ou
tablets, mas todo dispositivo capaz de transmitir dados pela rede, desde pequenos
sensores para monitoramento de um ambiente a microcontroladores com
Inteligência Artificial.
Esse aumento do número de dispositivos vinculados à Internet colabora para que
termos como "internet das coisas", "computação ubíqua" e "computação
onipresente" estejam cada vez mais em discussão e presentes em estudos em
diversas áreas, tais como: monitoramento ambiental, apresentado por Li et al.
(2011); operações de monitoramento e controle de infraestruturas, conforme
trabalhos de Gubbi et al. (2013); aplicações industriais, em Severi et al. (2014);
gerenciamento de energia, citado por Ersue et al. (2014); sistemas de assistência
médica, mostrado por Istepanian et al. (2011); automação residencial Alkar, A. Z.;
Buhur, U. (2005).
A Internet das Coisas é, segundo Holler et al. (2014), a interconexão de dispositivos
embarcados unicamente identificáveis dentro da infraestrutura da Internet.
Normalmente, é esperado que a Internet das Coisas ofereça conectividade
avançada entre dispositivos, sistemas e serviços que vão além da comunicação
máquina-a-máquina (M2M - Machine to Machine) e abrange uma variedade de
protocolos, domínios e aplicações.
10 A Internet das Coisas tem como objetivo facilitar a troca de informações sobre entre outros - bens em uma rede de fornecimento global, isto é, a infraestrutura de
tecnologia de informação deveria prover informações sobre essas “coisas” de
maneira segura e confiável (WU et al., 2010).
No entanto, o grande número de dispositivos, dos mais variados tipos, favorece para
que a troca de informações se torne uma tarefa difícil, principalmente em sistemas
heterogêneos, ou seja, quando os dispositivos do sistema são divergentes quanto à
arquitetura (plataforma), sistema operacional, configurações de hardware, fabricante,
entre outras.
Nota-se uma crescente difusão da Internet, que evolui constantemente buscando
acomodar todas as tecnologias de redes emergentes que apresentam novas
características e requisitos. Essas redes emergentes variam desde simples acesso
residencial até controles industriais complexos através da Internet.
Portanto, como prover, nessa rede heterogênea, uma interação eficiente e confiável
entre
dispositivos
cada
vez
mais
distintos
em
arquitetura
e
recursos
computacionais?
Tanenbaum (2002) cita que um recurso bastante utilizado nos dias de hoje está
relacionado às tecnologias para comunicação entre processos e dispositivos através
de troca de mensagens (programação distribuída).
1.1 OBJETIVO GERAL
O objetivo deste trabalho é propor uma forma de comunicação entre sistemas
heterogêneos, estruturando um sistema multiplataforma de aquisição de dados,
responsável por coletar e transmitir informações para um sistema de interface web
remoto, onde os dados podem ser analisados e monitorados.
11 Para isto, foi desenvolvida uma estrutura distribuída, composta por um middleware
responsável por fazer a comunicação entre o sistema de aquisição de dados e o
sistema de monitoramento através de troca de mensagens.
O Middleware Orientado a Mensagens (representado pela sigla M.O.M.) é projetado
para suportar um grande número de clientes implementados em diferentes
linguagens de programação, além de conseguir trabalhar com uma vasta gama de
protocolos e ser utilizável em uma ampla variedade de servidores de aplicação,
possibilitando o sistema de aquisição de dados a enviar informações para o sistema
de monitoramento de formas variadas, de acordo com sua capacidade.
A Figura 1 exibe o modelo de comunicação entre um emissor e um receptor,
simulando uma rede heterogênea, com dispositivos emissores de dados de tipos e
arquiteturas variados, interagindo com um receptor (no caso deste trabalho, um
sistema web, onde os dados serão monitorados) por intermédio de um gerenciador
de fila de mensagens (M.O.M.).
Figura 1 - Modelo de comunicação com M.O.M.
Fonte: Elaborado pelo autor, 2015.
A utilização do Middleware Orientado a Mensagens no modelo de comunicação
proposto permite que os emissores de informação sejam desacoplados do receptor.
Segundo Curry(2005), esse tipo de middleware permite a criação de sistemas
12 coesos e flexíveis; um sistema coeso é aquele que permite que as alterações em
uma parte do sistema seja feita sem comprometer outras partes do sistemas.
1.2 ORGANIZAÇÃO DO TRABALHO
A estrutura deste trabalho apresenta-se com os seguintes capítulos:
•
Capítulo 1, Introdução, que contextualiza o trabalho por meio da explicação
da proposta e motivo de construção de um sistema multiplataforma de
aquisição de dados;
•
Capítulo 2, Referencial Teórico, onde são destacados alguns trabalhos
correlatos, levantando suas limitações e vantagens. Além disso, nesse
capítulo também é feito o estudo de fundamentação teórica, em que são
apresentados conceitos fundamentais para a compreensão do trabalho;
•
Capítulo 3, Metodologia, aborda como o sistema foi separado em etapas, os
métodos de desenvolvimento e os materiais utilizados em cada etapa;
•
Capítulo 4, Implementação e Resultados, contempla todo o desenvolvimento
em cada sistema, como os projetos foram organizados e implementados, as
configurações feitas, os resultados obtidos, as páginas e os logs dos
sistemas desenvolvidos; e
•
Capítulo 5, Conclusões e Trabalhos Futuros, onde são apresentadas as
considerações finais, abordando os aprendizados e deduções obtidas com o
trabalho proposto, bem como sugestões para posteriores evoluções do
sistema.
13 2 REFERENCIAL TEÓRICO
Neste capítulo são apresentados os aspectos teóricos relevantes à elaboração do
presente trabalho.
Este capítulo está dividido em duas partes: na primeira, são analisadas as
características de alguns trabalhos correlatos que serviram de base para a
elaboração do sistema apresentado. Na segunda parte, são apresentados os
conceitos, descrições, esquemas de arquitetura que esclarecem e justificam as
tecnologias computacionais utilizadas.
2.1 TRABALHOS CORRELATOS
Os trabalhos correlatos analisados nesta seção apresentam características
semelhantes: todos possuem um sistema de aquisição de dados (seja preparado
para coletar diferentes informações ou apenas uma informação específica) que
alimenta um sistema (podendo ser remoto ou local) que faz o monitoramento dos
dados coletados.
Cantú, Dyego (2013) e Ferrasa e Mayer (2013) optaram por embarcar todo o data
logger (sistema de aquisição e sistema de monitoramento dos dados) em um único
dispositivo. Os autores fizeram essa opção tendo como principais justificativas o
baixo custo e a facilidade de implementação.
A Figura 2 exibe a estrutura do sistema proposto por Ferrasa e Mayer (2013),
mostrando desde a aquisição dos dados por meio de sensores de temperatura, a
forma de transmissão e recepção dos dados, até o acesso e monitoramento das
informações em um sistema escrito na linguagem de programação Java.
14 Figura 2 - Sistema de Baixo Custo para Termometria de Grãos
Fonte: Ferrasa e Mayer (2013)
Um grande diferencial encontrado nos trabalhos de Inácio et al. (2012), Cantú,
Dyego (2013), Ferrasa e Mayer (2013) foi uso da interface web para exibição das
informações coletadas. Dessa forma, os dados obtidos podem ser acessados em
tempo real a partir de qualquer lugar (e qualquer dispositivo) que acesse a Internet,
o que, segundo os autores, facilita e agiliza a análise dos dados.
A Figura 3 mostra uma das telas do sistema web de monitoramento de dados
proposto por Cantú, Dyego (2013).
Figura 3 - Sistema Web de Monitoração de Dados
Fonte: Cantú (2013)
15 Inácio et al. (2012) ainda fez a opção de publicar os dados coletados na nuvem1, o
que tende a aumentar a disponibilidade do sistema, além de diminuir custos de sua
manutenção, hospedagem e implantação. Para isso, foi feita a utilização do Sistema
web API Cosm, que permite, entre outras coisas, consultar as informações coletadas
em um determinado período de tempo.
A Figura 4 exibe a proposta do sistema elaborado por Inácio et al. (2012), que
possui um gateway que recebe todos os dados coletados em diferentes sistemas de
aquisição e depois os envia para um sistema remoto em que os dados serão
monitorados.
Figura 4 - Sistema com utilização de Computação nas Nuvens
Fonte: Inácio et al. (2012)
2.2 FUNDAMENTAÇÃO TEÓRICA
Para melhor entendimento do problema e de sua solução, é importante familiarizarse com alguns termos e conceitos. Por este motivo, são descritas nesta seção as
1
Segundo Mell, Peter e Grance, Timothy (2011), computação em nuvem (em inglês, cloud
computing), é um modelo para permitir acesso à rede de forma ubíqua, conveniente e sob demanda,
provendo acesso a recursos computacionais configuráveis (por exemplo, redes, servidores,
armazenamento, aplicações e serviços) que podem ser fornecidos e liberados com um esforço
mínimo de gerenciamento ou interação com o provedor de serviços.
16 definições e características das tecnologias que foram utilizadas no presente
trabalho com o intuito de facilitar a comunicação entre dispositivos de diferentes
plataformas e sanear (ou pelo menos, minimizar) alguns dos problemas
evidenciados anteriormente nos trabalhos correlatos.
2.2.1 Data Logger
Em Omega Tech (2009), o termo data logger é definido como:
[...] qualquer dispositivo que pode ser usado para armazenar dados. Isto
inclui muitos dispositivos de aquisição de dados, tais como placas plug-in ou
sistemas de comunicação serial que usam um computador como um
sistema de gravação de dados em tempo real. No entanto, a maioria dos
fabricantes de instrumentos considera um data logger um dispositivo stand
alone, que pode ler vários tipos de sinais elétricos e armazenar os dados na
memória interna para ser carregado mais tarde para um computador. A
vantagem dos Data Loggers é que eles podem funcionar
independentemente de um computador, ao contrário de muitos outros tipos
de dispositivos de aquisição de dados.
No presente trabalho, o termo Data Logger, proveniente do inglês e comumente
utilizado na literatura será substituído, em sua maioria, para seu equivalente em
português: “Sistema de Aquisição de Dados”.
Esses sistemas, segundo Rajmond (2010), têm sido amplamente utilizados, não só
em ambientes eletrônicos, mas em todos os sistemas que se referem à tecnologia.
Mahzan et al. (2013) afirmam que, além de ser um dispositivo cujo o trabalho
principal é armazenamento de dados, ele também tem a capacidade de monitorar
um sistema, isto é, pode gravar todos os dados requeridos pelo usuário e informar
ao usuário, quando necessário, como em uma situação de defeito ou qualquer erro
ocorreu ao sistema. Além disso, têm a capacidade de armazenar todos os dados
armazenados em memória de armazenamento para que o usuário seja capaz de
recuperar estes dados com facilidade a qualquer momento necessário. São
construídos juntando-se o microcontrolador com o armazenamento da memória e
sensor.
17 Conforme Wei et al. (2012), na maioria das vezes, os data loggers são equipados
com um relógio de tempo real para que ele seja capaz de registrar a hora e a data
ao registrar todos os dados.
2.2.2 Aplicações Web
Segundo Cantú, Dyego (2013), os serviços web utilizam a infraestrutura de rede
Internet para disponibilizar acesso à informação e a aplicativos. A arquitetura dos
aplicativos que executam utilizando serviços Internet é denominada cliente/servidor.
Um servidor pode disponibilizar acesso a um aplicativo ou conter páginas
hospedadas de texto a serem exibidas no cliente. O cliente é o aplicativo
denominado navegador para acesso ao conteúdo de páginas web ou para prover
acesso a aplicativos desenvolvidos para execução na Internet.
Cantú, Dyego (2013) ainda afirma que a conexão entre o cliente e o servidor é,
geralmente, realizada pelo protocolo TCP/IP (Transmission Control Protocol/Internet
Protocol), pelo menos nas aplicações denominadas web tradicionais que são as
baseadas em HTML (HyperText Markup Language).
Em termos de serviços, de um lado está o cliente web (browser ou navegador) que
solicita dados ao servidor web, que recebe as respostas, formata a informação e a
apresenta ao usuário; do outro lado está o servidor web que recebe as requisições,
executa as instruções necessárias (podendo, se necessário, buscar informações em
um repositório de dados externo) e retorna os dados para o cliente.
2.2.3 Modelos de Comunicação
Dois modelos de comunicação denominam a forma de interação entre ambientes
computacionais distribuídos: o modelo de comunicação síncrona e o modelo de
comunicação assíncrona.
18 Esta seção introduz conceitos básicos sobre as duas abordagens, explicando suas
características e evidenciando suas vantagens e desvantagens.
2.2.3.1 Comunicação Síncrona
Segundo Curry (2005), quando um procedimento, função ou método é chamado
usando o modelo de interação síncrona, o emissor (ou caller, quem faz a chamada
do procedimento remoto) deve bloquear e esperar (suspender o processamento) até
que o receptor (called, procedimento que é chamado) conclua a execução e retorne
o controle para ela; o código chamador pode então continuar o processamento.
Neste caso, o sistema não tem controle de processamento independente, ou seja, o
sistema precisa confiar no retorno do controle do método chamado para então
continuar o processamento.
Figura 5 - Modelo de Comunicação Síncrona
Fonte: Curry. (2005)
2.2.3.2 Comunicação Assíncrona
19 Curry (2005), afirma que modelo de interação assíncrona, ilustrado na Figura 6,
permite que o emissor (caller) mantenha o controle de processamento. Dessa forma,
o emissor não precisa bloquear e esperar o receptor (called) retornar.
Este modelo permite que o emissor continue o processamento, independentemente
do estado de processamento do procedimento / função / método chamado. Este
modelo de interação requer um intermediário para lidar com a troca de requisições;
normalmente este intermediário é uma fila de mensagens.
Embora mais complexo do que o modelo síncrono, o modelo assíncrono permite
todos os participantes a manter a independência de processamento. Os
participantes podem continuar o processamento, independentemente do estado dos
outros participantes.
Figura 6 - Modelo de Comunicação Assíncrona
Fonte: Curry. (2005)
A natureza assíncrona de comunicação fornece as seguintes vantagens no design2,
implementação e manutenção de um sistema:
(1) flexibilidade, já que a estrutura de comunicação desacopla as aplicações e
as deixa independentes e autônomas, provendo maior flexibilidade ao atualizar e/ou
2
Design de Software, segundo Freeman e Hart (2004), se refere a todas as atividades envolvidas na
conceituação, enquadramento, implementação e modificação de sistemas complexos.
20 integrar outras aplicações com menor efeito colateral no sistema todo ou outros
componentes;
(2) Eficiência, uma vez que o sender pode continuar com seu trabalho
imediatamente depois de enviar a mensagem. Isso é especialmente importante para
operações que levam muito tempo para serem finalizadas;
(3) Robustez, já que o sender pode enviar a mensagem mesmo se o
recebedor não estiver disponível no momento. M.O.M.s podem também fornecer
níveis de tolerância de falhas, usando filas de mensagens persistentes que permitem
que mensagens não enviadas ou não lidas sejam enviadas novamente depois de
falhas do sistema.
2.2.4 Middleware e a Integração de Sistemas
Para Bakken (2001), middleware é:
[...] uma classe de software projetada para ajudar a
gerenciar a complexidade e heterogeneidade inerente a
sistemas distribuídos. Define-se como uma camada de
software acima do sistema operacional, mas abaixo do
programa de aplicação que fornece uma abstração de
programação comum em um sistema distribuído. Isto
reduz significativamente a carga sobre programadores de
aplicativos por aliviá-los desse tipo de programação
tediosa e propensa a erros.
Middleware também são conhecidos como programas intermediadores. Qiyang
(2006) cita que middleware pode ser classificado como sendo de banco de dados,
Remote Procedure Call (RPC), servidor de aplicação, orientado a mensagem
(MOM), Object Request Broker (ORB), monitores de processamento de transações e
Middleware Web.
21 Em Hohpe, Gregor e Woolf, Bobby (2003), a integração enterprise envolve o uso
uma das anteriores tecnologias para conectar díspares e sistemas heterogêneos. A
integração por mensagens é, supostamente, uma das opções mais utilizadas para a
integração, uma vez que pode suportar a operação assíncrona, prover baixo
acoplamento3, facilidade de encaminhamento e suporte a transformação e transação
de mensagem4.
Nos middlewares orientados à mensagem, as aplicações se comunicam entre si
através de um sistema de mensagens que controla a recepção e entrega da
mensagem. Há muitos exemplos de middleware orientado a mensagens
proprietários como IBM MQSeries, MSMQ da Microsoft e Tibco (RAMKUMAR I.;
BALASUNDARAM C., 2012).
Muitas das soluções proprietárias usam protocolos não padronizados e envolvem
custos de licenciamento enormes. Há muitas alternativas de código aberto para a
mensagem middleware orientado como a suíte de produtos Apache (Apache Camel,
Apache ServiceMix, Open ESB, Apache ActiveMQ e Apache CXF), Mule, Spring
Integration e JBoss Enterprise Application Platform. Muitos deles oferecem suporte a
todos os padrões empresariais de integração, bem como fornecem uma linguagem
de domínio específico que pode ser usada para criar endpoints, rotas, filas e regras
de tradução.
2.2.5 Middleware orientado a mensagens
Os sistemas MOM (middleware orientado a mensagens) proporcionam comunicação
distribuída em função do modelo de interação assíncrona.
3
Segundo Eder, Kappel e Schrefl (1992), no desenvolvimento de software, o acoplamento é a medida
das interdependências entre métodos e classes de objetos. O baixo acoplamento leva um programa a
ser mais confiável e de fácil manutenabilidade.
4
Segundo Prakash Malani (2012), na especificação JMS, uma transação organiza e agrupa a
mensagem em uma unidade atômica de processamento.
22 Segundo Curry (2005), este modelo sem bloqueio permite o MOM resolver muitas
das limitações encontradas nos sistemas de comunicação síncrona. Os participantes
de um sistema baseado em MOM não são obrigados a bloquear e esperar uma
mensagem de envio, eles são autorizadas a continuar o processamento, uma vez
que uma mensagem foi enviada. Isto permite a entrega de mensagens quando o
emissor ou receptor não está ativo ou disponível para responder no momento da
execução.
Esse tipo de middleware suporta a entrega de mensagens que pode demorar alguns
minutos para entregar, ao contrário de mecanismos como RPC (RMI) que entregam
em milissegundos ou segundos.
Ao utilizar MOM, um aplicativo de envio não tem qualquer garantia de que sua
mensagem será lida por outro aplicativo nem é dada uma garantia sobre o tempo
que levará a mensagem a ser entregue. Estes aspectos são determinados
principalmente pela aplicação de recepção.
Implementações de sistemas distribuídos baseados em MOM, como mostrado na
Figura 7, oferecem uma abordagem baseada em serviços para comunicação entre
processos.
Segundo Tanenbaum (2002), mensagens MOM são semelhantes ao serviço postal.
As mensagens são entregues aos correios; em seguida, o serviço postal leva
responsabilidade para a entrega segura da mensagem.
As principais vantagens do MOM consistem no baixo acoplamento entre os
sistemas, alta confiabilidade, escalabilidade 5e disponibilidade.
5
Segundo Bondi (2000), escalabilidade é uma característica desejável em todo o sistema, em uma
rede ou em um processo, que indica sua capacidade de manipular uma porção crescente de trabalho
de forma uniforme, ou estar preparado para crescer.
23 Figura 7 - Acoplamento do MOM com aplicações
Fonte: Curry. (2005)
2.2.6 Gerenciadores de Fila de Mensagens
A fila de mensagens é um conceito fundamental dentro MOM, já que elas fornecem
a capacidade de armazenar mensagens em uma plataforma MOM. Dessa forma,
clientes MOM são capazes de enviar e receber mensagens de e para uma fila.
Segundo Curry (2005), a filas são fundamentais para a implementação do modelo de
interação assíncrona dentro do MOM. Uma fila, como mostrado na Figura 8, é um
destino para onde as mensagens podem ser enviadas e recebidas; geralmente, as
mensagens contidas em uma fila são classificadas em uma ordem particular.
A fila padrão encontrada em um sistema de mensagens é (FIFO) First-In First-Out;
como o nome sugere, a primeira mensagem a entrar na fila é a primeira mensagem
a sair (e, por isso, também conhecido como PEPS).
24 Figura 8 - Fila de Mensagens com produtores e consumidores
Fonte: Curry. (2005)
Um gerenciador de filas de mensagem (message broker) é um programa que traduz
mensagens de um protocolo de um remetente (sender) para um recebedor (receiver)
em uma rede, em outras palavras, faz o intermédio da comunicação entre
aplicações.
Segundo Yamamoto (2009), um gerenciador de filas de mensagem pode ser visto
como um conjunto de filas (embora Curry represente apenas um), no qual as
mensagens são armazenadas e enviadas de acordo com a ordem de chegada.
O objetivo desse tipo de ferramenta em um sistema distribuído é realizar o
balanceamento de carga entre os servidores através da gerência dos dados das
filas, ou seja, uma vez que determinada fila estiver cheia devido a uma grande
quantidade de mensagens que estiverem sendo processadas pelo servidor, o broker
pode ser configurado para enviar mensagens para as filas de outro servidor que
dispõe de maior quantidades de recursos ociosos e subutilizados, e com isso,
aproveitar de forma mais eficiente os recursos do ambiente.
O gerenciador de filas utilizado no presente trabalho é o AtiveMQ, uma ferramenta
open source que implementa Serviços de Mensagem Java (Java Message System JMS) permitindo comunicação entre processos com suporte para clientes em várias
linguagens, entre elas Java (HORSTMANN, 2001), C++ (STROUSTRUP, 1993),
Ruby (FLANAGAN, 2008), Python (LUTZ, 2006).
Além disso, o ActiveMQ tem muitas características avançadas, como por exemplo, o
25 suporte a JMS 1.1 e J2EE 1.4, que fornece recursos como agrupamento (clustering)
e armazenamento de múltiplas mensagens.
2.2.7 JMS – Java Message Service
Atualmente, existe uma série de implementações MOM, incluindo ActiveMQ,
RabbitMQ, WebSphere MQ, TIBCO, SonicMQ, Herald, Hermes, Siena, OpenJMS e
etc.
Segundo Curry (2005), para simplificar o desenvolvimento de sistemas utilizando
MOMs, um padrão foi preciso para fornecer uma interface universal para as
interações através de mensagens. Com isso, alguns padrões surgiram, tais como
CORBA Event Service, CORBA Notification Service e a mais importante: Java
Message Service, JMS.
Curry (2005) ainda afirma que o JMS fornece uma forma comum para o
programador criar, enviar, receber e ler mensagens, já que a especificação JMS
provê uma base sólida para a construção de infraestrutura de mensagens que
podem ser aplicadas a uma larga quantidade de aplicações.
A especificação JMS define uma API de proposta geral para serviços de mensagem
e um conjunto de semânticas que descrevem a interface e o comportamento geral
de um serviço de mensagem.
O objetivo da especificação JMS é, portanto, fornecer de uma maneira consistente
um padrão de interagir com múltiplos sistemas de mensagem heterogêneos.
2.2.7.1 Topic – tópicos
Na especificação JMS, um topic (tópico) implementa a semântica de publicação e
assinatura.
26 Quando uma mensagem é publicada, ela é enviada para todos os assinantes que se
inscreveram para receber as mensagens daquele tópico, logo, zero ou muitos
assinantes irão receber uma cópia da mensagem enviada.
Somente os assinantes que tiverem a assinatura no momento em que o broker
recebe a mensagem receberão uma cópia da mensagem.
2.2.7.2 Queues – filas
Uma fila JMS implementa a semântica de balanceamento de carga. Uma mensagem
única será recebida por exatamente um consumidor. Se não houver consumidores
disponíveis no momento em que a mensagem é enviada, ela será mantida na fila até
que um consumidor disponível possa processá-la.
27 3 METODOLOGIA
Para o desenvolvimento do trabalho, optou-se pela implementação de cada
componente do sistema separadamente.
O trabalho foi dividido em 4 etapas, descritos a seguir:
(1) Desenvolvimento do sistema de aquisição de dados: nesta etapa foi
necessário
o
estudo
do
dispositivo
escolhido,
compreender
seu
funcionamento, bem como entender como ocorre sua interface com
periféricos e componentes que fazem a coleta de informações.
Após esse estudo, foi desenvolvido um programa escrito em Java para
coletar informações e enviá-las para o gerenciador de fila de mensagens;
(2) Configuração do gerenciador de fila de mensagens: em que foi feito
um levantamento dos principais brokers do mercado e optou-se pelo uso
do ActiveMQ.
Nesta etapa também foi feita toda a configuração do broker e a definição
dos protocolos de comunicação, que recebem e transportam as
mensagens entre os sistemas;
(3) Desenvolvimento do sistema de monitoramento dos dados: nesta
etapa foi desenvolvido um sistema web para monitoramento dos dados,
com funções para acompanhamento em tempo real e acesso a dados
históricos, que podem ser acessados de qualquer dispositivo com acesso
à Internet; e
(4) Disponibilização do sistema: nesta etapa foi feito um estudo para definir
a
infraestrutura
computacional
em
nuvem
que
seria
utilizada.
Posteriormente, foi feito o deploy (disponibilização) do sistema de
gerenciamento de fila de mensagens e o sistema de monitoramento dos
dados em uma micro instância da Amazon EC2.
A Figura 9 mostra o fluxograma do processo, apresentando desde o seu início,
coleta do dado, a montagem da mensagem e o envio para o gerenciador de filas
(processos realizados pelo sistema de aquisição de dados), até a mensagem chegar
28 ao destino final, que é o sistema de monitoramento, passando antes pelo sistema
gerenciador de fila de mensagens.
Figura 9 - Fluxograma do Sistema
Fonte: Elaborado pelo autor, 2015.
3.1 SISTEMA DE AQUISIÇÃO DE DADOS
O sistema de aquisição de dados tem como responsabilidade fazer a coleta da
informação e manipular essa informação de forma a garantir que ela seja enviada
corretamente para o broker (sistema de gerenciamento de fila de mensagens).
29 O sistema foi escrito utilizando a linguagem de programação Java, em sua versão
JDK 7 64-bit da Oracle e embarcado em uma Beaglebone White, que é baseada no
SoC (System on Chip) AM3359, um ARM Cortex-A8 da Texas Instruments que roda
em até 720MHz e possui 32KiB de cache L1, 256KiB de cache L2, 176KiB de ROM
e 64KiB de SRAM interna, mais 256 MiB de RAM DDR2.
Além disso, a Beaglebone White possui acelerador gráfico 3D, controlador LCD de
24 bits, controlador para a interface touchscreen e já possui em seu SoC um
controlador de ethernet (a nível de hardware), bem como a pilha TCP/IP provida pelo
Sistema Operacional (distribuição Linux, Angstrom) instalado em seu SD Card.
No caso do presente trabalho, são coletados os dados de temperatura (em graus
Celsius) e a intensidade luminosa do ambiente.
A coleta de temperatura foi feita utilizando um Thermistor NTC 10 kΩ (Negative
Temperature Coefficient). Nesse tipo de termistor, por ter o coeficiente de
temperatura negativo, como sugere o nome, sua resistência diminui com o aumento
da temperatura.
Já para coletar os dados de intensidade luminosa, foi utilizado um sensor de luz
baseado em um divisor resistivo entre um LDR e um resistor de 10 kΩ, em que o
primeiro está conectado à 1,8 V e o segundo conectado à referência (GND_ADC).
A Figura 10 mostra o circuito utilizado para coletar as informações de temperatura e
luminosidade na Beaglebone.
30 Figura 10 - Sistema de Aquisição de Dados - Beaglebone
Fonte: Elaborado pelo autor, 2015.
A Figura 11 mostra o diagrama de circuitos para obtenção das informações.
Figura 11 - Diagrama de Circuitos
Fonte: Elaborado pelo autor, 2015.
Na Beaglebone White é possível ler cada uma das 8 entradas analógicas de 12 bits
no subdiretório tsc. No entanto, somente 7 estão disponíveis em seu conector de
expansão.
31 Nessas entradas analógicas, o valor de tensão aplicado deve ser de 0 a 1,8 V,
obtendo um valor convertido para o digital de 0 a 4095, sendo que a entrada ain1 do
Sistema Operacional (e consequentemente, a entrada de leitura do programa em
Java), corresponde à entrada analógica 0 do AM3359 (AIN0 - pino 39, do conector
P9 da Beaglebone). A mesma lógica se aplica às demais entradas.
Portanto, a implementação do programa consiste na leitura da informação analógica
convertida para o valor digital. Após a coleta da informação, o valor é adequado para
a unidade de medida escolhida (no caso da temperatura, usou-se “Celsius” e no
caso da intensidade luminosa, adotou-se o valor digital coletado), a mensagem é
estruturada e então enviada para o broker.
Após a estruturação da mensagem, foi construída a lógica de transmissão da
mesma para o gerenciador de filas de mensagens. Como se trata de enviar
informações para um sistema remoto, foi anexado à Beaglebone um cabo ethernet
RJ-45 com acesso à Internet.
Com isso, foi possível enviar mensagens com informações coletadas no sistema
embarcado (Beaglebone) através do protocolo TCP para o endereço de IP externo
do sistema gerenciador de fila de mensagens.
3.2 SISTEMA GERENCIADOR DE MENSAGENS
A comunicação entre os sistemas de aquisição e o sistema de monitoramento no
presente trabalho foi feita por meio de um middleware orientado a mensagens, do
tipo gerenciador de fila de mensagens.
Esse middleware foi projetado para remover a dependência (acoplamento) entre os
sistemas de coleta de dados e o de monitoramento, possibilitando a integração e o
compartilhamento de dados entre as partes sem qualquer interrupção por espera de
resposta para as mensagens enviadas, ou seja, assíncrono.
32 A ferramenta escolhida para coordenar essa comunicação foi o Apache Active MQ,
conforme mostrado na Figura 12, por ser uma ferramenta open source6 e bastante
popular no mercado, além de suportar clientes de várias linguagens de programação
(como Java, C, C++, C#, Ruby, Perl, Python, PHP), diferentes protocolos (OpenWire,
Stomp, AMQP, MQTT), possuir suporte às melhores práticas de integração de
sistemas e seguir a especificação JMS.
Figura 12 - Console de Administração do ActiveMQ
Fonte: Elaborado pelo autor, 2015.
Toda mensagem recebida pelo ActiveMQ foi configurada para ser persistida
(gravada) em um repositório de dados específico chamado KahaDB, que é um
banco de dados baseado em arquivo, otimizado para gravar informações de forma
rápida e confiável.
Persistir a mensagem é um passo importante para garantir que o sistema consiga se
recuperar sem perder informações em caso de qualquer problema com o envio da
mensagem para o destino.
3.3 SISTEMA DE MONITORAMENTO DE DADOS
6
Open source: denota um software cujo código-fonte original é disponível livremente e pode ser
redistribuído e modificado.
33 Após os dados serem enviados para o broker, a mensagem é então enviada para o
sistema de monitoramento de dados que tem dois principais objetivos:
(1) gravar a informação recebida em um banco de dados; e
(2) exibir as informações adquiridas em um sistema web, que pode ser
acessado por qualquer dispositivo que tenha acesso à Internet.
Todo o sistema de monitoramento foi escrito utilizando a linguagem de programação
Java, em sua versão JDK 7 64-bit da Oracle, com utilização do framework Spring
MVC 3.0.7 e do servidor de aplicação Apache Tomcat 7.0.54.
A escolha de um framework para o desenvolvimento de um sistema web é
extremamente recomendada, uma vez que praticamente todas as funcionalidades
de desse tipo de sistema lidam diretamente com o protocolo HTTP.
Mesmo com a ajuda dos containers (servidores de aplicação como o Apache
Tomcat) e a API de Servlets, que encapsulam o protocolo e facilitam o trabalho do
desenvolvedor, muito conhecimento é necessário e muito trabalho é feito
repetidamente para desenvolver até as lógicas mais simples.
Sendo assim, frameworks MVC (model-view-controller), como o Spring, diminuem o
impacto da API de Servlets e permitem o desenvolvedor se preocupar mais com a
lógica de negócios, que é o código que gera valor para aplicação.
Para o gerenciamento, construção e implementação do projeto, a ferramenta
adotada foi o Apache Maven 3.0.5. Existem várias ferramentas de construção (build)
no mercado, a mais conhecida delas é o Make, muito utilizado em projetos escritos
em C e C++, mas esse possui algumas desvantagens em Java e não é muito
utilizado.
O Maven, portanto, se encarrega de fazer de forma automatizada algumas
atividades repetitivas que sem ele, teriam que ser executadas manualmente, como o
gerenciamento de dependências, build do código, geração dos artefatos, geração de
relatórios e documentação, etc.
34 Todas as informações recebidas no sistema de monitoramento que são enviadas
pelo broker (gerenciador de filas) são persistidas em um banco de dados MySQL
5.6, escolhido principalmente por ser um banco de dados gratuito, de código aberto,
simples e muito utilizado no mercado.
A Figura 13 ilustra o sistema através de um diagrama de blocos, mostrando os
principais componentes do sistema, desde os emissores de mensagens, passando
pelo M.O.M., com seu repositório de dados KahaDB até o sistema de
monitoramento, com seu banco de dados MySQL.
Figura 13 - Diagrama de blocos
Fonte: Elaborado pelo autor, 2015.
Além das ferramentas acima, foram utilizados:
(a) Hibernate 4.3.6, como framework de persistência ORM (mapeamento
objeto-relacional) que implementa a especificação JPA (Java Persistence API);
(b) Apache Camel 2.11.1, como um ESB embutido para facilitar o manuseio e
roteamento das mensagens;
(c) Spring Security 3.1.4, para segurança e autenticação no sistema;
(d) JUnit 4.11 e JMock 2.6.0, para testes unitários automatizados;
(e) Log4j 1.2.17 e Slf4j 1.7.2, como ferramentas de log; e
(f)
Twitter
Bootstrap
3.2.0,
framework
desenvolvimento de elementos de interface.
front-end,
para
facilitar
o
35 As ferramentas utilizadas no projeto foram escolhidas de acordo com suas
funcionalidades, por serem de código aberto, possuírem uma documentação técnica
rica, serem bastante utilizadas no mercado e por serem previamente conhecidas
pelo autor.
3.4 PUBLICAÇÃO NA NUVEM
Depois de finalizados o protótipo do sistema de monitoramento de dados e a
configuração do gerenciador de fila de mensagens, foi feita a publicação das
aplicações na nuvem, utilizando uma micro instância da Amazon EC2 (Elastic
Compute Cloud). Tanto o sistema de monitoramento quanto o gerenciador de fila de
mensagens foram publicados na nuvem.
Fazer o uso de computação na nuvem é uma tendência do mercado atual. As
diversas plataformas existentes no mercado já são bem maduras e vêm sendo cada
vez mais utilizadas.
Atualmente, é possível fazer uso de plataformas que fazem provisionamento de
infraestrutura (IaaS - Infrastructure as a Service), como Amazon ou Azure, que
permitem utilizar recursos computacionais (processamento, memória, espaço em
disco, etc.) à medida em que forem sendo utilizados.
A Amazon Web Services (AWS), plataforma escolhida para o presente trabalho,
fornece uma estrutura elástica de fácil escalabilidade, bastante flexível para
progredir de acordo com as necessidades e evolução do sistema. Além de toda
infraestrutura, uma série de serviços são oferecidos, podendo ser contratados
conforme necessidade.
36 4 IMPLEMENTAÇÃO E RESULTADOS
Este
capítulo
apresenta
os
sistemas
implementados
como
resultado
do
desenvolvimento deste trabalho, desde o programa para a aquisição do dado,
passando pela lógica de envio de mensagem para o broker até as páginas
desenvolvidas para o sistema de monitoramento.
4.1 SISTEMA DE AQUISIÇÃO DE DADOS
O desenvolvimento do projeto iniciou-se com a implementação do sistema de
aquisição de dados, que consiste no desenvolvimento de um programa capaz de
coletar dados e transmiti-los para um sistema remoto.
O código fonte do programa pode ser encontrado no Apêndice A.
No caso do presente trabalho, para leitura dos dados de temperatura, fez-se a leitura
da entrada analógica 0 da Beaglebone (equivalente à ain1 no sistema operacional).
Para os dados de intensidade luminosa, leu-se a entrada analógica 1, que
corresponde à entrada ain2 no sistema operacional.
Após os dados serem coletados, as informações adquiridas foram estruturadas em
forma de mensagem, fazendo o uso de uma sintaxe específica (JSON), conforme
mostra o Quadro 1.
Quadro 1 - Exemplos de Mensagens de Luminosidade e Temperatura
{
"eventType":{
"@class":"DataEventType",
"name":"NEW_DATA"
},
"guid":"ABCD",
"data":{
"type":"Light",
"unit":"",
"value":900,
37 "device":"Beaglebone White"
}
}
{
"eventType":{
"@class":"DataEventType",
"name":"NEW_DATA"
},
"guid":"DEFG",
"data":{
"type":"Temperature",
"unit":"C",
"value":27.5,
"device":"Beaglebone White"
}
}
Fonte: Elaborado pelo autor, 2014.
O formato JSON é apenas um dos muitos dos formatos conhecidos e foi escolhido
para o protótipo por ser de fácil entendimento e implementação.
As estruturas mostradas no Quadro 1 exemplificam mensagens do tipo
"NEW_DATA", que são compostas por um GUID (identificador universal) e pelas
informações do tipo de dado coletado (“Temperature” para informações de
temperatura e “Light” para intensidade luminosa), unidade de medida (C, Celsius), o
valor coletado e o dispositivo em que o dado foi coletado (ambas Beaglebone
White).
Após estruturada a mensagem, foi feita a configuração da conexão entre os
sistemas para que a troca de informações fosse possível. Para isso, foram
configurados 3 conectores de transporte, que operam em 3 protocolos diferentes,
TCP (porta 61616), Stomp (porta 61613) e HTTP (porta 61615).
O programa embarcado na Beaglebone se conecta com o gerenciador de fila de
mensagens através do protocolo TCP, na porta 61616 e, em caso de qualquer
eventual falha nessa conexão, o protocolo Stomp é utilizado, fazendo uso da porta
61613.
38 A Figura 14 mostra o log gerado ao ser executado o programa que faz a coleta das
informações e as envia para o gerenciador de mensagens.
Figura 14 - Log do Sistema de Aquisição na Beaglebone
Fonte: Elaborado pelo autor, 2015.
Conforme mostrado no log da aplicação, o programa primeiramente tenta fazer a
conexão com o sistema de gerenciamento de fila de mensagens e, após obter
sucesso neste passo, iniciam-se a coleta e o envio das informações.
4.2 SISTEMA DE GERENCIAMENTO DE FILA DE MENSAGENS
Todas as mensagens referentes às informações coletadas são estruturadas ainda
nos sistemas de aquisição de dados com o tipo NEW_DATA. Então, essas
mensagens são enviadas para o tópico dl.data, que agrupa todas as mensagens do
tipo data (NEW_DATA, DATA_UPDATED, etc.).
39 Todo o código de configuração do ActiveMQ é mostrado no Apêndice B.
Assim que a mensagem chega ao tópico dl.data (JMS topic), ela é persistida em um
repositório de arquivos (KahaDB). Só após persistir a mensagem o broker considera
a mensagem enviada com sucesso.
Passada essa etapa, um consumidor JMS transfere a mensagem do tópico para a
fila dl.newData.queue e então a mensagem enviada para um processador, já no
Sistema de Monitoramento, que irá transformar a mensagem recebida para um
objeto Java, e depois persistirá esse objeto no banco de dados.
As Figuras 15 e 16 exibem, nesta ordem, os tópicos e filas no console administrativo
do ActiveMQ.
Figura 15 - Lista de tópicos do ActiveMQ - dl.topic.data
Fonte: Elaborado pelo autor, 2015.
Figura 16 - Lista de filas do ActiveMQ - dl.newData.queue
Fonte: Elaborado pelo autor, 2015.
40 4.3 SISTEMA DE MONITORAMENTO
O Sistema de Monitoramento tem 2 funções:
(1) persistir as informações vindas do broker no banco de dados; e
(2) permitir a visualização e monitoramento dessas informações (seja em
tempo real ou com possibilidade de acesso à base histórica) via navegador.
O sistema foi estruturado em 9 projetos, separados de acordo com suas respectivas
propostas e responsabilidades, conforme descrito na Tabela 1:
Tabela 1 - Descrição das responsabilidades de cada projeto
Projeto
Proposta
dl-base
Fornecer classes básicas necessárias a todos os demais
projetos;
dl-persistence-api
Prover estruturas básicas para persistência dos dados;
dl-jms
Estruturar configurações JMS, tais como propagação de
transações, cache, conexões jms, etc.;
dl-messaging-api
Prover estruturas básicas para o envio e tratamento de
mensagens;
dl-messaging-
Fornecer classes úteis ao tratamento de mensagens, como
camel
classes que serializam ou desserializam mensagens, classes
de evento de mensagem, rotas, etc.;
dl-new-data-
Configurar rotas de mensagem para consumir eventos do tipo
messaging-
NEW_DATA e também estruturar os processadores desse tipo
consumer
de mensagem;
dl-core
Fornecer classes (entidades, serviços e estruturas de dados)
fundamentais do projeto;
dl-application
Estruturar controladores da aplicação web, configurações de
41 segurança e autenticação;
dl-web-application
Configurar projeto web, fornecer recursos como páginas html,
arquivos CSS e Javascript, configurações de filtros e listeners,
etc.
Fonte: Elaborado pelo autor, 2014.
A Figura 17 exibe a organização dos projetos e a maneira como eles são publicados
no servidor de aplicação (container), Apache Tomcat 7.0.54:
Figura 17 - Organização dos projetos
Fonte: Elaborado pelo autor, 2014.
O sistema é composto por quatro estruturas principais:
(1) Data (informação), que é enviada pelos dispositivos;
(2) Device (dispositivo), que captura a informação a ser monitorada e envia
para a fila de mensagens;
(3) Setpoints, que representa a faixa de valores esperada para uma
determinada informação; e
42 (4) Notification (notificação), que é criada sempre quando uma informação
estiver fora dos valores estipulados nos setpoints.
A Figura 18 mostra a página inicial do sistema, logo após o usuário ser autenticado
com sucesso na tela de login.
Figura 18 - Dashboard do Sistema de Monitoramento
Fonte: Elaborado pelo autor, 2015.
Logo na página inicial, o usuário pode ter acesso a um resumo de tudo que foi
coletado e está sendo monitorado pelo sistema.
Na parte superior, são mostradas a quantidade de informações registradas no dia, a
quantidade de dispositivos cadastrados, os setpoints e as notificações. Na parte
inferior, é mostrado um gráfico com as últimas 100 amostras registradas e um
comparativo dos tipos de informações coletadas.
Todas as informações recebidas pelo sistema de monitoramento através do
gerenciador de fila de mensagens são persistidas em banco de dados, podendo
servir como base histórica de monitoramento.
A Figura 19 mostra a listagem das informações recebidas.
43 Figura 19 - Página de Listagem de Data (informação)
Fonte: Elaborado pelo autor, 2015.
Além da base histórica, também é possível fazer o acompanhamento dos dados que
estão sendo cadastrados nos últimos 5 minutos, através da página de tempo real,
conforme mostrado na Figura 20.
Figura 20 - Página Real Time com informações dos últimos 5 minutos
Fonte: Elaborado pelo autor, 2015.
O sistema também foi desenvolvido de forma a possibilitar o usuário a cadastrar os
dispositivos que são os responsáveis por coletar as informações, montar a
44 mensagem no formato conhecido pelo sistema e então enviá-la para o gerenciador
de mensagens.
As Figuras 21 e 22 mostram, respectivamente, a listagem de dispositivos
cadastrados no sistema e o formulário de cadastro.
Figura 21 - Página de Listagem de Devices (dispositivos)
Fonte: Elaborado pelo autor, 2015.
Figura 22 - Página de Formulário de Device (dispositivo)
Fonte: Elaborado pelo autor, 2015.
45 Uma vez cadastrado o(s) dispositivo(s) que pode(m) enviar informações para o
sistema, pode-se também cadastrar setpoints, indicando a faixa de valores esperada
para uma determinada informação.
As Figuras 23 e 24 exibem respectivamente a listagem e formulário de setpoints.
Figura 23 - Página de Listagem de Setpoints
Fonte: Elaborado pelo autor, 2015.
Figura 24 - Página de Formulário de Setpoints
Fonte: Elaborado pelo autor, 2015.
46 No cadastro de setpoints, o usuário pode cadastrar os valores mínimo e máximo
esperados em um determinado tipo de informação, que pode vir de um ou muitos
dispositivos.
Para cada informação recebida pelo sistema que não estiver em conformidade os
setpoints cadastrados, o sistema cria uma nova notificação, avisando que o valor
recebido está fora do esperado.
A Figura 25 mostra a tela de listagens de notificações.
Figura 25 - Página de Notifications (notificações)
Fonte: Elaborado pelo autor, 2015.
4.4 PUBLICAÇÃO NA NUVEM
Tanto o sistema de monitoramento, quanto o gerenciador de fila de mensagens
foram publicados em uma micro instância da Amazon AWS - EC2, que possui as
especificações técnicas conforme a Tabela 2:
47 Tabela 2 - Especificações Técnicas - Micro instância EC2
Tipo
t2.micro
Memória (RAM)
1 GiB
ECU (unidade de CPU)
1 unidade
Cores
1
Memória Secundária (HD)
Sistema Operacional
8 GiB
Amazon Linux AMI 64bit
Fonte: Elaborado pelo autor, 2014.
A configuração dos recursos computacionais dessa instância foi escolhida de forma
a minimizar os custos operacionais, sem comprometer a utilização dos sistemas de
monitoramento e de gerenciamento de fila de mensagens.
A Figura 26 exibe o console de administração do AWS - EC2, onde podem ser feitas
configurações de DNS, alocação ou desalocação de recursos computacionais,
configurações de monitoramento e alertas, grupos de segurança, etc.
Figura 26 - Console de Administração - Amazon EC2
Fonte: Elaborado pelo autor, 2014.
48 Após a configuração da instância, foi feita toda a instalação e configuração das
ferramentas necessárias, conforme previamente citado (Apache Tomcat, Apache
Maven, MySQL, Java, etc.).
Terminadas as devidas configurações, as aplicações passam a ser acessadas pelo
endereço correspondente ao DNS público da instância.
Assim
sendo,
o
sistema
de
monitoramento
é
acessado
no
endereço
http://54.207.4.130/ e o sistema de gerenciamento de fila de mensagens, no
endereço http://54.207.4.130/activemq-broker.
49 5 CONCLUSÕES E TRABALHOS FUTUROS
A forma com que o projeto foi estruturado permite que qualquer dispositivo com
capacidade de acessar à Internet e estruturar alguma informação em forma de
mensagem (com um formato predefinido) consiga enviar dados para o sistema de
monitoramento desenvolvido.
Em todos os testes realizados pelo autor, concluiu-se que o sistema desenvolvido
atendeu aos objetivos propostos, minimizando limitações levantadas nos trabalhos
correlatos,
como
limitações
de
escalabilidade
e
recurso
e
melhorando
significativamente questões de desempenho e confiabilidade ao fazer o uso da
comunicação assíncrona e a publicação dos sistemas na nuvem.
A arquitetura distribuída do sistema possibilitou a comunicação assíncrona entre o
emissor de informação (no caso, o sistema de aquisição) com o receptor (o sistema
de monitoramento) e, com isso, o sistema ganhou melhor desempenho e
escalabilidade, já que o emissor não fica ocupado esperando qualquer resposta do
receptor.
Em testes realizados com a Beaglebone White, conseguiu-se enviar mais de 1000
(mil) mensagens por minuto para um sistema remoto, em redes distintas. Em
sistemas distribuídos, a velocidade da(s) rede(s) em que as aplicações se
encontram influencia diretamente nesse tipo de teste.
Utilizando somente a conexão local, a mensagem não chega a sair para uma rede
externa, por isso, seu desempenho aumenta consideravelmente. Em testes locais,
foi possível enviar pouco mais de 900.000 (novecentas mil) mensagens.
Outra vantagem da arquitetura assíncrona é o baixo acoplamento entre quem envia
a mensagem e quem recebe. Com a utilização de um middleware orientado a
mensagens, o emissor não precisa conhecer quem recebe a mensagem, ele precisa
apenas trabalhar apenas um dos muitos protocolos conhecidos pelo middleware
para que a troca de informações possa ser feita.
50 A utilização de sistemas distribuídos trouxe ainda mais vantagens ao projeto, entre
as quais, a robustez do sistema, flexibilidade, eficiência e o aumento na confiança no
seu funcionamento (ou dependabilidade).
A dependabilidade é composta por um conjunto de atributos de qualidade, como a
disponibilidade, que caracteriza a probabilidade de um sistema funcionar
corretamente em um determinado espaço de tempo. Isso é possível porque, com a
carga de trabalho distribuída entre diversos computadores, caso uma das máquinas
venha a falhar, o sistema continuará ativo.
No entanto, sistemas desse tipo também possuem desvantagens que devem ser
consideradas, tais como, a segurança dos dados, sincronização de eventos de
comunicação, complexidade do sistema (gerando uma maior dificuldade de
implementação e implantação) e o congestionamento de mensagens.
Tais desvantagens surgem com maior frequência em momentos de picos de acesso,
alta utilização de recursos e tráfego de dados. Outra consequência do alto tráfego de
informações entre sistemas é um possível aumento no tempo de processamento
dessas requisições, influenciando diretamente nos tempos de resposta.
Uma das soluções para resolver esse tipo de problema é aumentar o poder
computacional das máquinas que hospedam esse sistema, fazendo uso da
escalabilidade horizontal, replicando cópias de instâncias das máquinas em cluster.
Para isso, tanto o sistema de monitoramento quanto o sistema gerenciador de fila de
mensagens foram hospedados na nuvem, utilizando uma micro instância da Amazon
EC2, podendo ser escalado horizontalmente com facilidade, aumentando os
recursos computacionais e criando clusters à medida em que for necessário, sem
impactar tanto no custo do sistema.
Apesar de não estar listado entre os objetivos do projeto, minimizar custos
operacionais é sempre um requisito não funcional no desenvolvimento de software.
51 A opção de hospedar as aplicações na nuvem contribuiu significativamente para que
esse objetivo também fosse alcançado.
Até o presente momento, com pouco mais de 3 meses de projeto, os custos de
hospedagem e utilização dos recursos computacionais da instância na nuvem não
ultrapassaram U$ 1,00 (um dólar). Nos 2 últimos meses, em que o sistema ficou
ativo por mais de 20 dias para testes de stress e disponibilidade, os custos foram de
apenas U$ 0,16 (dezesseis centavos de dólar) e U$ 0,21 (vinte e um centavos de
dólar) respectivamente.
Outra vantagem com publicação desses sistemas na nuvem possibilitam é, além da
escalabilidade horizontal, a alta disponibilidade do sistema, uma vez que nesse tipo
de serviço as falhas de hardware são gerenciadas e previamente acertadas pelo
provedor, no caso do presente trabalho, a Amazon Web Services.
Portanto, pode-se concluir que o projeto de estruturar um sistema multiplataforma de
aquisição de dados foi cumprido em sua essência, com todos os módulos
funcionando conforme o esperado, estando pronto para ser testado em ambiente
comercial.
5.1 TRABALHOS FUTUROS
Todos os módulos elaborados no trabalho são extensíveis, permitindo que trabalhos
futuros possam evoluir a proposta de monitorar dados em sistemas heterogêneos.
Neste contexto, considera-se relevante sugerir aos seguintes trabalhos:
•
Evoluir o desenvolvimento das notificações criadas, possibilitando avisos
diversos, via SMS, e-mail, ou qualquer sistema considerado relevante para
receber o aviso;
•
Utilizar mais eventos a fim de preparar o sistema para se integrar com
sistemas terceiros;
•
Configurar mais conectores de transporte, utilizando outros protocolos;
52 •
Estruturar os objetos para permitir que outros tipos de informações
(grandezas) sejam monitoradas;
•
Testar o sistema em um ambiente comercial, com melhorias em desempenho
e segurança.
53 REFERÊNCIAS
ALKAR, A. Z.; BUHUR, U. An Internet based wireless home automation system for
multifunctional devices. IEEE Transactions on Consumer Electronics. Volume 51 Issue (4). Páginas 1169-1174. Novembro 2005.
A Review of PC-based Data Logging and Recording Techniques. NI Developer Zone
website. Disponível em: <http://www.ni.com/white-paper/2963/en/>. Acesso em
Junho, 2014.
BAKKEN, David E. Middleware. Kluwer Academic Press. Washington State
University, Encyclopedia of Distributed Computing. 2003.
BONDI, B. André. Characteristics of scalability and their impact on performance.
Proceedings of the 2nd International workshop on Software and performance.
Ottawa, Canadá. Páginas 195 – 203. 2000.
CANTÚ, Dyego. Sistema web para monitoramento de sensores de temperatura
e umidade. 2013. 87 f. Monografia de Trabalho de Conclusão de Curso - Curso
Superior de Tecnologia em Análise e Desenvolvimento de Sistemas, Universidade
Tecnológica Federal do Paraná. Pato Branco, 2013.
CURRY, Edward. Message-Oriented Middleware. John Wiley and Sons,
Chichester. England, p.1-28. 2004.
Data Loggers. Introduction to Data Loggers. Omega Tech website. Disponível em:
<http://www.omega.com/prodinfo/dataloggers.html>. Publicado em 2011. Acesso em
Junho 2014.
EDER, Johann; KAPPEL, Gerti; SCHREFL, Michael. Coupling and Cohesion in
Object-Oriented Systems. Conference on Information and Knowledge
Management. 1992. LNCS, vol. 752.
ERSUE, M; ROMASCANU, D; SCHOENWAELDER, J; SEHGAL, A. Management of
Networks with Constrained Devices: Use Cases. IETF Internet Draft. 4 Julho 2014.
FERRASA, Marcelo; MAYER, Thiago Ives. Sistema de baixo custo para
termometria de grãos com servidor WEB embarcado. Departamento de
Informática – Universidade Estadual de Ponta Grossa (UEPG), 2013.
FLANAGAN, David; MATSUMOTO, Yukihiro. The Ruby Programming Language.
O’Reilly Media. 2008.
FREEMAN, Peter; HART, Davit. A Science of Design for Software-intensive
Systems. Communications of the ACM 47. Pags 19-21, 2004.
54 GUBBI, Jayavardhana; BUYYA, Rajkumar; MARUSIC, Slaven; PALANISWAMI,
Marimuthu. Internet of Things (IoT): A vision, architectural elements, and future
directions. Technical Report CLOUDS-TR-2012-2, Cloud Computing and Distributed
Systems Laboratory, The University of Melbourne. Junho, 2012
HOHPE, Gregor; WOOLF, Bobby. Enterprise Integration Patterns: designing,
building and deploying messaging solutions. Pearson Education, Inc. Addison
Wesley, 2003.
HOLLER, J.; TSIATSIS, V., MULLIGAN C.; KARNOUSKOS S.; AVESAND S.;
BOYLE D. From Machine-to-Machine to the Internet of Things: Introduction to a
New Age of Intelligence. Elsevier, 2014.
HORSTMANN, Cay. Big Java: Programming and Practice. John Wiley, 2001.
INÁCIO, Maurílio José et al. Sistema Embarcado Baseado em Hardware Livre com
Utilização de Computação nas Nuvens Aplicado no Monitoramento de Ambientes.
Revista Pesquisa & Extensão / FACIT. Vol. 2, Nº 1, Montes Claros: FACIT, 2012.
ISTEPANIAN, R.; HI, S.; PHILIP, N.; SUNGOOR, A. The potential of Internet of mhealth Things "m-IoT" for non-invasive glucose level sensing. Annual International
Conference of the IEEE Engineering in Medicine and tBiology Society (EMBC).
30 Agosto - 3 Setembro 2011.
LI, Shixing; WANG, Hong; XU, Tao; ZHOU, Guiping. Application Study on Internet of
Things in Environment Protection Field. Lecture Notes in Electrical Engineering.
Volume 133: p. 99 –106. 2011.
LUTZ, Mark. Programming Python. O’Reilly Media. 2006.
MAHZAN, N. N.; OMAR A. M.; MOHAMMAD S. Z. N.; RODZI M. Z. M. Design of
Data Logger with Multiple SD Cards. IEEE Conference on Clean Energy and
Technology (CEAT). 2013.
MALANI, Prakash. Transaction and Redelivery in JMS. JavaWorld website.
Disponível em: <http://www.javaworld.com/article/2074123/java-webdevelopment/transaction-and-redelivery-in-jms.html>. Acesso em Março, 2015.
MELL, Peter; GRANCE, Timothy. The NIST Definition of Cloud Computing.
Recommendations of the National Institute of Standards and Technology.
Special Publication 800 – 145. 2011.
QIYANG, Chen. Middleware components for E- commerce Infrastructure: An
Analytical Review. Issues in Information Science and Information Technology.
Volume 3, p.137 – 141. 2006.
RAJMOND, J.; PITICA, D. Data logger for signal analysis and failure prediction.
Design and Technology in Electronic Packaging (SIITME), 2010. IEEE 16th
International Symposium. p. 263-266. 2010.
55 RAMKUMAR, Iyer; BALASUNDARAM, Chandramouleeswaran. Best Practices and
Case Study for Open Source Middleware Migration: Egate to Apache Camel
migration. Software Engineering and Mobile Application Modelling and
Development (ICSEMA 2012). International Conference, 2012.
SEVERI, S.; ABREU, G.; SOTTILE, F.; PASTRONE, C.; SPIRITO, M.; BERENS, F.
M2M Technologies: Enablers for a Pervasive Internet of Things. The European
Conference on Networks and Communications (EUCNC2014). P. 23-26 Junho
2014.
STAMFORD, Conn. Gartner Says the Internet of Things Installed Base Will Grow to
26 Billion Units By 2020. 2013. Disponível em
<http://www.gartner.com/newsroom/id/2636073>. Acessado em: 02 Jan 2015.
STROUSTRUP, Bjarne. A History of C++: 1979-1991. International Conference on
History of Programming Languages. p. 271-279. 1993.
TANENBAUM, A. S.; STEEN, M. V. Distributed Systems: Principles and
Paradigms. 1st ed., Prentice Hall, 2002.
WEI S. Z. et al. Design and development of a tablet based real time wireless data
logger. Global High Tech Congress on Electronics (GHTCE). IEEE, 2012, p. 111 116. 2012.
WU, Miao; LU, Ting-lie; LING, Fei-Yang; SUN, Ling; DU, Hui-Ying. Research on the
architecture of Internet of Things. 3rd International Conference on Advanced
Computer Theory and Engineering (ICACTE). Volume 5. Pag. 484-487. 2010.
YAMAMOTO, Junichi; NAKAGAWA, Hiroyuki; NAKAYAMA, Ken; TAHARA,
Yasuyuki; OHSUGA, Akihiko. A Context Sharing Message Broker Architecture to
Enhance Interoperability in Changeable Environments. International Conference on
Mobile Ubiquitous Computing, Systems, Services and Technologies, p. 31–39,
2009.
56 APÊNDICE A - Código do Sistema de Aquisição de Dados (Beaglebone White)
src/main/java - SimpleProducer.java
package producer;
import helper.DataHelper;
import helper.LightHelper;
import helper.TemperatureHelper;
import
import
import
import
import
import
import
import
import
javax.jms.Connection;
javax.jms.ConnectionFactory;
javax.jms.Destination;
javax.jms.JMSException;
javax.jms.MessageProducer;
javax.jms.Session;
javax.jms.TextMessage;
javax.naming.Context;
javax.naming.InitialContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SimpleProducer {
private static Logger logger =
LoggerFactory.getLogger(SimpleProducer.class);
private static final Boolean NON_TRANSACTED = false;
private static final long MESSAGE_TIME_TO_LIVE_MILLISECONDS = 0;
private static final int MESSAGE_DELAY_MILLISECONDS = 10000;
private static final int NUM_MESSAGES_TO_BE_SENT = 100000;
private static final String CONNECTION_FACTORY_NAME =
"jms/JMSConnectionFactory";
private static final String DESTINATION_NAME = "topic/data";
public static void main(String args[]) {
Connection connection = null;
try {
// JNDI lookup of JMS Connection Factory
// and JMS Destination
Context context = new InitialContext();
ConnectionFactory factory =
(ConnectionFactory) context.lookup(CONNECTION_FACTORY_NAME);
Destination destination =
(Destination) context.lookup(DESTINATION_NAME);
logger.info("Connecting to " + factory.toString());
connection = factory.createConnection();
connection.start();
57 logger.info("Connected successfully");
Session session = connection.createSession(
NON_TRANSACTED,
Session.AUTO_ACKNOWLEDGE);
MessageProducer producer =
session.createProducer(destination);
producer.setTimeToLive(MESSAGE_TIME_TO_LIVE_MILLISECONDS);
for (int i = 1; i <= NUM_MESSAGES_TO_BE_SENT; i++) {
Double temperature =
TemperatureHelper.getTemperature();
Double light =
LightHelper.getLightDigitalValue();
String msgTemperature =
DataHelper.buildMessageNewDataWithValue(
temperature,
"Temperature",
"C");
logger.info(msgTemperature);
String msgLight =
DataHelper.buildMessageNewDataWithValue(
light,
"Light");
logger.info(msgLight);
TextMessage messageTemperature =
session.createTextMessage(msgTemperature);
TextMessage messageLight =
session.createTextMessage(msgLight);
producer.send(messageTemperature);
producer.send(messageLight);
logger.info("Sleep " +
(MESSAGE_DELAY_MILLISECONDS / 1000) + " s.");
Thread.sleep(MESSAGE_DELAY_MILLISECONDS);
}
// Cleanup
producer.close();
session.close();
} catch (Throwable t) {
t.printStackTrace();
logger.error(t.getMessage());
} finally {
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
logger.error(e.getMessage());
58 }
}
}
logger.info("All data collected.");
}
}
src/main/java - DataHelper.java
package helper;
import
import
import
import
java.io.FileReader;
java.io.IOException;
java.util.Scanner;
java.util.UUID;
public class DataHelper {
public static Double getDigitalValue(final String analogInput)
throws IOException {
Scanner scanner = new Scanner(
new FileReader(
"/sys/devices/platform/omap/tsc/" + analogInput)
);
Double digitalValue = 0d;
while (scanner.hasNextDouble()) {
digitalValue = scanner.nextDouble();
}
scanner.close();
if (digitalValue == null) {
throw new IllegalStateException(
"Digital Value is invalid."
);
}
return digitalValue;
}
public static String buildMessageNewDataWithValue
(Double value, String type) {
return buildMessageNewDataWithValue(value, type, "");
}
public static String buildMessageNewDataWithValue
(Double value, String type, String unit) {
StringBuilder resultado = new StringBuilder();
resultado.append(
"{\"eventType\":{\"@class\":\"DataEventType\",\"name\":\"
NEW_DATA\"},\"guid\":\""
);
resultado.append(getGuid());
resultado.append("\",\"data\":{");
59 resultado.append("\"type\":\"");
resultado.append(type);
resultado.append("\",");
resultado.append("\"unit\":\"");
resultado.append(unit);
resultado.append("\",");
resultado.append("\"value\":");
resultado.append(value);
resultado.append(",\"device\":\"BEAGLEBONE_WHITE\"}}");
return resultado.toString();
}
private static String getGuid() {
return UUID.randomUUID().toString();
}
}
src/main/java - LightHelper.java
package helper;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LightHelper {
private static Logger logger
= LoggerFactory.getLogger(LightHelper.class);
private static final Queue<Double> filterLight
= new LinkedList<Double>();
public static Double getLightDigitalValue() throws IOException {
Double digitalValue = DataHelper.getDigitalValue("ain1");
logger.debug("Digital Value read: " + digitalValue);
return digitalValue;
}
}
src/main/java - TemperatureHelper.java
package helper;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TemperatureHelper {
60 private static Logger logger
= LoggerFactory.getLogger(TemperatureHelper.class);
public static Double getTemperature() throws IOException {
Double digitalValue = DataHelper.getDigitalValue("ain2");
logger.debug("Digital Value read: " + digitalValue);
return calculateCelsiusTemperature(digitalValue);
}
private static Double calculateCelsiusTemperature(Double digitalValue)
{
Double scaledDV = (digitalValue) / 4095d;
logger.debug("scaledDV: " + scaledDV);
Long thermistorResistence =
Math.round(((1 / scaledDV) - 1) * 10000);
logger.debug("thermistorResistence: " + thermistorResistence);
Long celsiusTemperature =
Math.round(10 * ((3435 / (Math.log(thermistorResistence /
0.09919))) - 273.15)) / 10;
logger.debug("Celsius Temperature: " + celsiusTemperature);
return (double) celsiusTemperature;
}
}
src/main/resources - jndi.properties
java.naming.factory.initial =
org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = failover:(
tcp://ec2-54-207-4-130.sa-east-1.compute.amazonaws.com:61616,
tcp://ec2-54-207-4-130.sa-east-1.compute.amazonaws.com:62626)
?randomize=false
connectionFactoryNames = jms/JMSConnectionFactory
topic.topic/data = dl.topic.data
src/main/java/resources - log4j.properties
log4j.rootLogger=INFO, CONSOLE, FILE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%t %-5p %c{2} - %m%n
# specify the location of the log file
# relative to the web application root
# or use an absolute path as show below.
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
61 log4j.appender.FILE.File=log/data-logger.log
log4j.appender.FILE.MaxFileSize=10MB
log4j.appender.FILE.MaxBackupIndex=1
log4j.appender.FILE.layout=org.apache.log4j.TTCCLayout
log4j.appender.FILE.layout.DateFormat=ISO8601
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>br.com.dataLogger</groupId>
<artifactId>producer</artifactId>
<version>1.0</version>
</parent>
<artifactId>beaglebone</artifactId>
<packaging>jar</packaging>
<name>Beaglebone Message Producer</name>
<description>Project to produce messages from Beaglebone</description>
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
62 <goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>beaglebone.SimpleProducer</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
63 APÊNDICE B – Código e configuração do ActiveMQ
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>br.com.dataLogger</groupId>
<artifactId>jms</artifactId>
<version>1.0</version>
</parent>
<artifactId>activemq-broker</artifactId>
<packaging>war</packaging>
<properties>
<activemq.tomcat.port.http>18081</activemq.tomcat.port.http>
<activemq.contextUrl>/jms</activemq.contextUrl>
</properties>
<name>ActiveMQ JMS Broker</name>
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-web-console</artifactId>
<version>${org.apache.activemq.version}</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-optional</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.1.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<resource>
64 <directory>src/main/webapp/WEBINF</directory>
<filtering>true</filtering>
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
<overlays>
<overlay>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-webconsole</artifactId>
</overlay>
</overlays>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<path>${activemq.contextUrl}</path>
<port>${activemq.tomcat.port.http}</port>
</configuration>
</plugin>
</plugins>
</build>
</project>
src/main/java/resources - log4j.properties
log4j.rootLogger=INFO, stdout, FILE
log4j.logger.org.apache.activemq=INFO
log4j.logger.org.apache.activemq.spring=WARN
log4j.logger.org.springframework=WARN
log4j.logger.org.apache.xbean.spring=WARN
# CONSOLE appender not used by default
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %30.30c{1} - %m%n
# specify the location of the log file relative to the web application root
# or use an absolute path as show below.
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=log/active-mq.log
log4j.appender.FILE.MaxFileSize=10MB
log4j.appender.FILE.MaxBackupIndex=1
log4j.appender.FILE.layout=org.apache.log4j.TTCCLayout
log4j.appender.FILE.layout.DateFormat=ISO8601
src/main/webapp/WEB-INF – activemq.xml
<beans
xmlns="http://www.springframework.org/schema/beans"
65 xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd">
<broker brokerName="web-console"
xmlns="http://activemq.apache.org/schema/core" >
<persistenceAdapter>
<kahaDB directory="${project.build.directory}/activemq.data/kahadb"
journalMaxFileLength="100mb" cleanupInterval="5000" />
</persistenceAdapter>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616" />
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613"/>
<transportConnector name="http" uri="http://0.0.0.0:61615"/>
</transportConnectors>
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="20 mb"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="200 mb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="100 mb"/>
</tempUsage>
</systemUsage>
</systemUsage>
</broker>
</beans>
Download

INSTITUTO FEDERAL DO ESPÍRITO SANTO PÓS