Servidor de Envio de Eventos

Servidor de Envio de Eventos

Por meio do servidor de envio de eventos é possível realizar a configuração de um endereço de ip, para o qual o dispositivo enviará os eventos. Todos os eventos deverão ser respondidos com o código HTTP 200, desta forma o dispositivo tem a garantia da entrega, para eventos que não sejam respondidos com este código o dispositivo irá realizar o armazenamento dos mesmos e fará a tentativa de envio destes eventos até que ocorra a resposta de status 200.

⚠️

Dispositivos que suportam esta função:

DispositivosFirmware
SS 3530 MF FACE W210706 ou superior
SS 5530 MF FACE210929 ou superior
SS 3430 BIO e MF BIO220621 ou superior
SS 3540 MF FACE EX211109 ou superior
SS 5530 LITE230307 ou superior
SS 3540 MF FACE BIO EX231129 ou superior
SS 1530 MF W240201 ou superior
SS 1540 MF W240201 ou superior
SS 3532 MF W231018 ou superior
SS 3542 MF W231018 ou superior
SS 5531 MF W231018 ou superior
SS 5541 MF W231018 ou superior
SS 5532 MF W231018 ou superior
SS 5542 MF W231018 ou superior

Configurando Servidor de Envio de Eventos

Requisição - GET - Passo 1

http://{{device_ip}}/cgi-bin/configManager.cgi?action=setConfig&Intelbras_ModeCfg.DeviceMode=1&PictureHttpUpload.Enable=true&PictureHttpUpload.UploadServerList[0].Address=192.168.1.200&PictureHttpUpload.UploadServerList[0].Port=3000&PictureHttpUpload.UploadServerList[0].Uploadpath=/notification&HTTPUploadPic.Enable=true&PictureHttpUpload.UploadServerList[0].HttpsEnable=false

paramtypedescription
setConfig *StringComando para configuração
Enable *BooleanHabilita/Desabilita a função
Address *StringEndereço IP do Servidor (exemplo: 192.168.3.88)
Port *NumberPorta (Exemplo: 3000)
Uploadpath *StringPath (Exemplo: /notification)
HttpsEnable *BooleanHabilita/Desabilita o HTTPS

Requisição - GET - Passo 2

Ativação do modo servidor de envio de eventos (POST Events):

http://{{device_ip}}/cgi-bin/configManager.cgi?action=setConfig&Intelbras_ModeCfg.DeviceMode=1

| DeviceMode * | Number | 0: StandAlone, 1: Servidor de Envio de Eventos, 2: Modo Online |

🚨

Verifique sempre as configurações de rede do seu produto, como Endereço de IP e Gateway, para garantir que o mesmo esteja acessível na rede.

Exemplo de Retorno - multipart-mixed:

--myboundary
Content-Type: text/plain
Content-Disposition: form-data; name="info"
 
{
   "Channel" : 0,
   "Events" : [
      {
         "Action" : "Pulse",               
         "Code" : "AccessControl",           // Código do tipo de Evento
         "Data" : {                          // Informação do Evento
            "Alive" : 100,
            "CardName" : "test",             // Nome do Usuário 
            "CardNo" : "",                   // Código do cartão em Hexadecimal 
            "CardType" : 0,                  // Tipo do Cartão 0: Ordinary card, 1: VIP card, 2: Guest card, 3: Patrol card, 4: Blocklist card, 5: Duress card
            "CreateTime" : 1581098928,       // Data da criação do Evento em Timestamp 
            "Door" : 0,                      // Porta ao qual ocorreu o acesso
            "ErrorCode" : 0,                 // Código do Erro / Motivo do Acesso negado 
            "ImageInfo" : [                  // Lista de informações da foto que é mandada junto ao evento 
               {
                  "Height" : 640,
                  "Length" : 11112,
                  "Offset" : 0,
                  "Type" : 1, ==> Foto de Contexto
 
                  "Width" : 360
               },
               {
                  "Height" : 480,
                  "Length" : 30313,
                  "Offset" : 11112,
                  "Type" : 0, ==> Foto do usuário
                  "Width" : 367
               },
               {
                  "Height" : 556,
                  "Length" : 12401,
                  "Offset" : 41425,
                  "Type" : 2, ==> Foto de contexto com recorte do rosto 
                  "Width" : 332
               }
            ],
            "Method" : 15,                   // Método usado na autenticação
            "ReaderID" : "1",                // Leitor usado na autenticação
            "Similarity" : 98,
            "SnapPath" : "\/var\/tmp\/partsnap8.jpg",
            "Status" : 1,                    // Status do acesso Liberado/Negado
            "Type" : "Entry",                // Tipo de Acesso Entrada/Saida
            "UTC" : 1581098928,              // UTC do acesso
            "UserID" : "6",                  // ID do Usuário
            "UserType" : 0                   // Tipo de usuário 
         },
         "Index" : 0,
         "PhysicalAddress" : "bc:32:5f:6d:46:d9"
      }
   ],
   "FilePath" : "\/mnt\/appdata1\/userpic\/SnapShot\/2020-02-07\/15\/08\/6_98_100_20200207150848425.jpg",
   "Time" : "07-02-2020 15:08:48"            // Data e hora do evento. 
}
 

Exemplos de Servidor

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from os.path import abspath, dirname, join
import json
import os
import time
from bottle import route, request, response, run
 
save_dir = join(dirname(abspath(__file__)), "s_files")
 
save_raw_dir = join(dirname(abspath(__file__)), "s_raw_files")
 
@route('%s' % '/events', method='POST')
def do_upload():
    raw_data = request.body.read()
    raw_name = "raw_data_%s.txt" % time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime())
    with open(join(save_raw_dir, raw_name), "ab") as fp:
        fp.write(raw_data)
 
    data_list = raw_data.split(b"--myboundary\r\n")
    if data_list:
        for a_info in data_list:
            if b"Content-Type" in a_info:
                lines = a_info.split(b"\r\n")
                a_type = lines[0].split(b": ")[1]
 
                if a_type == b"image/jpeg":
                    a_name = "abc_%s.jpg" % time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime())
                    with open(join(save_dir, a_name), "wb") as fp:
                        data = b"\r\n".join(lines[3:-3])
                        fp.write(data)
                else:
                    a_name = "abc_%s.txt" % time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime())
                    with open(join(save_dir, a_name), "wb") as fp:
                        data = b"\r\n".join(lines[3:-1])
                        fp.write(data)
 
    # for file_name in request.files.keys():
    #      upload = request.files.get(file_name)
    #      save_path = join(dirname(abspath(__file__)), "s_files", file_name)
    #      if os.path.exists(save_path):
    #          os.remove(save_path)
    #      upload.save(save_path)  # appends upload.filename automatically
    return 'OK'
 
 
run(host='127.0.0.1', port=3000, debug=True)
 

Comando para Limpar Eventos em Cache

Caso você possua muitos eventos, tanto no modo servidor de envio de eventos quanto no modo online que não foi feito a confirmação de envio ao servidor e deseja apagar todos os eventos em cache, você pode utilizar o comando abaixo.

Requisição - GET

http://19.168.3.87/cgi-bin/recordUpdater.cgi?action=clear&name=AccessOffline

paramtypedescription
clear *StringComando para Limpar

Exemplo de Retorno - text/plain:

OK
 

Exemplos de Servidor

import requests
 
device_ip = '10.1.35.144'
username = 'admin'
password = 'acesso1234'
 
url = "http://{}/cgi-bin/recordUpdater.cgi?action=clear&name=AccessOffline".format(
                         str(device_ip),
                     )
 
digest_auth = requests.auth.HTTPDigestAuth(username, password)
rval = requests.get(url, auth=digest_auth, stream=True, timeout=20, verify=False)
 
print(rval.text)