# Fase 2 — Protocol Layer (ONVIF + RTSP genérico)

**Status:** código concluído neste ambiente  
**Data:** 2026-08-19  
**URL:** https://vms.restor.app.br

## Objetivo

Descoberta de câmera **sem** `if fabricante == "..."`. ONVIF primeiro; URL RTSP manual como fallback.

## O que foi entregue

- `App\Protocol\AdapterRegistry` — resolve adapter por **tipo** (`onvif`, futuro `vendor:slug`)
- `OnvifAdapter` — GetDeviceInformation, GetCapabilities, GetProfiles, GetStreamUri
- `RtspGenericAdapter` — probe via ffprobe (argv, sem shell)
- `CameraDiscoveryService` — orquestra ONVIF → persistência → probe RTSP
- Botão **Descobrir ONVIF / validar RTSP** na ficha da câmera
- Comando: `php artisan ipcam:discover {id}`
- Testes unitários/feature (6 passando): classificação main/sub por resolução, redaction de URL, registry sem chave de fabricante, descoberta ONVIF mockada, RTSP manual sem ONVIF

## Como usar

1. Cadastre a câmera (IP, usuário, senha, porta ONVIF/RTSP).
2. Clique em **Descobrir** **ou** rode `php artisan ipcam:discover ID`.
3. Se ONVIF responder: fabricante/modelo/perfis/URIs são gravados (fabricante é **dado de catálogo**, não lógica).
4. Se ONVIF falhar e houver URL RTSP manual: o sistema valida o stream com ffprobe e segue utilizável.

## Aceite

| Critério | Resultado |
|---|---|
| Descobrir via ONVIF (código + teste com adapter mock) | OK |
| Cadastrar só com RTSP manual e validar | OK (teste + UI) |
| Sem `if fabricante` no núcleo | OK |
| ONVIF real nas câmeras 192.168.20.10/11 | **Pendente de rede** — este host (`10.10.15.74`) ainda não alcança essa VLAN |

## Fora desta fase

Storage Manager, Recorder, live view.
