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

  1. 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 -version

  2. Criaçã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>

  3. 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.properties
    spring.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

  4. 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.java
    package 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;
        }
    }

  5. Criação do Repositório `SensorDeMercurioRepository`

    Crie a interface `SensorDeMercurioRepository` que estende `JpaRepository` para fornecer métodos CRUD para a entidade `SensorDeMercurio`.

    SensorDeMercurioRepository.java
    package 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
    }

  6. 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.java
    package 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);
        }
    }

  7. 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.java
    package 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();
        }
    }

  8. 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.java
    package 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
    }

  9. 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 test

    curl_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.

Hashtags

#IoT #Java #SpringBoot #Mercurio #MonitoramentoAmbiental #DesenvolvimentoDeSoftware