USB Bidi Extender

Belangrijk

Het moderne afdrukplatform is de voorkeursmiddel van Windows om te communiceren met printers. Het wordt aanbevolen om de IPP-inboxklasse-driver van Microsoft te gebruiken, samen met Print Support Apps (PSA), om de afdrukervaring in Windows 10 en 11 aan te passen voor de ontwikkeling van printerapparaten.

Zie de ontwerphandleiding voor Print Support App v1 en v2 voor meer informatie.

Met Windows kunnen fabrikanten bidirectionele communicatie (Bidi) voor USB-apparaten ondersteunen met behulp van een combinatie van een Bidi XML-bestand en een JavaScript-bestand dat bekend staat als een USB Bidi-extender.

Met de USB Bidi extender kunnen toepassingen Bidi gebruiken met USB als transportmechanisme. De JavaScript-implementatie biedt geen ondersteuning voor apparaatstroombeheer of multiplexing van controlegegevens met afdruktaken tijdens het afdrukken.

Standaard worden Bidi-query's en statusaanvragen gerouteerd via de USB-apparaatinterface die voor het afdrukken wordt gebruikt. Hierdoor is volledige bidirectionele communicatie mogelijk voor status met behulp van de getSchemas JavaScript-methode, evenals het toestaan van Set-bewerkingen met behulp van de setSchema JavaScript-methode. Volledige bidirectionele communicatie is mogelijk terwijl er geen afdruktaken naar het afdrukapparaat worden verzonden.

Tijdens het afdrukken worden schrijfbewerkingen geblokkeerd door de gegevens van de afdruktaak, zodat de methode getStatus wordt gebruikt om ongevraagde status van het apparaat te verkrijgen, waarbij alleen het leeskanaal wordt gebruikt. Maar als het apparaat een secundaire USB-interface ondersteunt, wordt de methodefunctie requestStatus gebruikt om de status van een printer te verkrijgen terwijl het apparaat wordt afgedrukt.

In Windows 8.1 is het v4-stuurprogrammamodel uitgebreid om ondersteuning te bieden voor hostapparaten. Daarnaast is USBMon bijgewerkt, zodat IHD's JavaScript-code kunnen gebruiken om beter beheer te krijgen over het afdrukpad en om acties op basis van afdruktaken uit te voeren. De update bevat de toevoeging van API's die nieuwe Bidi JavaScript-toegangspunten bieden. Deze API's zijn afgestemd op bestaande functies in USBMon.

startAfdruktaak. Deze nieuwe functie is afgestemd op startDocPort in USBMon. Wanneer op een poort, die is verbonden met een Host-Based-printapparaat, een nieuwe USB-afdruktaak wordt gestart, roept USBMon de JavaScript aan die door IHV is geleverd om de benodigde pre-jobverwerking uit te voeren. Het kan bestaan uit het instellen van globale taakeigenschappen in de Job Property Bag, het uitvoeren van query's op het apparaat voor de huidige status en configuratiegegevens, of niets. De voltooide taken zijn volledig afhankelijk van het apparaat en IHV.

writePrintData-. Deze nieuwe functie is afgestemd op writePort in USBMon. Wanneer USBMon elke writePort-functie-aanroep van de spooler ontvangt tijdens het afdrukken, moeten de opgegeven afdrukgegevens worden verzonden naar het hostapparaat via de IHV JavaScript-functie. Hierdoor kan de IHV JS bepalen wat op dit moment naar het apparaat moet worden verzonden. De IHV kan indien nodig delen van de gegevensbuffer verwijderen, toevoegen of opslaan. Hierdoor kan de IHV volledig bepalen wat er naar het apparaat wordt verzonden wanneer. Dit helpt bij het realiseren van scenario's zoals handmatige duplex door de IHV een kans te geven om gegevens op te slaan (binnen een van de permanente streams) van de even pagina's van de afdruktaak voor verdere verwerking zodra alle gegevens van de spooler zijn ontvangen. De IHV kan ook het object printerBidiSchemaResponses gebruiken om de status van de afdruktaak of apparaatstatus te retourneren tijdens de verwerking van de taak.

eindigPrintJob. Deze nieuwe functie wordt uitgelijnd met endDocPort in USBMon. Wanneer USBMon de endDocPort-aanroep ontvangt voor elke USB-afdruktaak op een poort die is verbonden met een Host-Based printapparaat, roept USBMon de door IHV geleverde JavaScript aan, zodat deze elke naverwerking kan uitvoeren die nodig is. Dit kan omvatten het verzenden van bewaarde gegevens naar het apparaat, het retourneren van Bidi-schemawaarden om het handmatig dubbelzijdig afdrukken te starten, of andere vereisten van het IHV/apparaat.

Het volgende diagram bevat een overzicht van de USB Bidi-extensiearchitectuur, waarin het scenario wordt weergegeven waarin de methode getStatus wordt gebruikt om ongevraagde status van het apparaat te verkrijgen via de USBPrint-interface.

usb bidi extender architectuur met getstatus methode.

Zie USB-afdrukvoor meer informatie over het werken met een USB-printer.

USB Bidi extender-API-referentie

De JavaScript-code in de USB Bidi extender gebruikt de volgende functies voor de communicatie met het afdrukapparaat:

  • getSchema's

  • setSchema

  • getStatus

  • aanvraagStatus

  • startPrintJob

  • writePrintData-

  • endPrintJob

Zie JavaScript API Referencevoor meer informatie over deze API's.

XML-schema voor USBMon Bidi-extensie

Het USBMon Bidi-extensiebestand maakt gebruik van dezelfde basisstructuur als het SNMP Bidi-extensiebestand en het WSDMon Bidi-extensiebestand. Het XML-schemabestand wordt gepubliceerd in de Windows Driver Kit en USBMon Bidi-extensiebestanden worden automatisch schemavalideerd tijdens de INFGate WHCK-test. Wanneer u een Bidi-extensieschema ontwikkelt en met de USB-bus werkt, is het belangrijk om de volgende informatie te noteren:

  • Waarden kunnen een accessType van Get, Set of GetSet opgeven. Dit geeft aan waar het beschreven schema-element wordt ondersteund in de bewerkingstypen Bidi Get of Set.

  • Waarden kunnen een queryKey opgeven. Dit moet worden gebruikt om de fysieke bewerkingen aan te geven die worden gebruikt om gegevens van uw apparaat te verkrijgen. Alle eigenschappen onder dezelfde queryKey moeten worden opgehaald in één USB-lees-/schrijfbewerking.

  • Bidi-waarden worden onmiddellijk gepeild als ze worden aangevraagd in een Bidi-API-aanroep. De waarde van refreshInterval is de oorspronkelijke waarde die aangeeft wanneer het apparaat moet worden gepolst voor updates van een specifieke Bidi-schemawaarde. Na elke poll neemt de refreshInterval toe totdat we stoppen met pollen. In de volgende formule ziet u hoe refreshInterval wordt verhoogd:

    currentRefreshInterval = refreshInterval * (3 * numPolls);
    

Interactie tussen USBMon- en USB Bidi-extensiebestand

Wanneer elke nieuwe USB-poort wordt gemaakt of geopend, bepaalt USBMon of het gekoppelde apparaat en het bijbehorende stuurprogramma een nieuw Bidi-extensiebestand en een JavaScript-bestand met de Bidi-extensie bevatten. USBMon doorzoekt het v4-stuurprogrammamanifest of het INI-stuurprogrammabestand en haalt de naam van de bestanden op. Als USBMon de relevante bestanden vindt, worden deze gebruikt om de lijst met uitgebreide Bidi-schemawaarden te bepalen die door dit apparaat worden ondersteund en vervolgens met het apparaat te communiceren om hun waarden op te vragen. Op dit moment ondersteunt USBMon de door IHV opgegeven Bidi-schemaacties via bestaande Print Spooler-API's.

Voorbeelden van Windows-stuurprogramma's op GitHub

USBMon Bidi XML File Sample - dit biedt een voorbeeld van een USBMon Bidi Extension XML-bestand. Het maakt gebruik van de standaard Bidi-schema-eigenschappen DeviceInfo, Configuratie en Geheugen en definieert ook enkele aangepaste extensies.

Voor meer informatie over Bidi-extensiebestanden, zie Bidirectionele Communicatieschema.

USBMon Bidi JavaScript-bestandvoorbeeld. Dit voorbeeld bevat een USBMon Bidi Extender JavaScript-bestand. Het laat zien hoe u Bidi SET- en GET-bewerkingen ondersteunt, en hoe u kunt luisteren naar gebeurtenissen terwijl de printer afdrukt.

Foutopsporing

Interactieve foutopsporing kan worden ingeschakeld door de volgende registersleutel te maken. Voor USB Bidi JavaScript moet de afdrukspooler opnieuw worden opgestart voordat foutopsporing wordt ingeschakeld.

sleutelnaam: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

Waardenaam: EnableJavaScriptDebugging

Type: DWORD

waarde: 1

Nadat de registersleutel in de vorige sectie is gemaakt en het hostingproces opnieuw is gestart, kan het script als volgt worden opgespoord:

  1. Koppel uw foutopsporingsprogramma aan het hostingproces. Voor USB Bidi JavaScript geldt: dit is spoolsv.exe.

  2. Stel het foutopsporingsprogramma in op de foutopsporingsmodus voor scripts.

  3. Selecteer Alles onderbreken (Ctrl + Alt + Break) om de volgende keer dat een script wordt uitgevoerd in het proces in te breken.

  4. Voer het scenario uit om uw probleem te reproduceren.

  5. Zodra het foutopsporingsprogramma is opgesplitst in een JavaScript-functie, stelt u eventuele benodigde onderbrekingspunten in en doorloopt u de code.

Bidirectioneel communicatieschema

IPrinterBidiSchemaElement

IPrinterScriptContext-

IPrinterScriptableSequentialStream

JavaScript API-referentie

USB-afdruk

V4-printerstuurprogrammaconnectiviteit