Compartir a través de


Extensor bidi USB

Importante

La plataforma de impresión moderna es el medio preferido de Windows para comunicarse con impresoras. 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 Plataforma de impresión moderna y la 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 Javascript no soporta ningún control de flujo del dispositivo, ni ninguna multiplexación de información de control con los trabajos de impresión durante la impresión.

Por defecto, las consultas Bidi y las solicitudes de estado se enrutan a través de la interfaz del dispositivo USB que se usa para la impresión. Esto permite una comunicación bidireccional completa para el estado usando el método getSchemas JavaScript, así como permitiendo operaciones Set usando el método setSchema JavaScript. La comunicación bidireccional completa es posible mientras no se envíen trabajos de impresión al dispositivo de impresión.

Durante la impresión, las escrituras están bloqueadas por los datos del trabajo de impresión, 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 compatible con una interfaz USB secundaria, entonces la función del 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 ofrecer compatibilidad con dispositivos basados en host. Además, USBMon se ha actualizado para permitir que los IHV usen código JavaScript para obtener un mejor control de la ruta de impresión y realizar acciones basadas en trabajos de impresión. La actualización incluye la adición de API que proporcionan nuevos puntos de entrada Bidi JavaScript. Estas API están alineadas con las funciones existentes en USBMon.

startPrintJob. Esta nueva función se alinea con startDocPort en USBMon. Cada vez que se inicie un nuevo trabajo de impresión USB en un puerto conectado a un dispositivo de impresión basado en host, USBMon llamará al JavaScript proporcionado por IHV para permitirle realizar cualquier procesamiento previo al trabajo que necesite. Esto podría incluir la configuración de las propiedades globales del trabajo en la bolsa de propiedades del trabajo, la consulta al dispositivo del estado actual y los datos de configuración o nada. Las tareas completadas dependen completamente del dispositivo y del IHV.

writePrintData. Esta nueva función se alinea con writePort en USBMon. Cuando USBMon recibe cada llamada a la función writePort desde la cola durante el acto de imprimir, los datos de impresión suministrados necesitan ser enviados al dispositivo Host Based a través de la función JavaScript de IHV. Esto permite al IHV JS decidir qué debe enviarse al dispositivo en ese momento. El IHV puede eliminar, añadir o guardar partes del búfer de datos según sea necesario. Esto permite al IHV controlar completamente qué se envía al dispositivo y cuándo. Esto ayudará a permitir escenarios como el dúplex manual, dando al IHV la oportunidad de guardar (dentro de uno de los flujos persistentes) los datos de las páginas pares del trabajo de impresión para procesarlos una vez que se hayan recibido todos los datos de la cola. 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 que está conectado a un dispositivo de impresión basado en host, USBMon llamará al JavaScript proporcionado por IHV para permitirle realizar cualquier procesamiento posterior al trabajo que requiera. Esto podría incluir el envío de cualquier dato retenido al dispositivo, la devolución de valores Bidi Schema para activar la impresión dúplex manual o cualquier otra cosa que el IHV/dispositivo requiera.

El siguiente diagrama proporciona una visión general de la arquitectura del extensor USB Bidi, mostrando el escenario en el que el método getStatus se usa para obtener el estado no solicitado del dispositivo a través de la interfaz USBPrint.

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

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

Referencia de la API del extensor bidi USB

El código JavaScript del USB Bidi extender 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 la Referencia de API JavaScript.

Esquema XML de la extensión USBMon Bidi

El archivo de extensión USBMon Bidi usa la misma estructura básica que el archivo de extensión SNMP Bidi y el archivo de extensión WSDMon Bidi. El archivo de esquema XML se publica en el Windows Driver Kit y los archivos de extensión USBMon Bidi se validarán automáticamente durante la prueba INFGate WHCK. Cuando desarrolle un esquema de extensión Bidi y trabaje con el bus USB, es importante que tenga en cuenta la siguiente información:

  • Los valores pueden especificar un accessType de Get, Set o GetSet. Esto indica si el elemento del esquema descrito es compatible con los tipos de operación Bidi Get o Set.

  • Los valores pueden especificar una queryKey. Debe usarse para indicar las operaciones físicas usadas para obtener datos del dispositivo. Todas las propiedades bajo la misma queryKey deben poder recuperarse en una operación USB de lectura/escritura.

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

    currentRefreshInterval = refreshInterval * (3 * numPolls);
    

Interacción entre USBMon y el archivo de extensión USB Bidi

Cuando se crea o se abre un nuevo puerto USB, USBMon determina 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 en el manifiesto del controlador v4 o en el archivo INI del controlador y recupera el nombre de los archivos. Si USBMon encuentra los archivos relevantes, los usa para determinar la lista de valores Bidi Schema extendidos soportados por este dispositivo y luego se comunica con el dispositivo para consultar sus valores. En este punto USBMon soporta las acciones Bidi Schema especificadas por IHV a través de las APIs existentes de Print Spooler.

Ejemplos de controladores Windows en GitHub

Archivo de ejemplo USBMon Bidi XML - esto proporciona una muestra de un archivo XML USBMon Bidi Extension. Usa las propiedades estándar del esquema Bidi DeviceInfo, Configuration y Memory y también define algunas extensiones personalizadas.

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

Ejemplo de archivo JavaScript USBMon Bidi. Esta muestra incluye un archivo JavaScript USBMon Bidi Extender. Demuestra cómo soportar las operaciones Bidi SET y GET, así como cómo escuchar eventos mientras la impresora está imprimiendo.

Depuración

La depuración interactiva puede habilitarse creando la siguiente clave de registro. Para USB Bidi JavaScript, la cola de impresión debe ser reiniciado 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 de registro mostrada en la sección anterior, y reiniciado el proceso de alojamiento, el script puede ser depurado de la siguiente manera:

  1. Conecte su depurador al proceso de hosting. Para USB Bidi JavaScript, es spoolsv.exe.

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

  3. Seleccione Interrumpir todo (Ctrl + Alt + Pausa) para entrar en 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 entre en una función JavaScript, establezca los puntos de interrupción necesarios y recorra el código.

Esquema de comunicación bidireccional

IPrinterBidiSchemaElement

IPrinterScriptContext

IPrinterScriptableSequentialStream

Referencia del API de JavaScript de Lector inmersivo (v 1.1)

Impresión USB

Conectividad del controlador de impresora V4