API backend para coleta de dados de processos CIP (Clean-in-Place). Recebe dados dos sensores via REST e disponibiliza.
Esta API coleta dados de temperatura, concentração e fluxo de processos CIP e:
- Detecta automaticamente quando um processo CIP começa e termina
- Mantém o último dado recebido em memória para consulta rápida
- Indica se o processo está ativo ou não (campo
active) - Persiste o estado em arquivo para não perder dados se o sistema cair
- Autenticação JWT: Protege endpoints com tokens JWT
- Rate Limiting: Limite de 20 requisições/minuto por dispositivo
- Validação de Payload: 3 níveis de proteção contra buffer overflow
- Logging Estruturado: Logs JSON com rastreamento de eventos
- Sensores enviam dados via POST para
/api/sensor_data - Consulta dados via GET em
/api/sensor_data - Se
active: true→ processo CIP rodando - Se
active: false→ processo terminou
- Python: 3.11+
- FastAPI: Framework moderno e rápido com documentação automática
- Uvicorn: Servidor ASGI de alta performance
- Docker: Containerização da aplicação
- Execute com Docker Compose
docker-compose up -d- Acesse os serviços
| Serviço | URL | Credenciais |
|---|---|---|
| API | http://localhost:8000 | JWT Bearer Token |
Todos os endpoints de escrita (POST) requerem autenticação via JWT Bearer Token.
1. Obter Token (POST /api/token)
curl -X POST "http://localhost:8000/api/token" \
-H "Content-Type: application/json" \
-d '{"device_id": "sensor_001"}'Resposta:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"token_type": "bearer"
}2. Usar Token em Requisições
curl -X POST "http://localhost:8000/api/sensor_data" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"temperature": 75.5, "concentration": 0.8, "flow": 1.2}'- Limite: 20 requisições por minuto por dispositivo
- Resposta ao exceder: HTTP 429 com header
Retry-After - Rastreamento: Por device_id extraído do token JWT
3 níveis de validação:
- FastAPI: Máximo 10 MB por requisição
- Middleware: Validação customizada de tamanho
- Schema Pydantic: Validação por campo (máx 1 KB)
- Formato: JSON estruturado com timestamp
- Eventos: Autenticação, rate limit, erros de validação
- Proteção: Sensores nunca são logados em produção
- Armazenamento: Rotação automática de logs (100 MB)
POST /api/sensor_data
Envia dados dos sensores CIP para o sistema. Requer autenticação JWT. O sistema gerencia automaticamente o CIP ID e detecta quando processos terminam.
Requer: Authorization: Bearer <token>
curl -X POST "http://localhost:8000/api/sensor_data" \
-H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." \
-H "Content-Type: application/json" \
-d '{
"temperature": 75.5,
"concentration": 0.8,
"flow": 1.2
}'Respostas:
201 Created: Dados processados com sucesso401 Unauthorized: Token ausente ou inválido429 Too Many Requests: Limite de requisições excedido413 Payload Too Large: Tamanho da requisição excede 10 MB
GET /api/sensor_data
Retorna os dados mais recentes com status do processo CIP. O campo active indica se o processo está em andamento.
curl -X GET "http://localhost:8000/api/sensor_data"Resposta:
{
"temperature": 75.5,
"concentration": 0.8,
"flow": 1.2,
"cip_id": 3,
"timestamp": "2025-10-09T15:30:00-03:00",
"active": true
}O sistema mantém persistência do estado em arquivo JSON para recuperação após falhas:
- Arquivo de estado:
data/cip_state.json - Recuperação automática: Restaura CIP ID e status na inicialização
- Início: Primeiro dado recebido inicia novo processo CIP
- Fim: Timeout sem receber dados marca processo como finalizado
- Incremento automático: CIP ID incrementa automaticamente a cada novo processo
- Instalar dependências
pip install -r requirements.txt- Executar a aplicação
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload