Saltar al contenido principal

Driver del escáner

El SDK se comunica con los escáneres de huellas a través de un driver WebSocket local. La clase DriverSocket gestiona la conexión, la reconexión automática y el despacho de eventos.

Arquitectura

El driver local se ejecuta como un servicio local en la máquina del usuario y expone un endpoint WebSocket en wss://local.heuristik.com:2794/hk-reader. El SDK se conecta a este endpoint automáticamente cuando se crea el cliente.

Ciclo de vida de la conexión

Al construirse, DriverSocket intenta conectarse. Si la conexión se interrumpe, se reconecta con backoff exponencial. Llamar a destroy() termina la conexión de forma permanente.

Backoff exponencial

Cuando la conexión se cae, el driver se reconecta con backoff exponencial:

IntentoEspera
12s
24s
38s
416s
5+32s (máximo 60s)

Eventos

DriverSocket emite los siguientes eventos a través de su EventEmitter interno:

EventoPayloadDescripción
connecteddriverId: stringConexión WebSocket establecida
disconnecteddriverId: stringConexión WebSocket perdida
sensorConnectedDeviceDescription.dataDispositivo escáner detectado y descrito
sensorDisconnecteddeviceId?: numberDispositivo escáner perdido
fingerprintPreviewbase64Image: stringFrame de vista previa del escáner (BMP)
fingerprintResultbase64Image: string, score?: number, deviceId?: numberResultado final con puntuación de calidad

Estado de sensor y driver

Para comprobar el estado tanto del sensor como del servicio del driver, se dispone de cuatro métodos para escuchar los eventos de conexión/desconexión de ambos: onSensorConnected, onSensorDisconnected, onDriverConnected, onDriverDisconnected.

Mediante la escucha de estos eventos es posible capturar los momentos en que se produce una conexión/desconexión del sensor y/o del driver (así como verificar el estado inicial) y actuar en consecuencia.

Con las funciones getCurrentSensor() o getConnectedSensors() es posible obtener además información relativa al sensor en uso

const sensorConnectedHandler = (device) => {
const serialNumber = device.serialNumber ?? 'S/N unknown';
const hardwareVersion = device.hardwareVersion ?? '-';
const firmwareVersion = device.firmwareVersion ?? '-';
console.log(`Sensor connected: ${serialNumber}; Hardware: ${hardwareVersion}; Firmware: ${firmwareVersion}`);
}
const sensorDisconnectedHandler = (deviceId, serialNumber) => {
console.log(
typeof deviceId === 'number'
? `Sensor disconnected (device_id=${deviceId}; serial_number: ${serialNumber})`
: `Sensor disconnected`
)
}
const driverConnectedHandler = (driverId) => {
console.log(`Driver connected. ${driverId ? `Driver Id: ${driverId}` : ''}`);
const currentSensor = client.operations.getCurrentSensor() || client.operations.getConnectedSensors()[0];
if (currentSensor) {
sensorConnectedHandler(currentSensor);
} else {
console.log('Not sensor available');
}
}
const driverDisconnectedHandler = (driverId) => {
console.log(`Driver disconnected. ${driverId ? `Driver Id: ${driverId}` : ''}`);
console.log('Sensor connection lost because driver disconnection');
}

client.operations.onSensorConnected(sensorConnectedHandler);
client.operations.onSensorDisconnected(sensorDisconnectedHandler);
client.operations.onDriverConnected(driverConnectedHandler);
client.operations.onDriverDisconnected(driverDisconnectedHandler);

Para anular la suscripción a los eventos se puede hacer uso de los correspondientes offSensorConnected, offSensorDisconnected, offDriverConnected y offDriverDisconnected.

client.operations.offSensorConnected(sensorConnectedHandler);
client.operations.offSensorDisconnected(sensorDisconnectedHandler);
client.operations.offDriverConnected(driverConnectedHandler);
client.operations.offDriverDisconnected(driverDisconnectedHandler);