Partager via


USB Bidi Extender

Important

La plateforme d’impression moderne est le moyen privilégié de Windows pour communiquer avec les imprimantes. Nous vous recommandons d’utiliser le pilote de classe IPP en boîte de Microsoft, ainsi que les applications de support d’impression (PSA), pour personnaliser l’expérience d’impression dans Windows 10 et 11 pour le développement de périphériques d’impression.

Pour plus d’informations, veuillez consulter la section Plateforme d’impression moderne et le Guide de conception des applications de support d’impression.

Windows permet aux fabricants de prendre en charge la communication bidirectionnelle (Bidi) pour les appareils USB en utilisant une combinaison d'un fichier XML Bidi et d'un fichier Javascript connu sous le nom de USB Bidi extender.

L'extenseur USB Bidi permet aux applications d'utiliser Bidi avec USB comme mécanisme de transport. L'implémentation Javascript ne prend pas en charge le contrôle de flux des appareils, ni le multiplexage des informations de contrôle avec les travaux d'impression pendant l'impression.

Par défaut, les requêtes Bidi et les requêtes d'état sont acheminées via l'interface de l'appareil USB utilisé pour l'impression. Cela permet une communication bidirectionnelle complète pour l'état à l'aide de la méthode JavaScript getSchemas, ainsi que des opérations Set à l'aide de la méthode JavaScript setSchema. Une communication bidirectionnelle complète est possible tant qu'aucun travail d'impression n'est envoyé à l'appareil d'impression.

Pendant l'impression, les écritures sont bloquées par les données du travail d'impression, de sorte que la méthode getStatus est utilisée pour obtenir l'état non sollicité de l'appareil, en utilisant uniquement la chaîne de lecture. Mais si l'appareil prend en charge une interface USB secondaire, la fonction de la méthode requestStatus est utilisée pour obtenir l'état d'une imprimante pendant que l'appareil est en train d'imprimer.

Dans Windows 8.1, le modèle de pilote v4 a été étendu pour assurer la prise en charge des appareils basés sur l'hôte. En outre, USBMon a été mis à jour pour permettre aux IHV d'utiliser du code JavaScript afin de mieux contrôler le chemin d'impression et d'effectuer des actions basées sur les travaux d'impression. La mise à jour comprend l'ajout d'API qui fournissent de nouveaux points d'entrée JavaScript Bidi. Ces API sont alignées sur les fonctions existantes d'USBMon.

startPrintJob. Cette nouvelle fonction s'aligne sur startDocPort dans USBMon. Lorsque chaque nouvelle tâche d'impression USB est lancée sur un port connecté à un appareil d'impression basé sur l'hôte, USBMon appelle le JavaScript fourni par l'IHV pour lui permettre d'effectuer tous les traitements préalables nécessaires. Il peut s'agir de définir les propriétés globales du travail dans le sac de propriétés du travail, d'interroger l'appareil pour connaître son état actuel et ses données de configuration, ou de rien du tout. Les tâches effectuées dépendent entièrement de l'appareil et de l'IHV.

writePrintData. Cette nouvelle fonction s'aligne sur writePort dans USBMon. Lorsque USBMon reçoit chaque appel à la fonction writePort du spouleur pendant l'impression, les données d'impression fournies doivent être envoyées à l'appareil basé sur l'hôte via la fonction JavaScript de l'IHV. Cela permet à la fonction JavaScript IHV de décider ce qui doit être envoyé à l'appareil à ce moment-là. L'IHV peut supprimer, ajouter ou sauvegarder des parties du tampon de données en fonction des besoins. Il peut ainsi contrôler entièrement ce qui est envoyé à l'appareil et à quel moment. Cela permet de réaliser des scénarios tels que le recto-verso manuel en donnant à l'IHV la possibilité de sauvegarder (dans l'un des flux persistants) les données pour les pages paires du travail d'impression afin de les traiter une fois que toutes les données ont été reçues du spouleur. L'IHV peut également utiliser l'objet printerBidiSchemaResponses pour renvoyer l'état de la tâche d'impression ou l'état de l'appareil pendant le traitement de la tâche.

endPrintJob. Cette nouvelle fonction s'aligne sur endDocPort dans USBMon. Lorsque USBMon reçoit l'appel endDocPort pour chaque travail d'impression USB sur un port connecté à un appareil d'impression basé sur l'hôte, USBMon appelle le JavaScript fourni par l'IHV pour lui permettre d'effectuer tous les traitements post-travail dont il a besoin. Il peut s'agir d'envoyer les données conservées à l'appareil, de renvoyer les valeurs du schéma Bidi pour lancer le recto-verso manuel ou tout autre élément requis par l'IHV/l'appareil.

Le diagramme suivant donne un aperçu de l'architecture de l'extension USB Bidi, montrant le scénario dans lequel la méthode getStatus est utilisée pour obtenir l'état non sollicité de l'appareil via l'interface USBPrint.

Architecture d'un prolongateur USB Bidi avec la méthode getstatus.

Pour plus d'informations sur l'utilisation d'une imprimante USB, voir Impression USB.

Référence de l'API de l'USB Bidi extender

Le code JavaScript de l'extension USB Bidi utilise les fonctions suivantes pour communiquer avec l'appareil d'impression :

  • getSchemas

  • setSchema

  • getStatus

  • requestStatus

  • startPrintJob

  • writePrintData

  • endPrintJob

Pour plus d'informations sur ces API, consultez la référence API JavaScript.

Schéma XML de l'extension USBMon Bidi

Le fichier d'extension USBMon Bidi utilise la même structure de base que le fichier d'extension SNMP Bidi et le fichier d'extension WSDMon Bidi. Le fichier de schéma XML est publié dans le kit de pilote Windows et les fichiers d'extension USBMon Bidi seront automatiquement validés par le schéma lors du test INFGate WHCK. Lorsque vous développez un schéma d'extension Bidi et que vous travaillez avec le bus USB, il est important de noter les informations suivantes :

  • Les valeurs peuvent spécifier un accessType de type Get, Set ou GetSet. Cela indique où l'élément de schéma décrit est pris en charge dans les types d'opération Get ou Set de Bidi.

  • Les valeurs peuvent spécifier une queryKey. Celle-ci doit être utilisée pour indiquer les opérations physiques utilisées pour obtenir des données de votre appareil. Toutes les propriétés sous la même queryKey doivent pouvoir être récupérées en une seule opération de lecture/écriture USB.

  • Les valeurs Bidi sont immédiatement interrogées si elles font l'objet d'une requête de l'API Bidi. La valeur refreshInterval est la valeur initiale qui indique quand interroger l'appareil pour obtenir des mises à jour d'une valeur particulière du schéma Bidi. Après chaque interrogation, la valeur refreshInterval augmente jusqu'à l'arrêt de l'interrogation. La formule suivante montre comment la valeur refreshInterval est incrémentée :

    currentRefreshInterval = refreshInterval * (3 * numPolls);
    

Interaction entre USBMon et le fichier d'extension USB Bidi

Lors de la création ou de l'ouverture de chaque nouveau port USB, USBMon détermine si l'appareil connecté et le pilote associé incluent un nouveau fichier d'extension Bidi et un fichier JavaScript d'extension Bidi. USBMon recherche le manifeste du pilote v4 ou le fichier INI du pilote et récupère le nom des fichiers. Si USBMon trouve les fichiers pertinents, il les utilise pour déterminer la liste des valeurs Bidi Schema étendues prises en charge par cet appareil, puis communique avec l'appareil pour interroger leurs valeurs. À ce stade, USBMon prend en charge les actions Bidi Schema spécifiées par l'IHV par l'intermédiaire des API Print Spooler existantes.

Exemples de pilotes Windows sur GitHub

USBMon Bidi XML File Sample - ce fichier fournit un exemple de fichier XML de l'extension USBMon Bidi. Il utilise les propriétés standard du schéma Bidi DeviceInfo, Configuration et Memory et définit également quelques extensions personnalisées.

Pour plus d'informations sur les fichiers d'extension Bidi, voir Schéma de communication bidirectionnelle.

Exemple de fichier JavaScript USBMon Bidi. Cet exemple inclut un fichier JavaScript USBMon Bidi Extender. Il montre comment prendre en charge les opérations Bidi SET et GET, ainsi que comment écouter les événements pendant que l'imprimante imprime.

Débogage

Le débogage interactif peut être activé en créant la clé de registre suivante. Pour le JavaScript Bidi USB, le spouleur d'impression doit être redémarré avant que le débogage ne soit activé.

Nom de la clé : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

Nom de la valeur : EnableJavaScriptDebugging

Type : DWORD

Valeur : 1

Une fois que la clé de registre indiquée dans la section précédente est créée et que le processus d'hébergement a été redémarré, le script peut être débogué comme suit :

  1. Attachez votre débogueur au processus d'hébergement. Pour USB Bidi JavaScript, il s'agit de spoolsv.exe.

  2. Mettez le débogueur en mode de débogage de script.

  3. Sélectionnez Tout mettre en pause (Ctrl + Alt + Pause) pour interrompre le processus lors de la prochaine exécution d'un script.

  4. Exécutez le scénario pour reproduire votre problème.

  5. Une fois que le débogueur est entré dans une fonction JavaScript, définissez les points d'arrêt nécessaires et parcourez le code.

Schéma de communication bidirectionnelle

IPrinterBidiSchemaElement

IPrinterScriptContext

IPrinterScriptableSequentialStream

Référence API JavaScript

Impression USB

Connectivité du pilote d'imprimante V4