Ir para o conteúdo

Arquitetura de Software

Arquitetura de software é a estrutura fundamental de um sistema, englobando suas partes e a forma como elas se relacionam para alcançar os objetivos do sistema. Ela inclui componentes principais, interações, padrões, restrições, princípios de design e escolhas tecnológicas, proporcionando uma base para o desenvolvimento e a evolução do sistema [1].

A arquitetura do Alimentador de Pets será composta por um dispositivo físico embarcado em uma ESP 32, responsável pelo controle e funcionamento do sistema de alimentação. Um aplicativo mobile, desenvolvido para Android, permitirá ao usuário controlar o alimentador remotamente. Para viabilizar a comunicação entre o aplicativo e a ESP 32, será utilizada uma API que se conecta ao dispositivo por meio do protocolo MQTT, garantindo uma troca de mensagens eficiente e em tempo real entre o aplicativo e o hardware embarcado.

Componentes

  1. ESP 32: Dispositivo físico embarcado que atua como o controlador principal do sistema de alimentação. Ele gerencia o funcionamento do alimentador, incluindo o acionamento do motor para liberar a ração e a coleta de dados, como nível de ração ou status do dispositivo.

  2. Motor e Mecanismo de Alimentação: Componente mecânico responsável por liberar a quantidade de ração. É acionado pela ESP 32 conforme comandos recebidos do aplicativo.

  3. API: Interface intermediária que permite a comunicação entre o aplicativo mobile e a ESP 32. Recebe comandos do aplicativo e os envia à ESP 32 utilizando o protocolo MQTT para controle do alimentador.

  4. Protocolo MQTT: Protocolo de comunicação leve, utilizado para a troca de mensagens entre o aplicativo Android e a ESP 32. Garante que os comandos e os dados dos sensores sejam transmitidos de maneira rápida e eficiente.

  5. Aplicativo Mobile Android: Aplicativo que permite ao usuário interagir com o alimentador, enviando comandos, configurando horários de alimentação e recebendo informações sobre o status do dispositivo. A interface do aplicativo oferece uma experiência amigável para o controle remoto do sistema.

Metas e Restrições Arquiteturais

Metas

  1. Facilidade de Uso: Proporcionar uma interface intuitiva para o usuário final no aplicativo mobile Android, permitindo um controle fácil e rápido do alimentador, com configurações de horários de alimentação e notificações sobre o status do dispositivo.

  2. Comunicação em Tempo Real: Implementar uma comunicação rápida e confiável entre o aplicativo Android e a ESP 32, usando o protocolo MQTT para troca de mensagens em tempo real, de modo a permitir um controle ágil e atualizações frequentes sobre o status do alimentador.

  3. Escalabilidade: Possibilitar futuras expansões do sistema, como a integração com outros dispositivos IoT (Internet of Things) e sensores adicionais, sem a necessidade de grandes modificações na arquitetura inicial.

Restrições

  1. Limitações de Hardware: A ESP 32 possui capacidade de processamento e memória limitadas, o que restringe o uso de softwares e bibliotecas pesados. A escolha de softwares e frameworks deve, portanto, otimizar o desempenho dentro dessas limitações.

  2. Conectividade: A comunicação entre o aplicativo e o alimentador depende de uma conexão de rede estável (Wi-Fi) para funcionar corretamente. Em locais onde a conectividade é fraca ou instável, a funcionalidade do sistema pode ser comprometida.

  3. Custo de Implementação: Manter os custos do projeto baixos para garantir acessibilidade ao usuário final. Isso influencia a escolha de componentes de hardware e limita a possibilidade de utilizar soluções mais caras de comunicação e controle.

Diagrama de arquitetura de software

A arquitetura definida para o projeto até a etapa 1 é esclarecida na imagem 1.

Diagrama de Arquitetura

Imagem 1: Diagrama de Arquitetura Geral (Fonte: Yago Passos, 2024.)

Na imagem 2, está ilustrada a arquitetura de infraestrutura do projeto no ambiente de cloud (Amazon Web Services) em que o software será hospedado.

Diagrama de Arquitetura de Infra-estrutura

Imagem 2: Diagrama de Arquitetura de Infra-estrutura (Fonte: Eric Chagas, 2024.)

Na imagem 3, é possível entender melhor o funcionamento do Aplicativo Mobile, que seguirá a arquitetura de seu framework de confecção, o React Native.

Diagrama do React Native

Imagem 3: Diagrama de Arquitetura do React Native (Fonte: Lorenzo Sciandra, 2019)

Diagrama de Componentes

O diagrama de componentes demonstra os blocos de software do sistema, suas responsabilidades e as interações entre eles. Ele ajuda a compreender como as funcionalidades estão distribuídas e como os elementos se conectam para fornecer os serviços planejados.

Diagrama de Componentes

Imagem 7: Diagrama de Componentes (Fonte: Lude Ribeiro, 2024.)

Diagrama de Sequência

O diagrama de sequência descreve o fluxo de mensagens e interações entre os diferentes componentes durante a execução de uma funcionalidade. Ele detalha a sequência de eventos no tempo, mostrando como os objetos colaboram para realizar a tarefa.

Diagrama de Sequência

Imagem 8: Diagrama de Sequência (Fonte: Yago Passos, 2024.)

Tecnologias

O desenvolvimento do sistema Alimentador de Pets envolve uma combinação de tecnologias de hardware, software e comunicação, com o objetivo de criar uma solução eficiente e de fácil uso para o controle remoto do dispositivo de alimentação. Abaixo estão listadas as principais tecnologias utilizadas no projeto:

  • ESP32: Microcontrolador utilizado como o cérebro do sistema. Com suporte para Wi-Fi e Bluetooth, a ESP32 é responsável pelo gerenciamento dos componentes do alimentador, como sensores e o mecanismo de distribuição de ração. Ela executa a lógica de controle do dispositivo e se comunica com o aplicativo mobile por meio de MQTT.

  • MQTT (Message Queuing Telemetry Transport): Protocolo de comunicação leve, ideal para IoT, que possibilita a troca de mensagens entre o aplicativo e a ESP32 em tempo real. A escolha do MQTT é baseada em sua eficiência, baixo consumo de energia e simplicidade de implementação.

  • React Native: Framework utilizado para o desenvolvimento do aplicativo mobile para Android. Permite que o aplicativo seja desenvolvido com JavaScript, facilitando o desenvolvimento multiplataforma e oferecendo uma interface amigável ao usuário.

  • API Backend: Interface de comunicação intermediária entre o aplicativo e a ESP32. A API processa comandos enviados pelo aplicativo e os encaminha para o dispositivo, além de gerenciar a recepção de dados de status e nível de ração. Implementada para ser leve e performática, a API utiliza REST para simplificar a integração com o aplicativo mobile.

  • Banco de Dados: Em uma versão mais robusta do sistema, um banco de dados pode ser integrado para armazenar logs de alimentação, horários e históricos de ações, permitindo ao usuário um monitoramento mais detalhado.

Visão de caso de uso

O seguinte diagrama, presente na imagem 4, representa os principais Casos de Uso do aplicativo proposto para a solução, definindo os fluxos do sistema.

Diagrama do React Native

Imagem 4: Diagrama de Caso de Uso (Fonte: Yago Passos, 2024)

Visão Lógica

A visão lógica detalha a estrutura interna do sistema, destacando como ele é organizado em unidades e implementações. Ela apresenta a organização conceitual do sistema em níveis, incluindo camadas, pacotes, classes e interfaces, e revela como esses elementos estão interligados. Esse diagrama mostra as dependências entre componentes, a realização das interfaces e as relações entre partes, como composições e agregações, para dar uma visão clara do funcionamento e da interconexão entre os elementos do sistema.

Visão Geral

O Alimentador de Pets é um sistema automatizado que oferece aos donos de animais a conveniência de monitorar e gerenciar a alimentação de seus pets à distância. Por meio de um aplicativo mobile intuitivo, o usuário pode programar horários, controlar manualmente o dispensador de ração, e monitorar o nível de ração e o status do dispositivo em tempo real.

Composto por uma ESP32, que atua como controlador principal, e utilizando o protocolo MQTT para comunicação, o sistema garante uma troca de informações rápida e eficiente entre o aplicativo e o alimentador. A API backend permite uma integração simplificada e segura, facilitando o envio de comandos e a coleta de dados de status.

Esse projeto busca oferecer uma solução de baixo custo, escalável e segura, permitindo futuras expansões, como a adição de novos sensores ou funcionalidades avançadas de monitoramento.

Diagrama de Classes

Diagrama de Classe

Imagem 5: Diagrama de Caso de Uso 1.0 (Fonte: Fernando Vargas, 2024)

Camada de Aplicativo (App Android)

Classe Aplicativo

  • Atributos:
    • usuarioId: Identificador do usuário.
    • configuracoes: Configurações de alimentação, como horários e quantidades.
  • Métodos:
    • enviarComando(comando: String): Envia um comando para o backend.
    • atualizarStatus(): Atualiza o status do alimentador com informações da API.
    • notificarUsuario(mensagem: String): Notifica o usuário sobre eventos, como falha de conexão ou fim de ração.

Classe ControladorAlimentacao

  • Atributos:
    • horarios: Lista de horários programados.
    • quantidade: Quantidade de ração a ser dispensada.
  • Métodos:
    • programarAlimentacao(horario: DateTime, quantidade: Float): Define um horário de alimentação e quantidade.
    • ajustarConfiguracoes(configuracoes: Map): Ajusta as configurações conforme o perfil do animal.

Camada de Backend (API)

Classe APIController

  • Atributos:
    • autenticacao: Dados para autenticação do usuário.
    • urlMQTT: URL do broker MQTT.
  • Métodos:
    • enviarComandoMQTT(topico: String, mensagem: String): Envia comandos para a ESP32 via MQTT.
    • receberDadosStatus(): Recebe e processa dados de status da ESP32.

Classe MonitoramentoStatus

  • Atributos:
    • nivelRacao: Nível atual de ração.
    • conexaoStatus: Status da conexão com a ESP32.
    • historicoLog: Logs de atividades e eventos.
  • Métodos:
    • atualizarStatusESP32(): Atualiza o status com base em mensagens recebidas da ESP32.
    • registrarLog(evento: String): Armazena eventos importantes para monitoramento e histórico.

Camada de Dispositivo (ESP32)

Classe DispositivoESP32

  • Atributos:
    • conexaoWiFi: Status da conexão Wi-Fi.
    • nivelSensor: Sensor de nível de ração.
  • Métodos:
    • conectarWiFi(): Estabelece conexão Wi-Fi.
    • desconectarWiFi(): Finaliza conexão Wi-Fi.
    • publicarStatus(topico: String, mensagem: String): Publica o status do dispositivo via MQTT.

Classe MotorControle

  • Atributos:
    • estado: Estado atual do motor (ligado/desligado).
    • velocidade: Velocidade do motor para controlar a quantidade de ração.
  • Métodos:
    • acionarMotor(quantidade: Float): Aciona o motor para liberar a quantidade de ração especificada.
    • pararMotor(): Para o motor após a liberação da ração.

Relações Entre as Classes

  • A classe Aplicativo se comunica com APIController no backend para enviar comandos e receber status.
  • APIController utiliza MonitoramentoStatus para manter o status atualizado e registrar logs de eventos.
  • APIController se comunica com DispositivoESP32 via MQTT, enviando comandos de controle e recebendo atualizações.
  • DispositivoESP32 controla o MotorControle para dispensar ração, conforme os comandos recebidos.

Diagramas de Pacotes

Diagrama de Pacote

Imagem 6: Diagrama de Pacotes 1.0 (Fonte: Fernando Vargas, 2024)

Pacote Aplicativo Android

  • Descrição: Representa a camada do aplicativo mobile Android.
  • Responsabilidade: Contém classes responsáveis pela interface do usuário e lógica de controle do alimentador.
  • Classes:
    • Aplicativo
    • ControladorAlimentacao

Pacote API

  • Descrição: Representa a camada intermediária responsável pela comunicação entre o aplicativo e a ESP32.
  • Responsabilidade: Inclui a lógica para enviar comandos e processar dados via MQTT, além de manter logs e status.
  • Classes:
    • APIController
    • MonitoramentoStatus

Pacote Dispositivo ESP32

  • Descrição: Representa a camada embarcada, responsável pela execução dos comandos recebidos e operação do alimentador físico.
  • Responsabilidade: Inclui o controle do motor e sensores conectados à ESP32.
  • Classes:
    • DispositivoESP32
    • MotorControle
Relações Entre os Pacotes

No diagrama, conectamos os pacotes para mostrar a dependência de um pacote sobre o outro. Aqui estão as associações entre os pacotes:

  • Aplicativo -> Backend: O pacote Aplicativo depende do pacote Backend para enviar comandos e receber status do alimentador.
  • Backend -> Dispositivo: O pacote Backend depende do pacote Dispositivo para comunicar comandos e receber dados da ESP32, utilizando o protocolo MQTT.

Referências

1 Bass, L., Clements, P., & Kazman, R. Software Architecture in Practice. Boston: Addison-Wesley, 2003.

Sciandra, Lorenzo. The New React Native Architecture Explained: Part Four, 2019. Disponível em: Nearform Commerce.

Tabela de versionamento

Versão Data Descrição Responsável
1.0 09/11/2024 Criação do documento. Fernando Vargas
1.1 12/11/2024 Atualização do documento. Yago
1.2 13/11/2024 Diagrama de Classe e Visão Geral Fernando Vargas
1.3 13/11/2024 Diagrama de Pacotes Fernando Vargas
1.3 27/11/2024 Ajuste path imagens Fernando Vargas
1.4 30/11/2024 Adição de arquitetura de infra-estrutura Eric Chagas
1.5 30/11/2024 Adição de diagrama de componentes Lude Ribeiro
1.6 01/12/2024 Adição de diagrama de sequência Yago