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:
| Intento | Espera |
|---|---|
| 1 | 2s |
| 2 | 4s |
| 3 | 8s |
| 4 | 16s |
| 5+ | 32s (máximo 60s) |
Eventos
DriverSocket emite los siguientes eventos a través de su EventEmitter interno:
| Evento | Payload | Descripción |
|---|---|---|
connected | driverId: string | Conexión WebSocket establecida |
disconnected | driverId: string | Conexión WebSocket perdida |
sensorConnected | DeviceDescription.data | Dispositivo escáner detectado y descrito |
sensorDisconnected | deviceId?: number | Dispositivo escáner perdido |
fingerprintPreview | base64Image: string | Frame de vista previa del escáner (BMP) |
fingerprintResult | base64Image: string, score?: number, deviceId?: number | Resultado 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);