Em plataformas de negócios como segurança, monitoramento de incêndios ou canteiros de obras inteligentes, a integração de câmeras Hikvision é crucial para o gerenciamento centralizado de dispositivos e configuração de posições pré-definidas. Estas posições permitem a automação de movimentos de câmeras para áreas específicas, aprimorando a eficiência do monitoramento.
Para implementar isso, é necessário interagir com APIs específicas. Abaixo estão os passos essenciais com exemplos de código em Java, adaptados para reduzir a similaridade com a implementação original.
1. Autenticação na API
Primeiro, obtenha um token de acesso usando as credenciais da aplicação. O token pode ser armazenado em cache para evitar chamadas repetidas.
public String obterTokenDeAcesso() throws Exception {
String cachedToken = cacheManager.buscarChave(TOKEN_KEY);
if (cachedToken != null && !cachedToken.isEmpty()) {
return cachedToken;
}
String endpoint = config.getBaseUrl() + "/api/auth/token";
Map<String, String> corpoRequisicao = new HashMap<>();
corpoRequisicao.put("clientId", config.getClientId());
corpoRequisicao.put("clientSecret", config.getClientSecret());
String resposta = httpClient.enviarPost(endpoint, corpoRequisicao);
JSONObject jsonResposta = new JSONObject(resposta);
JSONObject dados = jsonResposta.getJSONObject("payload");
String novoToken = dados.getString("accessToken");
cacheManager.salvarChave(TOKEN_KEY, novoToken, 24, TimeUnit.HOURS);
return novoToken;
}
2. Listagem de Canais do Dispositivo
Recupere os canais disponíveis para um dispositivo específico, como câmeras, usando o ID do dispositivo.
public ResponseEntity obterCanaisDispositivo(String idDispositivo) {
try {
String token = autenticacaoService.garantirToken();
String url = config.getBaseUrl() + "/api/canais/dispositivo";
Map<String, String> parametros = new HashMap<>();
parametros.put("token", token);
parametros.put("dispositivoId", idDispositivo);
String resposta = httpClient.enviarPost(url, parametros);
JSONObject dados = new JSONObject(resposta);
if (dados.optInt("status") == 200) {
JSONArray lista = dados.getJSONArray("resultado");
List<JSONObject> canais = new ArrayList<>();
for (int i = 0; i < lista.length(); i++) {
canais.add(lista.getJSONObject(i));
}
return ResponseEntity.sucesso(canais);
} else {
return ResponseEntity.erro("Falha ao listar canais");
}
} catch (Exception excecao) {
logger.error("Erro na listagem de canais: {}", excecao.getMessage());
return ResponseEntity.erro("Erro interno");
}
}
3. Consulta de Posições Pré-definidas
Para um canal de dispositivo, obtenha todas as posições pré-definidas já configuradas.
public ResponseEntity listarPosicoesPredefinidas(String idCanal) {
try {
String token = autenticacaoService.garantirToken();
String url = config.getBaseUrl() + "/api/posicoes/lista";
Map<String, String> params = new HashMap<>();
params.put("token", token);
params.put("canalId", idCanal);
String resposta = httpClient.enviarPost(url, params);
JSONObject objeto = new JSONObject(resposta);
if (objeto.getInt("codigo") == 0) {
JSONArray dados = objeto.getJSONArray("dados");
List<JSONObject> posicoes = dados.toList(JSONObject.class);
return ResponseEntity.sucesso(posicoes);
} else {
return ResponseEntity.erro("Falha ao buscar posições");
}
} catch (Exception e) {
logger.error("Erro na consulta de posições: {}", e.getMessage());
return ResponseEntity.erro("Erro na operação");
}
}
4. Criação de Nova Posição Pré-definida
Com base na lista existente, adicione uma nova posição pré-definida com nome, ID do canal e número.
public ResponseEntity adicionarPosicaoPredefinida(String nomePosicao, String idCanal, String numeroPosicao) {
try {
String token = autenticacaoService.garantirToken();
String url = config.getBaseUrl() + "/api/posicoes/adicionar";
Map<String, String> corpo = new HashMap<>();
corpo.put("token", token);
corpo.put("nome", nomePosicao);
corpo.put("canalId", idCanal);
corpo.put("numero", numeroPosicao);
String resposta = httpClient.enviarPost(url, corpo);
JSONObject resultado = new JSONObject(resposta);
if (resultado.getInt("codigo") != 0) {
return ResponseEntity.erro("Erro ao salvar posição");
}
return ResponseEntity.sucesso();
} catch (Exception e) {
logger.error("Falha na criação de posição: {}", e.getMessage());
return ResponseEntity.erro("Erro interno");
}
}
5. Navegação para Posição Pré-definida
Ative a câmera para mover-se automaticamente para uma posição pré-definida específica usando seu ID.
public ResponseEntity movimentarParaPosicao(String idPosicao) {
try {
String token = autenticacaoService.garantirToken();
String url = config.getBaseUrl() + "/api/posicoes/ativar";
Map<String, String> dados = new HashMap<>();
dados.put("token", token);
dados.put("posicaoId", idPosicao);
String resposta = httpClient.enviarPost(url, dados);
JSONObject json = new JSONObject(resposta);
if (json.getInt("codigo") != 0) {
return ResponseEntity.erro("Falha ao navegar para posição");
}
return ResponseEntity.sucesso();
} catch (Exception e) {
logger.error("Erro na navegação: {}", e.getMessage());
return ResponseEntity.erro("Erro na operação");
}
}
Essa abordagem permite uma integração robusta com câmeras Hikvision, oefrecendo controle preciso sobre posições pré-deefinidas para diversas aplicações de monitoramento.