Projeto de Subsistema de Software
O projeto de subsistema de software consiste no desenvolvimento de componentes específicos que integram um sistema maior, garantindo funcionalidades críticas e alinhamento com os objetivos gerais. Este documento descreve a abordagem adotada para projetar, implementar e documentar um subsistema voltado para a coleta, processamento e armazenamento de dados em tempo real, utilizando tecnologias como ESP-32, MQTT e PostgreSQL.
Arquitetura de Software
A arquitetura de software é a estrutura fundamental que define a organização de um sistema, incluindo os componentes principais, suas interações e os princípios que orientam seu design e evolução. Ela atua como uma base estratégica para guiar o desenvolvimento, a manutenção e a expansão do software, garantindo que ele atenda aos requisitos técnicos e de negócio.
Na prática, a arquitetura de software oferece uma visão holística do sistema, permitindo uma compreensão clara dos elementos que o compõem e de como eles colaboram para alcançar os objetivos do projeto. Entre os aspectos considerados estão a modularidade, a escalabilidade, a segurança, a eficiência e a capacidade de adaptação a futuras mudanças ou expansões.
Para este projeto, a arquitetura de software será desenvolvida de maneira incremental e colaborativa. Inicialmente, focaremos em estabelecer os principais componentes e suas interfaces, permitindo que a equipe visualize o sistema como um todo. Ao longo do tempo, detalharemos aspectos específicos e implementaremos ajustes conforme novas necessidades e desafios técnicos surgirem. Essa abordagem permitirá flexibilidade e uma maior adaptabilidade a mudanças ao longo do desenvolvimento do projeto.
O modelo de arquitetura inicial que usaremos está descrita com mais detalhes na arquitetura
Interface
Guia de estilo
O guia de estilo estabelece os padrões visuais e de usabilidade para a interface, garantindo consistência em cores, tipografia e elementos gráficos. Ele serve como referência para todos os componentes do design, proporcionando uma experiência unificada e intuitiva ao usuário. Mais detalhes sobre o guia de estilo podem ser encontrados no documento de Identidade visual.
Protótipo de alta fidelidade
O protótipo de alta fidelidade apresenta uma simulação visual e funcional da interface final, permitindo validar o design e coletar feedback antes do desenvolvimento. Ele inclui interatividade, layouts e todos os elementos essenciais da interface. Para conhecer o protótipo em detalhes, consulte a seção de prototipação no documento de Identidade visual.
Comunicação com a ESP-32
A ESP-32 será o núcleo de controle de todos os sensores e dispositivos que trabalharão na coleta de dados. Esses dados coletados serão enviados para a central de monitoramento/banco de dados via MQTT em tempo real.
Protocolo MQTT
O MQTT (Message Queuing Telemetry Transport) é um protocolo de comunicação leve e eficiente, projetado especificamente para dispositivos com recursos limitados. Ele utiliza o modelo de publicação/assinatura (publish/subscribe), onde dispositivos (clientes) enviam dados ao servidor (broker) em tópicos específicos.
Configuração do Broker MQTT
O broker será o responsável por agir como um servidor, gerenciando as mensagens publicadas e entregues entre os dispositivos. O broker que planejamentos utilizar é o Mosquitto
- Mosquitto: Um broker MQTT de código aberto, ideal para uso local ou para pequenas redes.
Tópicos e Publicação
No protocolo MQTT, as mensagens são organizadas em tópicos, que funcionam como "canais" para as informações. A ESP-32, conectada aos sensores do dispositivo cadastrado, publica dados em tópicos específicos, permitindo que outros dispositivos ou sistemas acessem facilmente essas informações. Abaixo segue a ideia de organização dos tópicos e mensagens:
- estacao: Publica todos os dados coletados pelo sistema
Esse tópico irá receber mensagens em um formato específico. Em nosso projeto, optaremos pelo JSON, segue abaixo o modelo inicial da mensagem que será publicada com as informações:
{
"temperatura": {
"descricao": "Temperatura da água coletada",
"unidade": "°C",
"valor": 22.5
},
"umidade": {
"descricao": "Umidade do ar",
"unidade": "%",
"valor": 75
},
"pressao": {
"descricao": "Pressão da água coletada",
"unidade": "hPa",
"valor": 1013
},
"velocidade_vento": {
"descricao": "Velocidade do vento",
"unidade": "m/s",
"valor": 3.2
},
"nivel_agua": {
"descricao": "Nível da água no reservatório",
"unidade": "litros",
"valor": 150
},
"status_reservatorio": {
"descricao": "Status do reservatório (aberto/fechado)",
"valores_possiveis": ["aberto", "fechado"],
"valor": "aberto"
},
"status_chuva": {
"descricao": "Status da chuva",
"valores_possiveis": ["chovendo", "parou"],
"valor": "chovendo"
}
}
Consumo dos dados
Seguindo essa lógica, os dados já estarão prontos para serem consumidos pelos clientes assinantes.
Como os dados serão armazenados no DB (PostgreSQL)
Os dados coletados pela ESP-32 e enviados via MQTT serão processados e armazenados em um banco de dados PostgreSQL. A estrutura de armazenamento foi projetada para suportar consultas eficientes, garantindo a integridade e acessibilidade das informações. Abaixo, descrevemos a lógica de armazenamento:
-
Estrutura do banco de dados:
O banco de dados terá tabelas dedicadas para armazenar as leituras de sensores, relacionando-as com o dispositivo de origem, data e hora da coleta, além de outras informações contextuais. -
Tabelas principais:
-
leituras
:
Armazena as leituras de sensores.- Colunas:
id
(SERIAL PRIMARY KEY): Identificador único da leitura.data_hora
(TIMESTAMP): Data e hora da coleta.temperatura
(NUMERIC): Valor da temperatura em graus Celsius.umidade
(NUMERIC): Valor da umidade em porcentagem.precipitacao
(NUMERIC): Precipitação acumulada em milímetros (mm).
-
dispositivos
:
Armazena informações sobre os dispositivos (ESP-32 ou outros).- Colunas:
id
(SERIAL PRIMARY KEY): Identificador único do dispositivo.nome
(VARCHAR): Nome do dispositivo.descricao
(TEXT): Descrição do dispositivo (opcional).localizacao
(GEOGRAPHY): Coordenadas de localização do dispositivo.
-
Fluxo de armazenamento:
-
A mensagem JSON recebida via MQTT será processada por um cliente (ou microserviço).
- O cliente extrairá as informações relevantes e realizará a inserção nas tabelas acima.
-
Um timestamp será adicionado automaticamente para cada registro, garantindo rastreabilidade.
-
Exemplo de query de inserção:
INSERT INTO leituras ( data_hora, temperatura, umidade, precipitacao ) VALUES ( '2024-11-22 10:00:00', 22.5, 75, 12.3 );
Software embarcado
Software embarcado é um tipo de software desenvolvido para rodar em dispositivos dedicados, com funções específicas e recursos limitados, como memória e processamento. Ele é projetado para controlar e monitorar hardware, garantindo que sistemas como sensores, atuadores e dispositivos de comunicação funcionem corretamente.
No nosso projeto, o software embarcado será responsável por controlar e integrar os diferentes componentes do sistema. Ele também gerenciará os sensores, além de enviar os dados para o restante do sistema utilizando o protocolo MQTT, descrito melhor na comunicação com ESP-32. Para o desenvolvimento, utilizaremos uma ESP-32 como microcontrolador principal, devido à sua capacidade de conexão Wi-Fi e Bluetooth.
O código será desenvolvido em linguagem C, utilizando o framework ESP-IDF (Espressif IoT Development Framework), que fornece APIs e bibliotecas otimizadas para gerenciamento de hardware e comunicação. O ESP-IDF permitirá que implementemos funcionalidades como leitura de sensores, gerenciamento de energia, envio de mensagens MQTT, e possíveis atualizações de firmware (OTA) de forma eficiente.
Referências
-
Amazon Web Services. Entendendo o protocolo MQTT para comunicação em IoT. AWS. Disponível em: https://aws.amazon.com/pt/what-is/mqtt/. Acesso em: 12 nov. 2024.
-
VICTORVISION. Placa ESP32: tudo o que você precisa saber. Victor Vision. Disponível em: https://victorvision.com.br/blog/placa-esp32/. Acesso em: 12 nov. 2024.
-
ROCKCONTENT. JSON: o que é, como funciona e para que serve? Rock Content. Disponível em: https://rockcontent.com/br/blog/json/. Acesso em: 12 nov. 2024.
Tabela de versionamento
Versão | Data | Descrição | Responsável |
---|---|---|---|
0.1 | 29/04/2024 | Criação do documento | x |
0.2 | 08/11/2024 | Adição da introdução sobre arquitetura de software | Eurico Neto |
0.4 | 09/11/2024 | Adição da introdução sobre software embarcado | Marcos Deus |
0.5 | 09/11/2024 | Adição da comunicação com a ESP | Marcos Deus |
0.6 | 20/11/2024 | Adição da interface e completando os outros tópicos | Marcos Deus |
0.7 | 22/11/2024 | Adição da seção "Como os dados serão armazenados no DB" | Eurico Neto |
0.8 | 22/11/2024 | Adição introdução | Eurico Neto |
0.9 | 25/11/2025 | Revisão final dos Artefatos | Arthur José, Marcos Deus, Adne Moretti, Gabriel Moretti |