Releases: ProtectorAnalytics/protector-isapi-manager
v4.2.1 — Event Listener: recebe fotos via HTTP Host
Nova funcionalidade: Event Listener
O que é
Servidor HTTP local que recebe eventos dos terminais Hikvision em tempo real. Quando alguém autentica com face, o terminal envia a foto capturada via HTTP POST — e o listener salva automaticamente no cache.
Por que resolve o DS-K1T672MX
Este terminal não permite download de fotos via ISAPI (FDSearch multipart 400, LOCALS 404). Mas ele envia a foto no evento de autenticação quando uploadVerificationPic=true.
Arquitetura
Terminal → HTTP POST (evento multipart com JPEG) → EventListener:8889
↓
_FaceCache.save(employeeNo, jpeg)
↓
face_cache/{employeeNo}.jpg
Como usar
from core.event_listener import EventListener, configure_http_host
# 1. Iniciar listener
listener = EventListener(port=8889, on_photo=my_callback)
listener.start()
# 2. Configurar terminal
configure_http_host(client, listener_ip="172.16.143.55", listener_port=8889)
# 3. Fotos são salvas automaticamente no cacheConfiguração automática do terminal
- HTTP Host Notification → IP do listener
uploadVerificationPic: true(habilita foto no evento)saveVerificationPic: true- Event triggers para Access Control
Protector Sistemas — v4.2.1
v4.2.0 — Cache local de fotos faciais
Nova funcionalidade: Cache de Fotos
Problema
Terminais DS-K1T672MX (e similares) não permitem download de fotos faciais via ISAPI — o endpoint /ISAPI/Intelligent/FDLib/1/picture/{FPID} retorna 404 e o path LOCALS/ não é acessível via HTTP.
Solução: Cache local compartilhado
Pasta face_cache/{employeeNo}.jpg — compartilhada entre todos os terminais.
| Operação | Comportamento |
|---|---|
Upload de foto (add_face) |
Salva cópia no cache automaticamente |
Buscar foto (get_face) |
Cache hit instantâneo, sem request ao terminal |
Export em lote (_export_all_faces) |
Todas as fotos exportadas vão para o cache |
| Download ISAPI | Quando sucesso, salva no cache para uso futuro |
Fluxo do get_face
- Cache local → retorno instantâneo se existir
- Fase 1-4: Tentativas ISAPI (FDSearch, LOCALS, endpoints diretos)
- Fase 5: Busca em backups ZIP
Como popular o cache
- Automaticamente: Ao cadastrar/clonar faces de qualquer terminal
- Via export: Faça backup do DS-K1T671MF (que funciona) — as fotos ficam no cache
- Via evento: Fotos de eventos de autenticação (futuro)
Protector Sistemas — v4.2.0
v4.1.9 — Fallback: busca foto no backup quando ISAPI não suporta
Nova funcionalidade
Fase 5: Busca foto no backup local
Quando o terminal não suporta download remoto de fotos via ISAPI (ex: DS-K1T672MX), o sistema agora busca automaticamente no último backup ZIP do terminal.
Fluxo completo do get_face:
- Fase 1: FDSearch multipart (JPEG embutido)
- Fase 2: FDSearch JSON → download via faceURL/LOCALS
- Fase 3: FDSearch multipart filtrado por employeeNo
- Fase 4: Endpoints alternativos (FaceDataRecord, GET direto)
- Fase 5 (NOVO): Busca no backup local — abre
Backups/{serial}/*.zip→faces/{employeeNo}.jpg
Como usar
- Faça um backup do terminal que suporta download de fotos (ex: DS-K1T671MF via LOCALS/)
- O backup salva as fotos em
faces/{employeeNo}.jpgdentro do ZIP - Nos terminais que não suportam download (ex: DS-K1T672MX), a Fase 5 encontra a foto no backup
Compatibilidade testada em terminais reais
| Modelo | Firmware | Download direto | Via backup |
|---|---|---|---|
| DS-K1T671MF | V3.2.30 | ✅ LOCALS/ | ✅ |
| DS-K1T672MX | V3.18.0 | ❌ | ✅ (se backup existir) |
Protector Sistemas — v4.1.9
v4.1.8 — Diagnóstico completo download de fotos por modelo
Resultado dos testes em terminais reais
DS-K1T671MF (V3.2.30) — FUNCIONA
- Download via
/LOCALS/pic/enrlFace/retorna JPEG (200 OK) - O código já baixa corretamente via Fase 2 (faceURL → path local)
DS-K1T672MX (V3.18.0) — LIMITAÇÃO DO FIRMWARE
isSupportFDSearchDataPackage = false(não suporta JPEG embutido no FDSearch)/LOCALS/não acessível via HTTP (404)- FDSearch só funciona com
?format=json(sem ele → 400) - Nenhum endpoint alternativo retorna a foto
Melhorias nesta versão
- Fase 3 com logging detalhado: Content-Type, tamanho, primeiros bytes
- Mensagem final clara indicando limitação do firmware
- Fix de bug de indentação no log final
Resumo de compatibilidade de download de fotos
| Modelo | Firmware | LOCALS HTTP | FDSearch multipart | Download |
|---|---|---|---|---|
| DS-K1T671MF | V3.2.30 | ✅ 200+JPEG | ❌ 400 | ✅ Via LOCALS |
| DS-K1T672MX | V3.18.0 | ❌ 404 | ❌ 400 | ❌ Não suportado |
Protector Sistemas — v4.1.8
v4.1.7 — Fix download de fotos em terminais LOCALS/
Correções
Download de fotos — terminais com armazenamento LOCALS/ (erro 404)
- Problema: Terminais que armazenam fotos em
/LOCALS/pic/enrlFace/retornavamfaceURLcom path interno que dá 404 via HTTP. O campomodelDataé um template biométrico (364 bytes), não uma imagem. - Solução: FDSearch multipart filtrado por
employeeNo— sem?format=json, o terminal retorna o JPEG embutido diretamente na resposta multipart.
Melhoria na v4.1.6 (faceLibType)
- Sistema de fallback
blackFD/staticFDcontinua ativo - Detecção automática com teste real antes de paginar
Novas tentativas de download (Fase 3 e 4)
- FDSearch com
faceCustomCondition(byEmployeeNo) - FDSearch com
FPIDdireto - FDSearch multipart por página
FaceDataRecord+FDDownload+ endpoints GET adicionais
Protector Sistemas — v4.1.7
v4.1.6 — Fix download de fotos (faceLibType fallback)
Correções
Download de fotos faciais (erro 400)
- Problema: Terminais que reportavam
faceLibType=staticFDna API FDLib causavam erro 400 em todas as tentativas de download de foto. O log mostrava "Todas tentativas falharam — sem foto disponível". - Causa: O código usava
staticFDhardcoded, mas muitos terminais de controle de acesso Hikvision exigemblackFD. - Solução:
- Novo sistema de detecção automática com fallback: sempre tenta
blackFDprimeiro, depoisstaticFD - Teste real com requisição antes de paginar (evita 400 em lote)
- Método centralizado
_detect_face_lib_type()com cache - Todas as operações (add/delete/export/clone) usam o tipo correto
- Novo sistema de detecção automática com fallback: sempre tenta
Operações corrigidas
get_face— download individualadd_face— upload de fotodelete_face/delete_faces— remoção de fotos_export_all_faces— exportação em lote- Clone de faces entre terminais
Protector Sistemas — v4.1.6
v4.1.5 — Fix download de foto facial (5 abordagens)
Correção: Download de foto facial
O terminal retornava 400 Bad Request no FDSearch com faceCustomCondition.
Agora tenta 5 abordagens em cascata:
- FDSearch com FPID direto (formato simples, mais compatível)
- FDSearch com faceCustomCondition (formato avançado)
- GET direto em 4 endpoints conhecidos de foto
- UserPic / facePic endpoints
- FDSearch paginado sequencial — varre a biblioteca até encontrar o FPID
v4.1.4 — Auditoria completa: 15 correções API + 3 crashes + otimização
Correções Críticas
API ISAPI — Face Recognition
faceLibType: blackFD → staticFDem TODOS os endpoints — estava usando biblioteca de blocklist em vez da padrão!- FDSearch: campo
FaceLibType→faceLibType(casing),searchResultPosition→startNumber - get_face: busca por
faceCustomCondition/byEmployeeNoconforme spec oficial - delete_faces:
POST → PUT+ bodyFDSearchCondconforme spec - modify_user/modify_card: endpoint
/Modify→/SetUp(correto) - add_face: campos multipart
faceURL+imgconforme documentação - Download de fotos: cooldown adaptativo (0.3s–3s), fallback FDSearch multipart
Crashes Corrigidos (app.py)
NameError: src_labelno monitor de clone facialAttributeError: log_textem ScreenCadastrosAttributeError: _get_selected_terminalem ScreenCadastros
Estabilidade
log_activityeset_statusagora thread-safe viaself.after()restore_backup: verificadevice_info.get("ok")corretamentelist_backups: busca serial completo E truncado
v4.1.3 — Backup resiliente com retry e diagnóstico
Correções
- Backup v4.0: retry automático 3x ao obter device info — resolve falhas intermitentes de conexão com terminais Hikvision
- Mensagens de erro detalhadas no backup — agora exibe IP do terminal, erro HTTP real (timeout, 401, connection refused) em vez de mensagem genérica
- Serial vazio — mensagem orientativa com IP, modelo e sugestão de verificar firmware
- Acesso seguro a campos device_info com
.get()— evita KeyError quando terminal retorna dados incompletos
v4.1.2 - Fix DLL + Splash ajustada
v4.1.2
- Fix critico: resolvido erro 'Failed to load Python DLL' no Windows (caminho com acentos)
- Build migrado para modo onedir - sem extracao em temp, mais estavel
- Splash screen com duracao maior (~4s) e fade mais suave
- Instalador 25MB (era 34MB)