USB Bidi Extender
Importante
La piattaforma di stampa moderna è il mezzo preferito di Windows per comunicare con le stampanti. Ti consigliamo di usare il driver di classe IPP di Microsoft, insieme a Print Support Apps (PSA), per personalizzare l'esperienza di stampa in Windows 10 e 11 per lo sviluppo di dispositivi per stampanti.
Per altre informazioni, vedere Piattaforma di stampa moderna e guida alla progettazione dell'app di supporto per la stampa.
Windows consente ai produttori di supportare la comunicazione bidirezionale (Bidi) per i dispositivi USB usando una combinazione di un file XML Bidi e un file Javascript noto come extender USB Bidi.
L'extender USB Bidi consente alle applicazioni di usare Bidi con USB come meccanismo di trasporto. L'implementazione javascript non supporta alcun controllo del flusso del dispositivo o il multiplexing delle informazioni di controllo con i processi di stampa durante la stampa.
Per impostazione predefinita, le query Bidi e le richieste di stato vengono instradate sull'interfaccia del dispositivo USB usata per la stampa. Ciò consente la comunicazione bidirezionale completa per lo stato usando il metodo JavaScript getSchemas , oltre a consentire le operazioni Set usando il metodo JavaScript setSchema . La comunicazione bidirezionale completa è possibile mentre non sono presenti processi di stampa inviati al dispositivo di stampa.
Durante la stampa, le scritture vengono bloccate dai dati del processo di stampa, pertanto il metodo getStatus viene usato per ottenere lo stato non richiesto dal dispositivo, usando solo il canale di lettura. Tuttavia, se il dispositivo supporta un'interfaccia USB secondaria, la funzione del metodo requestStatus viene usata per ottenere lo stato da una stampante mentre il dispositivo sta stampando.
In Windows 8.1 il modello di driver v4 è stato esteso per fornire supporto per i dispositivi basati su host. Oltre a questo, USBMon è stato aggiornato per consentire agli IHD di usare il codice JavaScript per ottenere un migliore controllo del percorso di stampa e per eseguire azioni basate su processi di stampa. L'aggiornamento include l'aggiunta di API che forniscono nuovi punti di ingresso JavaScript Bidi. Queste API sono allineate alle funzioni esistenti in USBMon.
startPrintJob. Questa nuova funzione è allineata con startDocPort in USBMon. Quando ogni nuovo processo di stampa USB viene avviato su una porta connessa a un dispositivo di stampa basato su host USBMon chiamerà il Codice JavaScript fornito da IHV per consentire l'esecuzione di qualsiasi elaborazione pre-processo richiesta. Ciò può includere l'impostazione delle proprietà globali del processo nel contenitore delle proprietà processo, l'esecuzione di query sul dispositivo per i dati di stato e configurazione correnti o nulla. Le attività completate dipendono completamente dal dispositivo e dall'IHV.
writePrintData. Questa nuova funzione è allineata con writePort in USBMon. Quando USBMon riceve ogni chiamata di funzione writePort dallo spooler durante l'atto di stampa, i dati di stampa forniti devono essere inviati al dispositivo basato su host tramite la funzione JavaScript IHV. Ciò consente al JS IHV di decidere cosa deve essere inviato al dispositivo in questo momento. L'IHV può rimuovere, aggiungere o salvare parti del buffer di dati in base alle esigenze. In questo modo l'IHV può controllare completamente ciò che viene inviato al dispositivo quando. Ciò consentirà di abilitare tali scenari come duplex manuale offrendo all'IHV la possibilità di salvare i dati (all'interno di uno dei flussi persistenti) per le pagine pari del processo di stampa per l'elaborazione dopo che tutti i dati sono stati ricevuti dallo spooler. L'IHV può anche utilizzare l'oggetto printerBidiSchemaResponses per restituire lo stato del processo di stampa o lo stato del dispositivo durante l'elaborazione del processo.
endPrintJob. Questa nuova funzione è allineata con endDocPort in USBMon. Quando USBMon riceve la chiamata endDocPort per ogni processo di stampa USB su una porta connessa a un dispositivo di stampa basato su host USBMon chiamerà il Codice JavaScript fornito da IHV per consentirgli di eseguire qualsiasi elaborazione post-processo richiesta. Ciò può includere l'invio di dati conservati al dispositivo, la restituzione dei valori dello schema Bidi per avviare il duplex manuale o qualsiasi altro elemento richiesto dal dispositivo/IHV.
Il diagramma seguente fornisce una panoramica dell'architettura dell'estensione USB Bidi, che mostra lo scenario in cui viene usato il metodo getStatus per ottenere lo stato non richiesto dal dispositivo tramite l'interfaccia USBPrint.
Per altre informazioni sull'uso di una stampante USB, vedere Stampa USB.
Informazioni di riferimento sull'API extender USB Bidi
Il codice JavaScript nell'extender USB Bidi usa le funzioni seguenti per comunicare con il dispositivo di stampa:
getSchemas
setSchema
getStatus
requestStatus
startPrintJob
writePrintData
endPrintJob
Per altre informazioni su queste API, vedere Informazioni di riferimento sulle API JavaScript.
XML Schema dell'estensione USBMon Bidi
Il file di estensione USBMon Bidi usa la stessa struttura di base del file SNMP Bidi Extension e del file WSDMon Bidi Extension. Il file XML Schema viene pubblicato nei file di estensione Windows Driver Kit e USBMon Bidi verrà convalidato automaticamente durante il test WHCK di INFGate. Quando si sviluppa uno schema di estensione Bidi e si usa il bus USB, è importante notare le informazioni seguenti:
I valori possono specificare un accessType di Get, Set o GetSet. Indica dove l'elemento dello schema descritto è supportato nei tipi di operazione Get o Set bidi.
I valori possono specificare una queryKey. Deve essere usato per indicare le operazioni fisiche usate per ottenere dati dal dispositivo. Tutte le proprietà nella stessa queryKey devono essere recuperabili in un'unica operazione di lettura/scrittura USB.
I valori Bidi vengono immediatamente sottoposto a polling se vengono richiesti in una chiamata API Bidi. Il valore refreshInterval è il valore iniziale che indica quando eseguire il polling del dispositivo per gli aggiornamenti in un determinato valore dello schema Bidi. Dopo ogni polling, refreshInterval aumenta fino a quando non viene interrotto il polling. La formula seguente mostra come viene incrementato refreshInterval:
currentRefreshInterval = refreshInterval * (3 * numPolls);
Interazione del file di estensione USBMon e USB Bidi
Quando ogni nuova porta USB viene creata o aperta, USBMon determinerà se il dispositivo collegato e il driver associato includono un nuovo file di estensione Bidi e un JavaScriptfile dell'estensione Bidi. USBMon cerca il manifesto del driver v4 o il file INI del driver e recupera il nome dei file. Se USBMon trova i file pertinenti, li usa per determinare l'elenco dei valori dello schema Bidi estesi supportati da questo dispositivo e quindi comunicare con il dispositivo per eseguire query sui relativi valori. A questo punto USBMon supporta le azioni dello schema Bidi specificato da IHV tramite le API Spooler di stampa esistenti.
Esempi di driver windows in GitHub
Esempio di file XML USBMon Bidi: fornisce un esempio di file XML dell'estensione USBMon Bidi. Usa le proprietà standard dello schema Bidi DeviceInfo, Configuration e Memory e definisce anche alcune estensioni personalizzate.
Per altre informazioni sui file di estensione Bidi, vedere Schema di comunicazione bidirezionale.
Esempio di file JavaScript USBMon Bidi. Questo esempio include un file JavaScript USBMon Bidi Extender. Illustra come supportare le operazioni Bidi SET e GET, nonché come ascoltare gli eventi durante la stampa della stampante.
Debug
Il debug interattivo può essere abilitato creando la chiave del Registro di sistema seguente. Per USB Bidi JavaScript, è necessario riavviare lo spooler di stampa prima di abilitare il debug.
Nome chiave: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print
Nome valore: EnableJavaScriptDebugging
Tipo: DWORD
Valore: 1
Dopo la creazione della chiave del Registro di sistema illustrata nella sezione precedente e il processo di hosting è stato riavviato, è possibile eseguire il debug dello script come segue:
Collegare il debugger al processo di hosting. Per USB Bidi JavaScript, questo è spoolsv.exe.
Impostare il debugger sulla modalità di debug degli script.
Selezionare Interrompi tutto (CTRL+ALT+INTERR) per interrompere il processo alla successiva esecuzione di uno script.
Eseguire lo scenario per riprodurre il problema.
Dopo l'interruzione del debugger in una funzione JavaScript, impostare i punti di interruzione necessari ed eseguire il codice.
Argomenti correlati
Schema di comunicazione bidirezionale
IPrinterScriptableSequentialStream