Introdução
Nos últimos anos, a contaminação por mercúrio em ecossistemas aquáticos se tornou uma preocupação crescente devido aos seus impactos ambientais e à saúde pública. Utilizar a Internet das Coisas (IoT) para monitorar a qualidade da água e, especificamente, os níveis de mercúrio oferece uma abordagem inovadora e eficaz. Neste tutorial, exploraremos como implementar uma solução de monitoramento ambiental utilizando o framework Java Spring Boot, integrando dispositivos IoT para coleta de dados em tempo real. Aprenderemos a coletar, armazenar, e analisar esses dados, além de garantir que o sistema possa ser escalável e sustentável. Ao final deste guia, você terá uma compreensão sólida dos fundamentos necessários para desenvolver suas próprias soluções de monitoramento ambiental em Java usando a arquitetura de software mais indicada.
Etapas
Configuração do Ambiente de Desenvolvimento
Verifique se você possui o JDK (Java Development Kit) e o Maven instalados corretamente. Utilize os comandos ‘java -version’ e ‘mvn -version’ para confirmar a instalação e versão. Se necessário, instale as versões mais recentes disponíveis nos sites oficiais.
commands# Verifique as versões instaladas
java -version
mvn -versionCriação do Projeto Spring Boot
Inicie um novo projeto Spring Boot através do Spring Initializr. Escolha as seguintes opções: **Project**: Maven, **Language**: Java, **Spring Boot**: última versão estável, **Packaging**: Jar, **Java**: 11 ou superior. Adicione dependências como ‘Spring Web’, ‘Spring Data JPA’, ‘H2 Database’, e ‘Spring Boot Starter Actuator’. Baixe o projeto e extraia em sua máquina.
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>monitoramento-mercurio</artifactId> <version>0.0.1-SNAPSHOT</version> <name>monitoramento-mercurio</name> <description>Monitoramento de Contaminação por Mercúrio</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Configuração do Banco de Dados H2
Configure o banco de dados em memória H2 editando o `application.properties`. Adicione configurações para a URL de conexão, driver e esquema do banco de dados.
application.propertiesspring.h2.console.enabled=true spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=update
Criação da Entidade `SensorDeMercurio`
Implemente a classe de entidade `SensorDeMercurio` que representará os dados coletados pelos sensores, como nível de mercúrio e localização.
SensorDeMercurio.javapackage com.example.monitoramento.mercurio.model; import javax.persistence.*; import java.time.LocalDateTime; @Entity @Table(name = "sensores") public class SensorDeMercurio { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private Double nivelMercurio; @Column(nullable = false) private String localizacao; @Column(nullable = false) private LocalDateTime dataColeta; // Getters e Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Double getNivelMercurio() { return nivelMercurio; } public void setNivelMercurio(Double nivelMercurio) { this.nivelMercurio = nivelMercurio; } public String getLocalizacao() { return localizacao; } public void setLocalizacao(String localizacao) { this.localizacao = localizacao; } public LocalDateTime getDataColeta() { return dataColeta; } public void setDataColeta(LocalDateTime dataColeta) { this.dataColeta = dataColeta; } }
Criação do Repositório `SensorDeMercurioRepository`
Crie a interface `SensorDeMercurioRepository` que estende `JpaRepository` para fornecer métodos CRUD para a entidade `SensorDeMercurio`.
SensorDeMercurioRepository.javapackage com.example.monitoramento.mercurio.repository; import com.example.monitoramento.mercurio.model.SensorDeMercurio; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface SensorDeMercurioRepository extends JpaRepository<SensorDeMercurio, Long> { // Métodos personalizados podem ser definidos aqui }
Implementação do Serviço `SensorDeMercurioService`
Implemente a classe `SensorDeMercurioService`, que contém a lógica de negócios para gerenciamento de dados coletados pelos sensores.
SensorDeMercurioService.javapackage com.example.monitoramento.mercurio.service; import com.example.monitoramento.mercurio.model.SensorDeMercurio; import com.example.monitoramento.mercurio.repository.SensorDeMercurioRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @Service public class SensorDeMercurioService { @Autowired private SensorDeMercurioRepository sensorRepository; public List<SensorDeMercurio> findAll() { return sensorRepository.findAll(); } public Optional<SensorDeMercurio> findById(Long id) { return sensorRepository.findById(id); } public SensorDeMercurio save(SensorDeMercurio sensor) { sensor.setDataColeta(LocalDateTime.now()); return sensorRepository.save(sensor); } public void deleteById(Long id) { sensorRepository.deleteById(id); } }
Implementação do Controlador `SensorDeMercurioController`
Crie a classe `SensorDeMercurioController` para gerenciar os endpoints para criação, leitura e deleção de registros de `SensorDeMercurio`.
SensorDeMercurioController.javapackage com.example.monitoramento.mercurio.controller; import com.example.monitoramento.mercurio.model.SensorDeMercurio; import com.example.monitoramento.mercurio.service.SensorDeMercurioService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/sensores") public class SensorDeMercurioController { @Autowired private SensorDeMercurioService sensorService; @GetMapping public List<SensorDeMercurio> getAllSensores() { return sensorService.findAll(); } @GetMapping("/{id}") public ResponseEntity<SensorDeMercurio> getSensorById(@PathVariable Long id) { return sensorService.findById(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @PostMapping public SensorDeMercurio createSensor(@RequestBody SensorDeMercurio sensor) { return sensorService.save(sensor); } @DeleteMapping("/{id}") public ResponseEntity<Void> deleteSensor(@PathVariable Long id) { sensorService.deleteById(id); return ResponseEntity.noContent().build(); } }
Implementação de Testes Unitários
Desenvolva testes unitários para garantir que toda a lógica dentro de `SensorDeMercurioService` opere conforme o esperado.
SensorDeMercurioServiceTest.javapackage com.example.monitoramento.mercurio.service; import com.example.monitoramento.mercurio.model.SensorDeMercurio; import com.example.monitoramento.mercurio.repository.SensorDeMercurioRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; public class SensorDeMercurioServiceTest { @InjectMocks private SensorDeMercurioService sensorService; @Mock private SensorDeMercurioRepository sensorRepository; @BeforeEach public void init() { MockitoAnnotations.openMocks(this); } @Test public void testFindAll() { SensorDeMercurio sensor1 = new SensorDeMercurio(); sensor1.setId(1L); sensor1.setNivelMercurio(0.5); sensor1.setLocalizacao("Rio X"); SensorDeMercurio sensor2 = new SensorDeMercurio(); sensor2.setId(2L); sensor2.setNivelMercurio(0.7); sensor2.setLocalizacao("Lago Y"); when(sensorRepository.findAll()).thenReturn(Arrays.asList(sensor1, sensor2)); List<SensorDeMercurio> sensores = sensorService.findAll(); assertEquals(2, sensores.size()); verify(sensorRepository, times(1)).findAll(); } // Testes adicionais para métodos save e findById }
Executando a Aplicação e Testes
Usando o Maven, compile e execute a aplicação. Utilize ferramentas como Postman ou cURL para interagir com a API e validar seu funcionamento.
commands# Compilar e executar a aplicação
mvn spring-boot:run
# Executar os testes unitários
mvn testcurl_examples# Listar todos os sensores
curl -X GET http://localhost:8080/api/sensores
# Criar um novo sensor
curl -X POST -H "Content-Type: application/json" -d '{"nivelMercurio": 0.6, "localizacao": "Estuário Z"}' http://localhost:8080/api/sensores
Conclusão
Neste tutorial, abordamos a criação de uma solução de monitoramento ambiental para medir a contaminação por mercúrio em ecossistemas aquáticos, utilizando Java com Spring Boot. Passamos pela configuração do ambiente de desenvolvimento, construção do modelo de dados, implementação da lógica de negócios, testes e execução da aplicação. Com essas habilidades, você pode desenvolver soluções semelhantes para diversos tipos de monitoramento ambiental, contribuindo para a preservação e análise de dados fundamentais para a saúde do nosso planeta.