Desafio: MVP para Coleta de Dados de Dispositivo Móvel
Precisamos validar se smartphones Android podem substituir dispositivos IoT na coleta de dados de frotas. Seu objetivo é criar uma solução que:
- Rode continuamente em segundo plano, sem interface gráfica
- Capture giroscópio (x,y,z), GPS (lat/long) e fotos a cada 10 segundos
- Associe um identificador único do dispositivo
- Armazene e disponibilize os dados para integração
- Capture uma foto do motorista quando o sistema for acionado
- Permita a comunicação da Nuvem com o app para reconfigurações dinâmicas (Diferencial)
-
Captura automática de:
- Localização (Latitude, Longitude)
- Giroscópio (X, Y, Z)
- Timestamp
- Foto da câmera frontal
- ID único do Android
-
As coletas são salvas localmente no banco (Room) e também exportadas em
.bin(Protobuf)
- Verifica se a imagem tem rosto
- Verifica se a imagem não está toda preta/branca
- Se não tiver rosto, coleta é marcada como “FOTO SEM ROSTO” e enviada sem imagem
- Serviço
ColetaServiceroda como foreground service com notificação ativa - Mantém o app vivo mesmo com a tela desligada
- Usa coroutines e
Jobpara controle do loop
- Padrão: a cada 10 segundos
- Pode ser alterado via
Intent(açãoACTION_UPDATE_INTERVAL)
- Coletas com falha no envio são salvas com status
enviado = false - Ao iniciar o serviço, o app tenta reenviar todas as pendentes
- Localização inválida (null ou 0.0) é descartada e notificada via Toast
- Giroscópio ausente cancela a coleta e notifica
- Falhas inesperadas geram notificação para o usuário
- Logs de erro em
Logcat
- Cada coleta válida gera um
.binno diretório/Download - Payload enviado via HTTP POST em
application/octet-stream
- Rode o backend local (Spring Boot na porta 8080)
- Pegue um
.bingerado (em /Download) - No Postman:
POST http://localhost:8080/api/binario- Body: binary > escolha o
.bin - Content-Type:
application/octet-stream
message ColetaMsg {
string deviceId = 1;
double latitude = 2;
double longitude = 3;
float gyroX = 4;
float gyroY = 5;
float gyroZ = 6;
string status = 7;
int64 timestamp = 8;
bytes foto = 9;
}