MPI/API/QRCodeDinamico

De uTech Tecnologia
Ir para: navegação, pesquisa

Tabela de conteúdo


Após configurar seu dispositivo pata utilizar QR Code dinâmicos, é necessário utilizar um algoritmo para gerá-lo.


Requisitos

Requisitos que do integrador:

  1. O integrador deverá gerar uma chave privada (senha) e guardá-la para utilização e geração dos QR Codes para este usuário.
    • Ex: 1234
  2. Guardar o valor da Validade de QRCODE Dinâmico, configurado no porteiro IP / Catraca, ou outro dispositivo uTech, o qual será utilizado para gerar o QR Code dinâmico. Valor inteiro/segundos.
  3. . Ex. 30
  4. Ter acesso de administrador na API de integração do porteiro IP / Leitor / Catraca. Ver configurações em configuração da integração, no Leitor em configuração da integração ou na catraca IP em configuração da integração
    • Endereço IP, pota, usuário e senha.

Como funciona

Qrcodedynamic.png

Algoritmo

Gerando o Índice:

INDICE = (TimestampInicial - TimestampAtual) / Validade.


NOTA: O índice DEVE ser um número inteiro. Caso a divisão retornar resto, descarte.
  • Ex: para 3,3 utilize 3, ou para 10,5, utilize 10.


Onde:

  • TimestampInicial: timestamp da crianção do usuário dinâmico.
  • TimestampAtual: timestamp da geração do QR Code dinâmico.
  • validade: Validade de QRCODE Dinâmico, configurado no porteiro ou catraca.


Exemplo:

  • int((1536869400 - 1536869499 ) / 30)
  • Resultado = 3;

Gerando o QR Code:

Após ter o índice em mãos, vamos gerar o QR Code. O QR Code será o hash SHA1 gerado pela concatenação dos dados senha + : + índice. Onde senha é a senha que o integrador definirá para o usuário que está sendo criado.

Exemplo: (No caso da senha = 1234 e indice = 0).

QR Code = sha1("1234:0");

O QR Code será: d752ec9ed0e0e43aaa51313a5683ab118ddea00f


Códigos exemplos

PHP

<?php
 
/* Chave privada. definida pelo integrador para cada usuário de QR Code dinâmico. */
$minhachave = "1234567890";
 
/* Configurado no Proteiro como "Validade de QRCODE Dinâmico" - Tempo em segundos */
$validade = 30;
 
/* Dados de acesso e autenticação a API do porteiro/catraca (Ver menu Geral/Itegração)            */
/* Link para doc: http://wiki.utech.com.br/wiki/index.php/MPI/ConfiguracaoWEB#Integra.C3.A7.C3.A3o */
$auth = array(
    "user" => "admin",
    "pass" => "admin",
    "host" => "10.0.0.49",
    "port" => "8080"
);
 
function add_new_user($auth, $userdata)
{
    $basic_auth = $auth['user'] . ":" . $auth['pass'];
    $url = $auth['host'] . ":" . $auth['port'] . "?request=adduser";
 
    $data_string = json_encode($userdata);
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_USERPWD, $basic_auth);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
    );                                           
 
    $result = curl_exec($ch);
    if(!$result) {
        return null;
    }
    $fs = preg_replace("/<html><body>/", "", "$result");
    $rc = preg_replace("/<\/body><\/html>/", "", "$fs");
 
    return $rc;
}
 
function get_datetime($auth)
{
    $basic_auth = $auth['user'] . ":" . $auth['pass'];
    $url = $auth['host'] . ":" . $auth['port'] . "?request=getdatetime";
 
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_USERPWD, $basic_auth);
    $result = curl_exec($ch);
    if(!$result) {
        return null;
    }
    return json_decode($result, true);
}
 
 
/* Pegando a TIMESTAMP do porteiro/catraca!                                            */
/* DEVE ser guardado na base de dados do integrador, para gerar os QR codes dinamicos. */
$datetime = get_datetime($auth);
if($datetime == null) {
        echo "Get datetime error!\n";
        exit(1);
}
 
/* Adicionando o novo usuáio para acesso com QR code dinamico.               */
/* Utiliar os parametros:                                                    */
/* ==> qrcode: TIMESTAMP  (Utilizar o timestamp salvo na base do integrador. */
/* ==> key   : Chave privado do integrador.                                  */
$data = array(
    "qrcode" => $datetime['timestamp'],
    "key"    => $minhachave
);
 
 
/* Adicionando um usuáio com QR code dinamico: */
$r = add_new_user($auth, $data);
if($r == null) {
    echo "Add user erro! Errno: $r\n\n";
    exit(2);
}
 
//////////////////////////////////////////////////////////
// Agora vamos gerar os QR codes dinamicos!
//////////////////////////////////////////////////////////
 
/* index = (Timestamp Atual - Timestamp salvo na base do integrador) / Validade de QRCODE conf. no porteiro. */
/* qrcode = SHA1 ( <Minha chave provida> : <index> )                                                         */
 
$now = get_datetime($auth); // Pegando timestamp atual
$index = intval((($now['timestamp'] - $datetime['timestamp'])/ $validade)); /* Gerando o indice - DEVE ser um inteiro */
$qrcode = sha1("$minhachave:$index");  /* gerando o QR Code dinamico */
 
printf("NOVO QR CODE: $qrcode\n");
 
 
/* Abaixo a simulaçao gerando o QR a cada 45 segundos... */
$count = 10;
while($count) {
 
    $now = null;
    $now = get_datetime($auth); // Pegando timestamp atual
    $index = intval((($now['timestamp'] - $datetime['timestamp'])/ $validade)); // Gerando o indice - DEVE ser um inteiro.
    $qrcode = sha1("$minhachave:$index");  // gerando o QR Code dinamico.
 
    printf("NOVO QR CODE: $qrcode\n");
 
    $count--;
    sleep(45);
}




Voltar


Ferramentas pessoais
Espaços nominais

Variantes
Visualizações
Ações
Navegação
Ferramentas