No puede reclamar la interfaz USB más de 64 veces.
Tengo una aplicación que necesita mantener una conexión larga (indefinida) a un dispositivo USB e imprimir un número potencialmente ilimitado de veces en él. Por lo tanto, necesita hacer muchas reclamaciones en la misma interfaz del dispositivo.
Eventualmente, mi aplicación falla porque en la 65ª reclamación recibo un error LIBUSB_ERROR_ACCESS
lanzado. ¿Es posible solucionarlo con node-usb
? Posiblemente relacionado con:
- https://github.com/libusb/libusb/issues/16
- https://github.com/node-usb/node-usb/issues/302#issuecomment-988657538
Entorno y hardware
windows 11 home insider preview
nodejs v11.0.0
node-usb v1.5.0
node-escpos v2
Código
function testClaim() {
const d = new USB();
const p = new Printer(d, { encoding: 'Shift-JIS' });
const loop = (curr = 0) => {
console.log('LOOP', curr)
if (curr === 50) {
setTimeout(() => {
d.open(() => d.reset(() => {
console.log('RESET', curr)
// no debería requerir que el usuario haga nada, necesita poder imprimir indefinidamente
loop(0)
}))
}, 1000);
return;
}
d.open(() => {
p.close(() => {
loop(curr + 1)
})
})
}
loop();
}
testClaim();
davy.ai
Con base en la información y el código proporcionados, parece que el problema está relacionado con el número máximo de reclamaciones que se pueden hacer en una interfaz USB. Esto no es específico de
node-usb
, sino más bien una limitación de la biblioteca subyacentelibusb
.El error
LIBUSB_ERROR_ACCESS
indica que la interfaz no está disponible para su reclamación, lo cual puede suceder si otro proceso ya la ha reclamado o si se ha alcanzado el número máximo de reclamaciones.Una posible solución a este problema es reiniciar periódicamente el dispositivo USB, lo cual liberaría todas las interfaces y permitiría que tu aplicación las reclame nuevamente. Esto se sugiere en los problemas de GitHub enlazados en la pregunta.
En el código proporcionado, la función
testClaim()
ya incluye un paso de reinicio después de 50 reclamaciones. Sin embargo, parece que el reinicio no está liberando completamente la interfaz, lo que podría ser la razón por la que el error sigue ocurriendo en la reclamación número 65.Para solucionar este problema de manera más exhaustiva, puede ser útil implementar un manejo de errores y registros más detallado en el código, y verificar el estado de la interfaz USB antes de intentar reclamarla.
En general, si bien es posible solucionar la limitación de reclamación de la interfaz utilizando
node-usb
ylibusb
, es importante tener en cuenta que esta es una limitación de hardware y de la biblioteca de bajo nivel que es posible que no se pueda evitar por completo.