Поделиться через


Расширитель USB-байди

Внимание

Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.

Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.

Windows позволяет производителям поддерживать двунаправленную связь (Bidi) для USB-устройств с помощью сочетания XML-файла Bidi и javascript-файла, известного как расширение USB Bidi.

Расширение USB Bidi позволяет приложениям использовать Bidi с USB в качестве механизма транспорта. Реализация Javascript не поддерживает управление потоком устройств или мультиплексирование сведений об элементе управления с заданиями печати во время печати.

По умолчанию запросы Bidi и запросы состояния направляются через USB-интерфейс устройства, используемый для печати. Это обеспечивает полную двунаправленную связь для состояния с помощью метода GetSchemas JavaScript, а также разрешает операции Set с помощью метода setSchema JavaScript. Полная двунаправленная связь возможна, пока на устройство печати не отправляются задания печати.

Во время печати записи блокируются данными задания печати, поэтому метод getStatus используется для получения незапрошенного состояния с устройства, используя только канал чтения. Но если устройство поддерживает дополнительный USB-интерфейс, функция метода requestStatus используется для получения состояния от принтера во время печати устройства.

В Windows 8.1 модель драйвера версии 4 была расширена, чтобы обеспечить поддержку устройств на основе узлов. Помимо этого, USBMon был обновлен, чтобы позволить IHV использовать код JavaScript для повышения контроля пути печати и выполнения действий на основе заданий. Это обновление включает в себя добавление API,которые предоставляют новые точки входа в Bidi JavaScript. Эти API соответствуют существующим функциям в USBMon.

startPrintJob. Эта новая функция соответствует startDocPort в USBMon. При запуске каждого нового задания печати USB на порту, подключенном к USB-устройству печати на основе узла, usbMon вызовет предоставленный JavaScript IHV, чтобы позволить ему выполнять любую обработку предварительного задания, которую требуется. Это может включать задание глобальных свойств в контейнере свойств задания, запрашивая устройство для текущего состояния и данных конфигурации или ничего. Выполненные задачи полностью зависят от устройства и IHV.

writePrintData. Эта новая функция соответствует функции записи в USBMon. Когда USBMon получает каждый вызов функции writePort из spooler во время печати, предоставленные данные печати должны отправляться на устройство на основе узла через функцию JavaScript IHV. Это позволяет IHV JS решить, что следует отправлять на устройство в настоящее время. IHV может удалять, добавлять или сохранять части буфера данных по мере необходимости. Это позволяет IHV полностью контролировать то, что отправляется на устройство. Это поможет включить такие сценарии, как ручной дуплекс, предоставив IHV возможность сохранить данные (в одном из постоянных потоков) для даже страниц задания печати для обработки после получения всех данных от spooler. IHV также может использовать объект printerBidiSchemaResponses для возврата состояния задания печати или состояния устройства во время обработки задания.

endPrintJob. Эта новая функция соответствует endDocPort в USBMon. Когда USBMon получает вызов endDocPort для каждого задания печати USB на порту, подключенном к USB-устройству печати на основе узла USBMon, вызовет IHV предоставленный JavaScript, чтобы разрешить ему выполнять любую обработку после задания. Это может включать отправку любых сохраненных данных на устройство, возвращая значения схемы Bidi, чтобы запустить ручной дуплекс или что-либо другое, что требуется IHV/device.

На следующей схеме представлен обзор архитектуры расширения USB Bidi, в котором показан сценарий , в котором метод getStatus используется для получения незапрошенного состояния с устройства с помощью интерфейса USBPrint.

Архитектура расширения usb bidi с методом getstatus.

Дополнительные сведения о работе с USB-принтером см. в статье "Печать USB".

Справочник по API расширения USB Bidi

Код JavaScript в расширении USB-байди использует следующие функции для взаимодействия с устройством печати:

  • getSchemas

  • setSchema

  • getStatus

  • requestStatus

  • startPrintJob

  • writePrintData

  • endPrintJob

Дополнительные сведения об этих API см. в справочнике по API JavaScript.

XML-схема расширения USBMon Bidi

Файл расширения USBMon Bidi использует ту же базовую структуру, что и файл расширения SNMP Bidi и файл расширения WSDMon Bidi. XML-файл схемы публикуется в пакете драйверов Windows и файлах расширения USBMon Bidi автоматически проверяется во время теста INFGate WHCK. При разработке схемы расширения Bidi и работе с USB-шиной важно отметить следующие сведения:

  • Значения могут указывать тип доступа Get, Set или GetSet. Это указывает, где описанный элемент схемы поддерживается в типах операций Bidi Get или Set.

  • Значения могут указывать queryKey. Это следует использовать для обозначения физических операций, используемых для получения данных с устройства. Все свойства под одним ключом запроса должны быть извлечены в одной операции чтения и записи USB.

  • Значения Bidi немедленно опрашиваются, если они запрашиваются в вызове API Bidi. Значение refreshInterval — это начальное значение, указывающее, когда опрашивать устройство для обновления определенного значения схемы Bidi. После каждого опроса обновлениеInterval увеличивается до тех пор, пока не прекратится опрос. В следующей формуле показано, как обновляетсяInterval:

    currentRefreshInterval = refreshInterval * (3 * numPolls);
    

Взаимодействие с файлом расширения USBMon и USB Bidi

При создании или открытии каждого нового USB-порта USBMon определяет, включает ли подключенное устройство и связанный драйвер новый файл расширения Bidi и JavaScriptfile расширения Bidi. USBMon выполняет поиск манифеста драйвера версии 4 или файла INI драйвера и извлекает имя файлов. Если USBMon находит соответствующие файлы, он использует их для определения списка расширенных значений схемы Bidi, поддерживаемых этим устройством, а затем взаимодействовать с устройством для запроса их значений. На этом этапе USBMon поддерживает действия схемы IHV, указанные в Bidi, с помощью существующих API-интерфейсов spooler печати.

Примеры драйверов Windows на GitHub

Пример XML-файла USBMon Bidi — это пример XML-файла расширения USBMon Bidi. Он использует стандартные свойства схемы Bidi DeviceInfo, Configuration и Memory, а также определяет несколько пользовательских расширений.

Дополнительные сведения о файлах расширений Bidi см . в двунаправленной схеме обмена данными.

Пример файла JavaScript для USBMon Bidi. В этом примере содержится файл JavaScript расширения USBMon Bidi. В нем показано, как поддерживать операции Bidi SET и GET, а также прослушивать события во время печати принтера.

Отладка

Интерактивная отладка может быть включена, создав следующий раздел реестра. Для USB Bidi JavaScript необходимо перезапустить средство spooler печати, прежде чем будет включена отладка.

Имя ключа: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

Имя значения: EnableJavaScriptDebugging

Тип: DWORD

Значение: 1

После создания раздела реестра, показанного в предыдущем разделе, и процесс размещения был перезапущен, скрипт можно отлаживать следующим образом:

  1. Подключите отладчик к процессу размещения. Для USB Bidi JavaScript это spoolsv.exe.

  2. Задайте отладчику режим отладки скрипта.

  3. Выберите "Разорвать все " (CTRL+ALT+BREAK), чтобы перейти к процессу при следующем запуске скрипта.

  4. Запустите сценарий для воспроизведения проблемы.

  5. После того как отладчик переходит в функцию JavaScript, задайте все необходимые точки останова и выполните шаги по коду.

Двунаправленная схема связи

IPrinterBidiSchemaElement

IPrinterScriptContext

IPrinterScriptableSequentialStream

Справочник по API JavaScript

Usb-печать

Подключение драйвера принтера версии 4