Os devices faciais da Hikvision permitem que seja feita a captura de fotos em tempo real (para evitar o uso de webcams).
Pra isso, o device Hikvision deve ser cadastrado no Accelero e na tela de configuração do device o flag Habilitar captura de fotos deve ser habilitado. Isso fará com que esse device apareça nos seleclists de seleção de câmera (tela de edição de pessoas, por exemplo).
Quando essa "câmera" está selecionada e o operador clica no botão de Iniciar captura, o processo abaixo é iniciado.
ACCELERO - PARTE 1
- é feito um request para o endpoint
/getCameraSnapshot(POST com form data incluindo dados sobre o device aonde a captura deve acontecer); - no
SnapshotController::getPhotoFromIdentifier()é feita instanciação de umSnapshotProviderInterfacee chamado o métodogetSnapshot()(aqui temos um objeto que sabe "pedir um snapshot" para o gateway/Hikvision); - esse método gera uma string aleatória e envia uma mensagem para o gateway dizendo, basicamente, "capture um snapshot no device 1234, e envie a resposta no tópico <FACILITY>/hikvision/<SERIAL>/<RANDOM>";
- na sequência, o método entra num loop por até 10 segundos esperando chegar a resposta. Se não chegar, retorna-se uma mensagem de erro (timeout) para o usuário.
GATEWAY
- o gateway recebe uma mensagem do tipo
capturesnapshote faz uma chamada na API do Hikvision que está especificado na mensagem; - esse request na API inicia o processo de captura de foto no Hikvision, e o request só retorna quando houver timeout (10 segundos por padrão) ou quando a foto for efetivamente capturada no device;
- o retorno da API é um MIME multipart, e o gateway faz o parse dos dados pra mandar apenas o base64 do snapshot de volta pra o Accelero no tópico que foi especificado.
ACCELERO - PARTE 2
- ao receber a resposta do gateway no tópico aleatório que foi escolhido, a foto é enviada para o front-end, e a partir daí o processo de cadastro de fotos segue normalmente.
PEGADINHAS
- o processo de captura do fotos no Hikvision é lento: assim que o device recebe a chamada na API para iniciar a captura, aparece uma "bola translúcida" na tela (para orientar o usuário no posicionamento do rosto). Após colocar o rosto, o processo de captura leva cerca de 4 segundos, e termina com uma espécie de "click-de-câmera-tirando-foto";
- embora leve cerca de 4 segundos o processo de captura, o frame que é retornado pela API é o primeiro frame do início do processo de captura. Ou seja, o processo de captura tem que iniciar com o usuário JÁ NA FRENTE DA CÂMERA. Não encontramos forma de pegar "o último frame" (aquele do "click-da-câmera").
- obviamente a pessoa que está tendo a foto capturada não existe no facial, e como a pessoa tem que iniciar o processo "na frente do facial", é provável que dê uma mensagem de erro (pessoa não reconhecida). Parece que existe a possibilidade de que esse tipo de erro aborte o processo de captura. Não encontramos uma boa alternativa pra isso.