Compartilhar via


Extensor USB Bidi

Importante

A plataforma de impressão moderna é o meio preferencial do Windows para se comunicar com as impressoras. Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft juntamente com PSA (Aplicativos de Suporte à Impressão) para personalizar a experiência de impressão no Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.

Para obter mais informações, consulte Plataformade impressão moderna e o Guia de design do aplicativo de suporte de impressão.

O Windows permite que os fabricantes ofereçam suporte à comunicação bidirecional (Bidi) para dispositivos USB usando uma combinação de um arquivo XML Bidi e um arquivo Javascript conhecido como extensor USB Bidi.

O extensor USB Bidi permite que os aplicativos usem Bidi com USB como mecanismo de transporte. A implementação do Javascript não suporta nenhum controle de fluxo de dispositivo ou qualquer multiplexação de informações de controle com trabalhos de impressão durante a impressão.

Por padrão, as consultas bidi e as solicitações de status são roteadas pela interface do dispositivo USB usada para impressão. Isso permite a comunicação bidirecional completa para status usando o método JavaScript getSchemas, bem como permite operações Set usando o método JavaScript setSchema. A comunicação bidirecional completa é possível enquanto não há trabalhos de impressão sendo enviados para o dispositivo de impressão.

Durante a impressão, as gravações são bloqueadas pelos dados do trabalho de impressão, portanto, o método getStatus é usado para obter o status não solicitado do dispositivo, usando apenas o canal de leitura. Mas se o dispositivo der suporte a uma interface USB secundária, a função do método requestStatus será usada para obter o status de uma impressora enquanto o dispositivo estiver imprimindo.

No Windows 8.1, o modelo de driver v4 foi estendido para fornecer suporte para dispositivos baseados em host. Além disso, o USBMon foi atualizado para permitir que os IHVs usem o código JavaScript para obter melhor controle do caminho de impressão e executar ações baseadas em trabalho de impressão. A atualização inclui a adição de APIs que fornecem novos pontos de entrada Bidi JavaScript. Essas APIs estão alinhadas com as funções existentes no USBMon.

startPrintJob. Essa nova função se alinha com startDocPort em USBMon. À medida que cada novo trabalho de impressão USB é iniciado em uma porta conectada a um dispositivo de impressão baseado em host, o USBMon chamará o JavaScript fornecido pelo IHV para permitir que ele faça qualquer processamento pré-trabalho necessário. Isso pode incluir a configuração de propriedades globais do trabalho no Recipiente de Propriedades do Trabalho, consultar o dispositivo para obter o status atual e os dados de configuração ou nada. As tarefas concluídas dependem completamente do dispositivo e do IHV.

writePrintData. Essa nova função se alinha com writePort em USBMon. Quando o USBMon recebe cada chamada de função writePort do spooler durante o ato de impressão, os dados de impressão fornecidos precisam ser enviados para o dispositivo baseado em host por meio da função JavaScript IHV. Isso permite que o JS IHV decida o que deve ser enviado ao dispositivo neste momento. O IHV pode remover, adicionar ou salvar partes do buffer de dados conforme necessário. Isso permite que o IHV controle completamente o que é enviado para o dispositivo quando. Isso ajudará a habilitar cenários como duplex manual, dando ao IHV a chance de salvar (dentro de um dos fluxos persistentes) dados para as páginas pares do trabalho de impressão para processamento depois que todos os dados forem recebidos do spooler. O IHV também pode usar o objeto printerBidiSchemaResponses para retornar o status do trabalho de impressão ou o status do dispositivo durante o processamento do trabalho.

endPrintJob. Essa nova função se alinha com endDocPort em USBMon. Quando USBMon recebe a chamada endDocPort para cada trabalho de impressão USB em uma porta conectada a um dispositivo de impressão baseado em host, o USBMon chamará o JavaScript fornecido pelo IHV para permitir que ele faça qualquer processamento pós-trabalho necessário. Isso pode incluir o envio de dados retidos para o dispositivo, o retorno de valores de Esquema Bidi para iniciar o duplex manual ou qualquer outra coisa que o IHV/dispositivo exija.

O diagrama a seguir fornece uma visão geral da arquitetura de extensão USB Bidi, mostrando o cenário em que o método getStatus é usado para obter o status não solicitado do dispositivo por meio da interface USBPrint.

Arquitetura do extensor USB BIDI com o método getstatus.

Para obter mais informações sobre como trabalhar com uma impressora USB, consulte Impressão USB.

Referência da API do extensor USB Bidi

O código JavaScript no extensor USB Bidi usa as seguintes funções para se comunicar com o dispositivo de impressão:

  • getSchemas

  • setSchema

  • getStatus

  • requestStatus

  • startPrintJob

  • writePrintData

  • endPrintJob

Para obter mais informações sobre essas APIs, consulte Referência da API JavaScript.

Esquema XML da extensão USBMon Bidi

O arquivo de extensão bidi USBMon usa a mesma estrutura básica que o arquivo de extensão bidi SNMP e o arquivo de extensão bidi WSDMon. O arquivo de esquema XML é publicado no Windows Driver Kit e os arquivos de extensão USBMon Bidi serão validados automaticamente por esquema durante o teste INFGate WHCK. Ao desenvolver um esquema de extensão bidi e trabalhar com o barramento USB, é importante observar as seguintes informações:

  • Os valores podem especificar um accessType de Get, Set ou GetSet. Isso indica onde o elemento de esquema descrito tem suporte nos tipos de operação Bidi Get ou Set.

  • Os valores podem especificar uma queryKey. Isso deve ser usado para denotar as operações físicas usadas para obter dados do seu dispositivo. Todas as propriedades sob a mesma queryKey devem ser recuperáveis em uma operação de leitura/gravação USB.

  • Os valores bidi serão sondados imediatamente se forem solicitados em uma chamada à API bidi. O valor refreshInterval é o valor inicial que indica quando sondar o dispositivo em busca de atualizações em um determinado valor de esquema bidi. Após cada sondagem, o refreshInterval aumenta até pararmos a sondagem. A fórmula a seguir mostra como refreshInterval é incrementado:

    currentRefreshInterval = refreshInterval * (3 * numPolls);
    

Interação de arquivo de extensão USBMon e USB Bidi

À medida que cada nova porta USB é criada ou aberta, o USBMon determinará se o dispositivo conectado e o driver associado incluem um novo arquivo de extensão bidi e um arquivo JavaScript de extensão bidi. O USBMon pesquisa o manifesto do driver v4 ou o arquivo INI do driver e recupera o nome dos arquivos. Se o USBMon encontrar os arquivos relevantes, ele os usará para determinar a lista de valores estendidos do Esquema Bidi compatíveis com esse dispositivo e, em seguida, se comunicar com o dispositivo para consultar seus valores. Neste ponto, o USBMon dá suporte às ações de Esquema Bidi especificadas pelo IHV por meio de APIs de Spooler de Impressão existentes.

Amostras de driver do Windows no GitHub

Amostra de arquivo XML bidi USBMon - fornece um exemplo de um arquivo XML de extensão bidi USBMon. Ele usa as propriedades de esquema Bidi padrão DeviceInfo, Configuration e Memory e também define algumas extensões personalizadas.

E para obter mais informações sobre arquivos de extensão bidi, consulte Esquema de comunicação bidirecional.

Amostra de arquivo JavaScript USBMon Bidi. Este exemplo inclui um arquivo JavaScript do USBMon Bidi Extender. Ele demonstra como dar suporte a operações SET e GET Bidi, bem como ouvir eventos enquanto a impressora está imprimindo.

Depuração

A depuração interativa pode ser habilitada criando a seguinte chave do Registro. Para JavaScript USB Bidi, o spooler de impressão deve ser reiniciado antes que a depuração seja habilitada.

Nome da chave: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

Nome do valor: EnableJavaScriptDebugging

Tipo: DWORD

Valor: 1

Depois que a chave do Registro mostrada na seção anterior for criada e o processo de hospedagem for reiniciado, o script poderá ser depurado da seguinte maneira:

  1. Anexe seu depurador ao processo de host. Para JavaScript Bidi USB, isso é spoolsv.exe.

  2. Defina o depurador para o modo de depuração de script.

  3. Selecione Interromper tudo (Ctrl + Alt + Interromper) para interromper o processo na próxima vez que um script for executado.

  4. Execute o cenário para reproduzir seu problema.

  5. Depois que o depurador entrar em uma função JavaScript, defina todos os pontos de interrupção necessários e percorra o código.

Esquema de comunicação bidirecional

IPrinterBidiSchemaElement

IPrinterScriptContext

IPrinterScriptableSequentialStream

Referência do API do JavaScript

Impressão USB

Conectividade do driver de impressora V4