Para você

Caro desenvolvedor, aqui serão relatados os passos para que você possa realizar a integração com seu software.
Vale lembrar que fizemos DLLs, logo você conseguirá integrar em linguagens que suportam tal tecnologia, como exemplo C#, .Net, Delphi e Java (não homologados).

IMPORTANTE

Como utilizamos C# para produzir as DLLs, iremos exemplificar nossas funções nessa linguagem, mas estamos à disposição para esclarecer suas dúvidas, ok?

Antes de tudo, deve-se realizar a importação da dll Athena.Interface em seu projeto.
Coloque TODAS as dlls enviadas na pasta do seu projeto executável. Ex.: /bin/debug ou /bin/release

Passo 1: Configurações

Para definir as configurações padrões, utilize a seguinte função:

 
            
                    AppSettings.Instance = new AppSettings()
                    {
                        DeviceConnectionTimeout = 0,
                        M33ConnectionPort = _PORT_DEVICE, //(ex: 5005)
                        RequireSerialNumber = false
                    };

             
            

Passo 2: Tipos de Dispositivo

Para realizar a comunicação com um dispositivo, necessitamos informar o tipo deste. Sendo assim, temos abaixo:

Passo 3: Configuração do Dispositivo

Para realizar a comunicação com um dispositivo, utilize as seguintes propriedades do objeto Device

 
            
                Device dispositivo = new Device()
                {
                    IpAddress = _IP_DEVICE,
                    Password = _PASSWORD_DEVICE,
                    Id = _ID_COMMUNICATION_DEVICE,
                    Port = _PORT_DEVICE, //(ex: 5005)
                    Model = DeviceModel.A030
                };
            
        

Passo 4: Criação do Usuário

Para criar um usuário para cadastramento no dispositivo, deve-se utilizar o objeto UserData.
Este contém as seguintes propriedades:

 
            
                //Identificador do usuário a ser enviado para o dispositivo
                public long Id;

                // Nome do usuário a ser enviado para o dispositivo
                public string Name;

                //Template biométrico facial extraído do dispositivo
				//Válido somente para os dispositivos A020, A030 e L030
                public byte[] FaceData;

                //Foto extraída do dispositivo (base64, UNDER DE 8kb, 120x160)
				//Obs.: Caso esteja utilizando o dispositivo da família A040e A060, o tamanho da foto é permitido ser maior
				//uma vez que este parâmetro é utilizado para cadastramento da FACE do usuário
                public string PhotoData;

                //Senha do usuário
				//Válido somente para os dispositivos A020, A030 e L030 
                public string Password;

                //Cartão RFID
                public long CardData;

                //Data de início da permissão de acesso do usuário
                public DateTime? StartExpirationDate;

                //Data final da permissão de acesso do usuário
                public DateTime? EndExpirationDate;

				//ZONA DE TEMPO
				//Válido somente para os dispositivos A020, A030 e L030

                // Zona de Tempo 1 do usuário
                public int TimeZone1;

                // Zona de Tempo 1 do usuário
                public int TimeZone2;

                // Zona de Tempo 1 do usuário
                public int TimeZone3;

                // Zona de Tempo 1 do usuário
                public int TimeZone4;

                // Zona de Tempo 1 do usuário
                public int TimeZone5;

                // Privilégios do usuário. Obs: Somente dispositivos A020, A030 e L030
                public UserPrivilege Privilege;
            
        

Crie a instância do objeto UserData:

            UserData user = new UserData();
        

A partir da versão 1.5.0 recomendamos a utilização da interface DeviceInterface para realizar a chamada dos métodos:

                    Exemplo:
            
                    DeviceInterface.DeleteAllUsers(dispositivo);
                    DeviceInterface.RegisterUser(dispositivo, user);
            

Para os dispositivos A040, A050, A060 e A060T é necessário utilizar os comandos em um tipo de Task. Abaixo, é mostrado um exemplo de utilização com retorno de um dado:

No caso da nossa implementação em C#, utilizamos o método Task de System.Threading.Tasks.

                Task task = Task.Run(() =>
                {
                    //Method to visualize specific user on device
                    return DeviceInterface.VisualizeUser(dev, userNumber);
                });
				
				task.Wait();


               UserData user = task.Result;
                

IMPORTANTE

Para realizar um cadastramento remoto (dispositivos A030), envie somente os atributos ID e NOME, assim dispositivo irá iniciar o cadastramento automaticamente.

Caso queira realizar um cadastramento manualmente, há duas opções:

Lista de Funções

Para realizar um cadastro, siga as regras anteriores como também as definições dos objetos Device e UserData. Caso o dispositivo não aceite a foto de cadastro, será retornada uma Exception
DeviceInterface.RegisterUser(dispositivo, user);
Insere vários usuários no dispositivo a partir de um array de usuários (UserData[])
DeviceInterface.RegisterManyUsers(dispositivo, UserData[] users);
Visualiza a quantidade de usuários cadastrados no dispositivo retornando um valor int.
int count = DeviceInterface.CountUsers(dispositivo);
Capturar os dados da pessoa cadastrada a partir do seu identificador e retorna um objeto UserData
UserData person = DeviceInterface.VisualizeUser(dispositivo, (int)ID_USER);
Realiza a busca de todos usuários cadastrados e retorna uma lista do objeto UserData
UserData[] people = DeviceInterface.VisualizeAllUsers(dispositivo);
Realiza exclusão do usuário conforme o identificador no dispositivo
DeviceInterface.DeleteUser(dispositivo, ID_USER);
Realiza exclusão de vários usuários do dispositivo a partir de um array de identificadores.
DeviceInterface.RegisterManyUsers(dispositivo, long[] users);
Realiza exclusão de todos usuários do dispositivo.
DeviceInterface.DeleteAllUsers(dispositivo);
Realiza a abertura de porta remotamente
DeviceInterface.UnlockDoor(dispositivo);
Realiza a busca dos logs dos usuários reconhecidos retornando uma lista de logs de acesso.
List logs = DeviceInterface.FetchLogs(dispositivo);
Excluir todos os logs (vale a pena ter cuidado com esta função visto que ela exclui permanentemente o log de acesso.)
DeviceInterface.DeleteAccessLogs(dispositivo);
Realiza a configuração de IP fixo no dispositivo (somente para versão A040 e A060T).

Utilize os parametros:
  • IP Fixo a ser configurado
  • Gateway
  • Máscara
  • DNS
  • DHCP (true / false)

DeviceInterface.SetFixedIP(dispositivo, ip, gateway, mask, dns, dhcp);
Realiza a configuração do WIFI no dispositivo (somente para dispositivos A040).

Deve-se informar o SSID do WIFI a ser configurado juntamente com a senha.

DeviceInterface.SetWiFiConfiguration(dispositivo, ssid, password);
Seta uma logo no display do dispositivo (somente para dispositivos A040 e A060T).

Deve-se informar uma imagem em base64

DeviceInterface.SetLogo(dispositivo, imageBase64);
Configura uma data e hora no dispositivo

Opcionalmente deve-se informar um dateTime. Caso não seja informado, o SDK considerará o horário atual.
Além disso, a partir da versão 1.6.2 foi acrescentada, para o equipamento A040, a configuração de TimeZone (Fuso Horário) de forma opcional, sendo:
  • Brasilia_less_1 - Horário de Brasília menos 1 hora
  • Brasilia_less_2 - Horário de Brasília menos 2 horas
  • Brasilia_plus_1 - Horário de Brasília mais 2 horas
  • Brasilia - Horário atual de Brasília

Obs.: Caso o TimeZone não seja informado, para os dispositivos A040, será considerado o horário de Brasilia.

NOTA 1: esta função era SetDateTimes (v <=1.5.1) e passou a ser SetDateTime a partir da versão 1.6.0
NOTA 2: O equipamento será reiniciado automaticamente após realizar esta configuração.

DeviceInterface.SetDateTime(dateTime, dispositivo);
DeviceInterface.SetDateTime(dateTime, dispositivo, DeviceTimeZone.Brasilia);
Realiza o reset do equipamento.

Para realizar o reset, deve-se informar a modalidade, conforme o enum disponibilizado (DeletionTypeEnum), sendo:
- FactoryReset (reset de fábrica)
- OnlyData (apagar somente dados de usuários)

DeviceInterface.ResetDevice(dispositivo, DeletionTypeEnum.OnlyData);
Realiza o reinicio do equipamento.

DeviceInterface.RestartDevice(dispositivo);
Para mais informações, leia abaixo sobre a sessão de callback de eventos.

string url = "http://www.google.com.br"
DeviceInterface.SetCallBackOnRecognize(dispositivo, url);
Esta função permite realizar o controle de temperatura.
Após configurado, caso o usuário esteja acima do padrão definido, será exibido um alerta.

bool utilizatemperatura = true;
double valortemperatura = 37.3;
DeviceInterface.SetTemperature(dispositivo, utilizatemperatura, valortemperatura);

NOTA: Caso o valor da temperatura informada seja 0, o SDK considerará 37.3.
Ao utilizar esta configuração, será obrigatório a utilização de máscara pelo usuário.

- É possível configurar a utilização de alerta por voz, para alertar o usuário. Assim, utilize o terceiro parâmetro como um booleano.

- Caso utilize o alerta por voz, passe como parâmetro a mensagem a ser enviada. Vale ressaltar que por hora só é aceito texto em inglês.

bool usamascara = true;
bool utilizaalertavoz = true;
string textalerta = "Please, wear a mask!";
DeviceInterface.SetMaskUsage(dispositivo, usamascara, utilizaalertavoz, textalerta);

NOTA: Após esta função ser utilizada, o equipamento será reiniciado.
Permite exibir uma mensagem na tela e por áudio no dispositivo.

bool utilizaalertavoz = true;
string mensagem = "Hello!";
DeviceInterface.ShowMessage(dispositivo, utilizaalertavoz, mensagem);

NOTA: Vale ressaltar que por hora só é aceito texto em inglês.

Utilização em WebAPI

IMPORTANTE

(Dispositivos A020, A030, L030)

Para realizar a comunicação ao dispositivo através de um web service, por exemplo, deve-se colocar as funções de comunicação em uma Thread separada de comunicação:

Thread thread = new Thread(delegate () { função });
thread.Start();

Callback de eventos de Acesso

Dispositivos A040

Os dispositivos A040 esperam uma rota HTTP para enviarem o callback de acesso. Sendo assim, utilize a função abaixo para realizar a configuração da rota:

            
                    string url = "http://localhost:2060/device/callback";
                    DeviceInterface.SetCallBackOnRecognize(dispositivo, url);
                
            

Vale ressaltar que a rota deve ser do tipo POST e esperar como parâmetro um objeto do tipo CallbackModel contido em nosso SDK.
Essa classe possui os seguintes atributos:

            
                    //Image Path of user recognized
                    public string Path { get; set; }
            
//Device IP public string Ip { get; set; }
//Serial of device public string DeviceKey { get; set; }
//Id of user recognized public string PersonId { get; set; }
//Time of recognition (unix timespan format) public long Time { get; set; }
//Type of recognition: FACE / CARD public string Type { get; set; } /// Para dispositivos A060T
//Score of recognition public string SearchScore { get; set; }
//Score of liveness public string LivenessScore { get; set; }
//Temperature Value of recognition public string Temperature { get; set; }
//Temperature Default public string Standard { get; set; }
//State of Temperatura: 1 NORMAL - 2 ABNORMAL public string TemperatureState { get; set; }

Após o recebimento do comando, deve-se retornar para o dispositivo uma confirmação do recebimento da mensagem.
A confirmação deve-se se dar na resposta a requisição através das funções:

                
				//Função disponibilizada no SDK
				CallbackModel.CallbackFailed();
						
				//Caso queira desenvolver por você mesmo, utilize o retorno abaixo para a requisição HTTP 200:
				var callback_failed = {
					result = 1,
					success = false
				};				
						
				//Função disponibilizada no SDK
				CallbackModel.CallbackSuccess();
						
				//Caso queira desenvolver por você mesmo, utilize o retorno abaixo para a requisição HTTP 200:
				var callback_success = {
					result = 1,
					success = true
				};	
                
            

IMPORTANTE

Caso o retorno não seja realizado, o dispositivo continuará realizando a mesma requisição para o usuário reconhecido.

Dispositivos A030

Os dispositivos A030, se habilitados através da opção Modo de Transferência de Evento, ou Event Transfer Mode, podem enviar callbacks diretamente ao servidor via protocolo UDP:


A porta que o SDK escutará os callbacks é definida pela propriedade M33UDPListeningPort da classe AppSettings
Estes callbacks podem ser configurados através de eventos na classe Biomtech.Athena.Interface.Devices.M33.M33Connection.

Os eventos são chamados: OnReceivedManagementCallback, OnReceivedSuccessRecognitionCallback e OnReceivedFailedRecognitionCallback e passam respectivamente como parâmetro objetos do tipo CallbackObject, RecognitionSuccessCallback e RecognitionFailureCallback os quais são definidos como:

                
                public class CallbackObject {
                        public string IpAddress { get; set; } //Endereço de IP do dispositivo
                        public int MachineID { get; set; }    //Número identificador do dispositivo
                        public DateTime Date {get; }          //Data da ocorrência do callback
                        public int Weekday { get; set; }      //Dia da semana da data
                        public EventType EventType { get; set; }  //Tipo de evento
                        public int UserID { get; set; }       //Identificador do usuário relacionado
                }


                public class RecognitionSuccessCallback : CallbackObject {
                
                }

                public class RecognitionSuccessCallback : CallbackObject {
                    public ReasonOfFailureType ReasonOfFailure { get; set; }  //Razão do não reconhecimento
                }

             
            

Redirecionamento de callbacks UDP

Caso voce queira redirecionar os callbacks para alguma(s) máquina(s) da rede, a classe Biomtech.Athena.Interface.Devices.M33.M33Connection possui a propriedade IsCallbackReroutingEnabled desabilitada por padrão, mas que se habilitada, redirecionará os pacotes para o IP ou máscara desejados.

O IP ou máscara podem ser escolhidos através do método estático SetCallbackBroadcastRange, passando um endereço de IP direto ou com máscara para broadcasting.

A porta que será efetuado o broadcasting é definida pela propriedade M33UDPBroadcastingPort da classe AppSettings