Câmeras, Protocolos de Hardware & Sirene
O NinjaNVR integra nativamente fluxos RTSP/WebRTC (go2rtc), controle PTZ/ONVIF (WS-UsernameToken PasswordDigest), ajustes de hardware por protocolo (camera_protocols.rs) e acionamento sonoro de alarme/sirene e áudio bidirecional (Push-to-Talk) diretamente nos alto-falantes das câmeras suportadas.
1. Famílias de Protocolo Suportadas (hardware.protocol)
O registro declarativo (CAMERA_PROTOCOL_REGISTRY) detecta automaticamente ou permite configurar explicitamente a família da câmera em cameras.<nome>.hardware.protocol:
Protocolo (id) | Fabricantes / Modelos | Porta ONVIF | Canal de Áudio / Sirene | Requisitos Extras |
|---|---|---|---|---|
tapo | TP-Link Tapo (C200, C210, C220, C510W, C520WS) | :2020 (/onvif/service) | TCP :8800 (Streamd POST /stream + MPEG-TS audio/mp2t G.711 A-law) | hardware.cloud_password (Senha da conta TP-Link ID) |
dahua_cgi | Intelbras Mibo (iME-360-C, iM3, iM4, iM5), Dahua, Amcrest, Imou | :80 (/onvif/ptz_service) | HTTP Digest :80 (POST /cgi-bin/audio.cgi?action=postAudio G.711 A-law) + BeepEnable CGI | Usa a mesma conta/senha local do RTSP |
hikvision_isapi | Hikvision, HiLook, Annke, Ezviz | :80 | ONVIF / ISAPI | Conta local ONVIF |
reolink | Reolink (RLC-*, E1) | :8000 | ONVIF | Conta local ONVIF |
axis_vapix | Axis Communications | :80 | ONVIF / VAPIX | Conta local ONVIF |
onvif | ONVIF Profile S / T genérico | :80 | ONVIF | Conta local ONVIF |
2. Fluxo de Autenticação e Disparo de Sirene por Arquitetura
2.1 TP-Link Tapo (tapo — Porta :2020 ONVIF + Porta :8800 Streamd + Porta :443 TPAP)
Nas câmeras TP-Link Tapo (ex.: Tapo C200 HW 5.0 FW 1.5.7), os serviços são divididos entre duas credenciais distintas:
Conta da Câmera (Local RTSP / ONVIF):
- Criada no app Tapo em Configurações Avançadas ➔ Conta da Câmera.
- Autentica os streams RTSP (
:554/stream1e:554/stream2) e o servidor ONVIF (:2020/onvif/service) viaWS-Security PasswordDigest. - Expõe PTZ (
ContinuousMove,RelativeMove,AbsoluteMove,Stop,GetStatus), Presets de hardware (GetPresets,SetPreset,GotoPreset,RemovePreset) e eventosPullPoint. - Limitação do ONVIF Tapo: O servidor ONVIF na porta
:2020não expõe a sirene interna nem saída de áudio (GetRelayOutputsretornater:ActionNotSupportedeGetAudioOutputsé vazio).
Senha da Conta Cloud TP-Link ID (
hardware.cloud_password):- Necessária para autenticar na porta
:8800(Streamd) e na porta:443(TPAP / SPAKE2+) com o usuário fixoadmin. - Como o NinjaNVR dispara a sirene na Tapo (
send_tapo_streamd_alaw_audio):- Abre conexão TCP para
<ip>:8800e enviaPOST /stream HTTP/1.1(Content-Type: multipart/mixed; boundary=--client-stream-boundary--) para obter o desafioWWW-Authenticate: Digest realm="TP-Link IP-Camera", algorithm="MD5", encrypt_type="3", qop="auth", nonce="...". - Calcula o hash da senha da conta TP-Link: quando
encrypt_type="3", usaSHA256(cloud_password)em hexadecimal maiúsculo; caso contrário,MD5(cloud_password)em maiúsculo. - Abre uma nova conexão TCP autenticada com
Authorization: Digest username="admin", ...(HTTP/1.0 200 OK+ cabeçalhoKey-Exchange). - Solicita uma sessão de fala enviando o bloco multipart JSON:jsone recebe
{"type":"request","seq":3,"params":{"talk":{"mode":"aec"},"method":"get"}}{"type":"response","seq":3,"params":{"error_code":0,"session_id":"..."}}. - Sintetiza a sirene tática de dois tons (
750 Hz – 1450 Hza8000 Hzmono emG.711 A-law), encapsula em pacotes MPEG-TS de 188 bytes (PATnoPID 0x0000➔PMTnoPID 0x1000➔PESstream_type 0x90noPID 0x0100) e transmite em quadrosContent-Type: audio/mp2t(X-If-Encrypt: 0,X-Session-Id: <id>) cadenciados a cada20 ms.
- Abre conexão TCP para
- Necessária para autenticar na porta
2.2 Intelbras / Dahua (dahua_cgi — Porta :80 HTTP Digest CGI)
Nas câmeras Intelbras Mibo / Dahua (ex.: iME-360-C), toda a integração utiliza apenas a senha admin local (zero dependência de conta cloud):
- Disparo imediato de sirene / talkback: Envia o payload
G.711 A-law(8000 Hz) via HTTP DigestPOST /cgi-bin/audio.cgi?action=postAudio&httptype=singlepart&channel=1(Content-Type: Audio/G.711A). - Sirene nativa vinculada a eventos de hardware: Configurável via
configManager.cgi?action=setConfignas tabelasMotionDetect[0].EventHandler.BeepEnable=true(siren_on_motion) eAudioDetect[0].EventHandler.BeepEnable=true(siren_on_audio).
3. Exemplo de Configuração (config.yml)
cameras:
escritorio:
enabled: true
onvif:
host: 192.0.2.69
port: 2020
user: cam_operator
password: "camera_local_password"
hardware:
protocol: tapo
profile_token: profile_1
video_source_token: raw_vs1
cloud_password: "tp_link_cloud_password"
lines:
cantinho:
points: [0.23, 0.20, 0.43, 0.21]
direction: a_to_b
objects: [person]
siren: true
zones:
area_restrita:
coordinates: "0.10,0.15,0.85,0.15,0.85,0.90,0.10,0.90"
objects: [person]
siren: true4. Endpoints da API HTTP
GET /api/{camera}/hardwareRetorna o protocolo detectado, identidade do dispositivo, estado atual e matrizcapabilities(incluindomanual_siren,siren_on_eventepush_to_talk).POST /api/{camera}/hardware- Configurar a
cloud_passwordem câmeras Tapo:json{ "cloud_password": "sua_senha_tp_link" } - Disparar a sirene manualmente (teste ou acionamento imediato pelo operador):json
{ "trigger_siren": true, "siren_duration_sec": 3.5 }
- Configurar a
POST /api/{camera}/audio/talkbackRecebe áudio PCM 16-bit LE, WAV ou G.711 A-law (binário ou Base64) e transmite em tempo real para o alto-falante da câmera (via:8800nas Tapo ou/cgi-bin/audio.cginas Intelbras/Dahua).