Freigeben über


USB Bidi Extender

Wichtig

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 im Print support app design guide.

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 gedruckt wird.

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 nichts 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 zurzeit 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, wenn. 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 an ein hostbasiertes Druckgerät angeschlossen ist, ruft USBMon den von IHV bereitgestellten JavaScript auf, um die Verarbeitung nach dem Auftrag zu ermöglichen. 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.

usb bidi extender architecture with getstatus method.

Weitere Informationen zum Arbeiten mit einem USB-Drucker finden Sie unter USB-Druck.

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 in der JavaScript-API-Referenz.

XML-Schema der USBMon Bidi-Erweiterung

Die DATEI USBMon Bidi Extension verwendet die gleiche Grundlegende Struktur wie die SNMP Bidi Extension Datei und die WSDMon Bidi Extension Datei. 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.

Beispiele für Windows-Treiber auf 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:

  1. Fügen Sie Den Debugger an den Hostingprozess an. Für USB Bidi JavaScript ist dies spoolsv.exe.

  2. Legen Sie den Debugger auf den Skriptdebuggingmodus fest.

  3. Wählen Sie "Alle unterbrechen" (STRG+ALT+UMBRUCH) aus, um bei der nächsten Ausführung eines Skripts in den Prozess einzubrechen.

  4. Führen Sie das Szenario aus, um Ihr Problem zu reproduzieren.

  5. Sobald der Debugger in eine JavaScript-Funktion umgebrochen ist, legen Sie alle erforderlichen Haltepunkte fest, und durchlaufen Sie den Code.

Bidirektionales Kommunikationsschema

IPrinterBidiSchemaElement

IPrinterScriptContext

IPrinterScriptableSequentialStream

JavaScript-API-Referenz

USB-Druck

V4-Druckertreiberkonnektivität