USB Bidi Extender
Wichtig
Die Modern Print-Plattform ist die von Windows bevorzugte Methode zur Kommunikation mit Druckern. Wir empfehlen die Verwendung des Microsoft IPP-Treibers für die Posteingangsklasse zusammen mit Print Support Apps (PSA), um das Druckverhalten in Windows 10 und 11 für die Entwicklung von Druckergeräten anzupassen.
Weitere Informationen finden Sie unter Modern Print-Plattform und der Anleitung zum Design der Print-Support-App.
Mit Windows können Hersteller bidirektionale Kommunikation (Bidi) für USB-Geräte mithilfe einer Kombination aus einer Bidi-XML-Datei und einer Javascript-Datei unterstützen, die als USB Bidi Extender bezeichnet wird.
Der USB Bidi Extender ermöglicht Anwendungen die Verwendung von Bidi mit USB als Transportmechanismus. Die Javascript-Implementierung unterstützt keine Geräteflusssteuerung oder ein Multiplexing von Steuerelementinformationen mit Druckaufträgen während des Druckens.
Bidi-Abfragen und Statusanforderungen werden standardmäßig über die USB-Geräteschnittstelle weitergeleitet, die zum Drucken verwendet wird. Dies ermöglicht die vollständige bidirektionale Kommunikation für den Status mithilfe der getSchemas JavaScript-Methode sowie das Zulassen von Set-Vorgängen mithilfe der setSchema-JavaScript-Methode. Eine vollständige bidirektionale Kommunikation ist möglich, während keine Druckaufträge an das Druckgerät gesendet werden.
Während des Druckens werden Schreibvorgänge durch die Daten des Druckauftrags blockiert, sodass die getStatus-Methode verwendet wird, um nicht angeforderten Status vom Gerät abzurufen, wobei nur der Lesekanal verwendet wird. Wenn das Gerät jedoch eine sekundäre USB-Schnittstelle unterstützt, wird die RequestStatus-Methodenfunktion verwendet, um den Status eines Druckers abzurufen, während das Gerät druckt.
In Windows 8.1 wurde das v4-Treibermodell erweitert, um Unterstützung für hostbasierte Geräte bereitzustellen. Darüber hinaus wurde USBMon aktualisiert, um IHVs die Verwendung von JavaScript-Code zu ermöglichen, um eine bessere Kontrolle über den Druckpfad zu erhalten und druckauftragsbasierte Aktionen auszuführen. Das Update enthält das Hinzufügen von APIs, die neue Bidi JavaScript-Einstiegspunkte bereitstellen. Diese APIs werden an vorhandenen Funktionen in USBMon ausgerichtet.
startPrintJob. Diese neue Funktion richtet sich an startDocPort in USBMon. Da jeder neue USB-Druckauftrag auf einem Port gestartet wird, der an ein hostbasiertes Druckgerät angeschlossen ist, ruft USBMon den von IHV bereitgestellten JavaScript auf, damit er alle benötigten Vorauftragsverarbeitungen ausführen kann. Dies kann das Festlegen von globalen Auftragseigenschaften im Auftragseigenschaftenbehälter, das Abfragen des Geräts nach aktuellen Status- und Konfigurationsdaten oder keine Aktion umfassen. Die abgeschlossenen Aufgaben sind vollständig vom Gerät und dem IHV abhängig.
writePrintData. Diese neue Funktion richtet sich an writePort in USBMon. Wenn USBMon während des Druckvorgangs jeden writePort-Funktionsaufruf vom Spooler empfängt, müssen die bereitgestellten Druckdaten über die IHV-JavaScript-Funktion an das hostbasierte Gerät gesendet werden. Auf diese Weise kann die IHV JS entscheiden, was derzeit an das Gerät gesendet werden soll. Der IHV kann teile des Datenpuffers nach Bedarf entfernen, hinzufügen oder speichern. Auf diese Weise kann der IHV steuern, was an das Gerät gesendet wird und wann. Dies wird dazu beitragen, solche Szenarien wie manuelles Duplex zu ermöglichen, indem der IHV die Möglichkeit bietet, Daten (innerhalb eines der persistenten Datenströme) für die geraden Seiten des Druckauftrags für die Verarbeitung zu speichern, sobald alle Daten vom Spooler empfangen wurden. Der IHV kann auch das printerBidiSchemaResponses-Objekt verwenden, um den Druckauftragsstatus oder den Gerätestatus während der Verarbeitung des Auftrags zurückzugeben.
endPrintJob. Diese neue Funktion richtet sich an endDocPort in USBMon. Wenn USBMon den endDocPort-Aufruf für jeden USB-Druckauftrag an einem Port empfängt, der mit einem hostbasierten Druckgerät verbunden ist, ruft USBMon das von IHV bereitgestellte JavaScript auf, um alle erforderlichen Nachauftragsverarbeitungen durchführen zu können. Dies kann das Senden von aufbewahrten Daten an das Gerät umfassen, wobei Bidi Schema-Werte zurückgegeben werden, um manuelle Duplex- oder andere Elemente zu starten, die vom IHV/Gerät benötigt werden.
Das folgende Diagramm bietet eine Übersicht über die USB-Bidi-Erweiterungsarchitektur mit dem Szenario, in dem die getStatus-Methode verwendet wird, um nicht angeforderten Status vom Gerät über die USBPrint-Schnittstelle abzurufen.
Weitere Informationen zum Arbeiten mit einem USB-Drucker finden Sie unter Drucken über USB.
USB Bidi Extender-API-Referenz
Der JavaScript-Code im USB Bidi Extender verwendet die folgenden Funktionen für die Kommunikation mit dem Druckgerät:
getSchemas
setSchema
getStatus
requestStatus
startPrintJob
writePrintData
endPrintJob
Weitere Informationen zu diesen APIs finden Sie unter JavaScript-API-Referenz.
XML-Schema der USBMon Bidi-Erweiterung
Die Erweiterungsdatei USBMon Bidi verwendet die gleiche grundlegende Struktur wie die SNMP Bidi Extension Datei und die WSDMon Bidi-Erweiterungsdatei. Die XML-Schemadatei wird im Windows Driver Kit veröffentlicht und USBMon Bidi-Erweiterungsdateien werden während des INFGate WHCK-Tests automatisch schemageprüft. Wenn Sie ein Bidi-Erweiterungsschema entwickeln und mit dem USB-Bus arbeiten, ist es wichtig, die folgenden Informationen zu beachten:
Werte können einen accessType von "Get", "Set" oder "GetSet" angeben. Dies gibt an, wo das beschriebene Schemaelement in den Bidi Get- oder Set-Vorgangstypen unterstützt wird.
Werte können einen queryKey angeben. Dies sollte verwendet werden, um die physischen Vorgänge anzugeben, die zum Abrufen von Daten von Ihrem Gerät verwendet werden. Alle Eigenschaften unter demselben queryKey sollten in einem USB-Lese-/Schreibvorgang abgerufen werden können.
Bidi-Werte werden sofort abgefragt, wenn sie in einem Bidi API-Aufruf angefordert werden. Der refreshInterval-Wert ist der Anfangswert, der angibt, wann das Gerät nach Updates für einen bestimmten Bidi-Schemawert abgerufen werden soll. Nach jeder Abfrage erhöht sich die refreshInterval-Abfrage, bis wir die Abfrage beenden. Die folgende Formel zeigt, wie refreshInterval erhöht wird:
currentRefreshInterval = refreshInterval * (3 * numPolls);
Interaktion mit usbMon- und USB Bidi-Erweiterungsdateien
Da jeder neue USB-Port erstellt oder geöffnet wird, bestimmt USBMon, ob das angeschlossene Gerät und der zugehörige Treiber eine neue Bidi-Erweiterungsdatei und eine Bidi Extension JavaScriptfile enthalten. USBMon durchsucht das v4-Treibermanifest oder die INI-Treiberdatei und ruft den Namen der Dateien ab. Wenn USBMon die relevanten Dateien findet, wird sie verwendet, um die Liste der erweiterten Bidi-Schemawerte zu ermitteln, die von diesem Gerät unterstützt werden, und dann mit dem Gerät kommunizieren, um ihre Werte abzufragen. An diesem Punkt unterstützt USBMon die IHV-angegebenen Bidi-Schemaaktionen über vorhandene Druck-Spooler-APIs.
Windows-Treiberbeispiele für GitHub
USBMon Bidi XML File Sample - dies stellt ein Beispiel einer USBMon Bidi Extension XML-Datei bereit. Es verwendet die standardmäßigen Bidi-Schemaeigenschaften DeviceInfo, Configuration und Memory und definiert auch einige benutzerdefinierte Erweiterungen.
Weitere Informationen zu Bidi-Erweiterungsdateien finden Sie unter Bidirectional Communication Schema.
USBMon Bidi JavaScript-Dateibeispiel. Dieses Beispiel enthält eine USBMon Bidi Extender JavaScript-Datei. Es veranschaulicht, wie Bidi SET- und GET-Vorgänge unterstützt werden, und wie Ereignisse beim Drucken des Druckers überwacht werden.
Debuggen
Interaktives Debuggen kann durch Erstellen des folgenden Registrierungsschlüssels aktiviert werden. Für USB Bidi JavaScript muss der Druckspooler neu gestartet werden, bevor das Debuggen aktiviert wird.
Schlüsselname: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print
Wertname: EnableJavaScriptDebugging
Typ: DWORD
Wert: 1
Nachdem der im vorherigen Abschnitt gezeigte Registrierungsschlüssel erstellt wurde und der Hostingprozess neu gestartet wurde, kann das Skript wie folgt gedebuggt werden:
Fügen Sie den Debugger an den Hostprozess an. Für USB Bidi JavaScript ist dies spoolsv.exe.
Legen Sie den Debugger auf den Skriptdebuggingmodus fest.
Wählen Sie Alle unterbrechen (STRG+ALT+UMBRUCH), um den Prozess beim nächsten Ausführen eines Skripts zu unterbrechen.
Führen Sie das Szenario aus, um das Problem zu reproduzieren.
Sobald der Debugger in eine JavaScript-Funktion einbricht, legen Sie alle notwendigen Haltepunkte fest und gehen Sie den Code schrittweise durch.
Zugehörige Themen
Bidirektionales Kommunikationsschema
IPrinterScriptableSequentialStream
Referenz zum JavaScript-API für den Plastischen Reader (v1.1)