Compartir a través de


Extensor bidi USB

Importante

Se recomienda usar el controlador de clase de bandeja de entrada IPP de Microsoft, junto con aplicaciones de soporte técnico de impresión (PSA), para personalizar la experiencia de impresión en Windows 10 y 11 para el desarrollo de dispositivos de impresora.

Para obtener más información, consulte Guía de diseño de aplicaciones para compatibilidad con impresión.

Windows permite a los fabricantes admitir la comunicación bidireccional (Bidi) para dispositivos USB mediante una combinación de un archivo XML Bidi y un archivo Javascript conocido como extensor USB Bidi.

El extensor USB Bidi permite a las aplicaciones usar Bidi con USB como mecanismo de transporte. La implementación de Javascript no admite ningún control de flujo de dispositivo ni ninguna multiplexación de información de control con trabajos de impresión durante la impresión.

De forma predeterminada, las consultas bidi y las solicitudes de estado se enrutan a través de la interfaz del dispositivo USB que se usa para imprimir. Esto permite la comunicación bidireccional completa para el estado mediante el método de JavaScript getSchemas , así como permitir operaciones Set mediante el método de JavaScript setSchema . La comunicación bidireccional completa es posible mientras no se envían trabajos de impresión al dispositivo de impresión.

Durante la impresión, los datos del trabajo de impresión bloquean las escrituras, por lo que el método getStatus se usa para obtener el estado no solicitado del dispositivo, usando solo el canal de lectura. Pero si el dispositivo admite una interfaz USB secundaria, la función de método requestStatus se usa para obtener el estado de una impresora mientras el dispositivo está imprimiendo.

En Windows 8.1, el modelo de controlador v4 se ha ampliado para proporcionar compatibilidad con dispositivos basados en host. Además de esto, USBMon se ha actualizado para permitir que los IHD usen código JavaScript para obtener un mejor control de la ruta de acceso de impresión y realizar acciones basadas en trabajos de impresión. La actualización incluye la adición de LAS API que proporcionan nuevos puntos de entrada de JavaScript bidi. Estas API están alineadas con las funciones existentes en USBMon.

startPrintJob. Esta nueva función se alinea con startDocPort en USBMon. A medida que se inicia cada nuevo trabajo de impresión USB en un puerto que está conectado a un dispositivo de impresión basado en host USBMon llamará al IHV proporcionado JavaScript para permitir que realice cualquier procesamiento previo al trabajo que requiera. Esto podría incluir establecer las propiedades globales del trabajo en el contenedor de propiedades del trabajo, consultar el dispositivo para conocer el estado actual y los datos de configuración o nada. Las tareas completadas dependen completamente del dispositivo e IHV.

writePrintData. Esta nueva función se alinea con writePort en USBMon. Cuando USBMon recibe cada llamada de función writePort desde la cola durante el acto de impresión, los datos de impresión proporcionados deben enviarse al dispositivo basado en host a través de la función JavaScript de IHV. Esto permite que el JS de IHV decida qué se debe enviar al dispositivo en este momento. El IHV puede quitar, agregar o guardar partes del búfer de datos según sea necesario. Esto permite que el IHV controle completamente lo que se envía al dispositivo cuando. Esto ayudará a habilitar estos escenarios como dúplex manual al ofrecer a IHV la posibilidad de ahorrar datos (dentro de una de las secuencias persistentes) de las páginas pares del trabajo de impresión para su procesamiento una vez que se hayan recibido todos los datos del colador. El IHV también puede usar el objeto printerBidiSchemaResponses para devolver el estado del trabajo de impresión o el estado del dispositivo durante el procesamiento del trabajo.

endPrintJob. Esta nueva función se alinea con endDocPort en USBMon. Cuando USBMon recibe la llamada endDocPort para cada trabajo de impresión USB en un puerto conectado a un dispositivo de impresión basado en host USBMon llamará al IHV proporcionado JavaScript para permitir que realice cualquier procesamiento posterior al trabajo que requiera. Esto podría incluir enviar los datos retenidos al dispositivo, devolver valores de esquema bidi para iniciar dúplex manual o cualquier otra cosa que requiera el IHV/dispositivo.

En el diagrama siguiente se proporciona información general sobre la arquitectura de extensión USB Bidi, que muestra el escenario en el que se usa el método getStatus para obtener el estado no solicitado del dispositivo a través de la interfaz USBPrint.

Arquitectura del extensor usb bidi con el método getstatus.

Para obtener más información sobre cómo trabajar con una impresora USB, consulte Impresión USB.

Referencia de la API del extensor de USB Bidi

El código JavaScript del extensor USB Bidi usa las siguientes funciones para comunicarse con el dispositivo de impresión:

  • getSchemas

  • setSchema

  • getStatus

  • requestStatus

  • startPrintJob

  • writePrintData

  • endPrintJob

Para obtener más información sobre estas API, consulte Referencia de api de JavaScript.

Esquema XML de extensión USBMon Bidi

El archivo de extensión USBMon Bidi utiliza la misma estructura básica que el archivo de extensión DE BIDi SNMP y el archivo de extensión WSDMon Bidi. El archivo de esquema XML se publica en el Kit de controladores de Windows y los archivos de extensión USBMon Bidi se validarán automáticamente durante la prueba INFGate WHCK. Al desarrollar un esquema de extensión Bidi y trabajar con el bus USB, es importante tener en cuenta la siguiente información:

  • Los valores pueden especificar un accessType de Get, Set o GetSet. Esto indica dónde se admite el elemento de esquema descrito en los tipos de operación Bidi Get o Set.

  • Los valores pueden especificar una queryKey. Se debe usar para indicar las operaciones físicas que se usan para obtener datos del dispositivo. Todas las propiedades de la misma queryKey deben recuperarse en una operación de lectura y escritura USB.

  • Los valores de Bidi se sondean inmediatamente si se solicitan en una llamada API de Bidi. El valor refreshInterval es el valor inicial que indica cuándo sondear el dispositivo si hay actualizaciones en un valor de esquema Bidi determinado. Después de cada sondeo, refreshInterval aumenta hasta que se detiene el sondeo. En la fórmula siguiente se muestra cómo se incrementa refreshInterval:

    currentRefreshInterval = refreshInterval * (3 * numPolls);
    

Interacción de archivos de extensión USBMon y USB Bidi

A medida que se crea o abre cada puerto USB nuevo, USBMon determinará si el dispositivo conectado y el controlador asociado incluyen un nuevo archivo de extensión Bidi y un archivo JavaScript de extensión Bidi. USBMon busca el manifiesto del controlador v4 o el archivo INI del controlador y recupera el nombre de los archivos. Si USBMon encuentra los archivos pertinentes, los usa para determinar la lista de valores extendidos de esquema bidi admitidos por este dispositivo y, a continuación, comunicarse con el dispositivo para consultar sus valores. En este momento USBMon admite las acciones de esquema bidi especificados por IHV a través de las API existentes del administrador de trabajos de impresión.

Ejemplos de controladores de Windows en GitHub

Ejemplo de archivo XML de USBMon Bidi: proporciona un ejemplo de un archivo XML de extensión USBMon Bidi. Usa las propiedades estándar del esquema Bidi DeviceInfo, Configuration y Memory y también define algunas extensiones personalizadas.

Y para obtener más información sobre los archivos de extensión Bidi, vea Esquema de comunicación bidireccional.

Ejemplo de archivo JavaScript de USBMon Bidi. Este ejemplo incluye un archivo JavaScript USBMon Bidi Extender. Muestra cómo admitir operaciones Bidi SET y GET, así como cómo escuchar eventos mientras la impresora está imprimiendo.

Depuración

La depuración interactiva se puede habilitar mediante la creación de la siguiente clave del Registro. Para USB Bidi JavaScript, el administrador de impresión debe reiniciarse antes de que se habilite la depuración.

Nombre de clave: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

Nombre del valor: EnableJavaScriptDebugging

Tipo: DWORD

Valor: 1

Una vez creada la clave del Registro que se muestra en la sección anterior y se ha reiniciado el proceso de hospedaje, el script se puede depurar de la siguiente manera:

  1. Adjunte el depurador al proceso de hospedaje. Para USB Bidi JavaScript, esto es spoolsv.exe.

  2. Establezca el depurador en modo de depuración de scripts.

  3. Seleccione Interrumpir todo (Ctrl + Alt + Interrumpir) para interrumpir el proceso la próxima vez que se ejecute un script.

  4. Ejecute el escenario para reproducir el problema.

  5. Una vez que el depurador se divide en una función de JavaScript, establezca los puntos de interrupción necesarios y recorra el código.

Esquema de comunicación bidireccional

IPrinterBidiSchemaElement

IPrinterScriptContext

IPrinterScriptableSequentialStream

Referencia de la API de JavaScript

Impresión USB

Conectividad del controlador de impresora V4