共用方式為


USB Bidi 擴充器

重要

新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。

如需詳細資訊,請參閱 新式列印平臺列印支援應用程式設計指南

Windows 允許製造商使用 Bidi XML 檔案和稱為 USB Bidi 擴充器之 Javascript 檔案的組合,支援 USB 裝置的雙向通訊(Bidi)。

USB Bidi 擴充器可讓應用程式搭配 USB 使用 Bidi 作為傳輸機制。 Javascript 實作不支援任何裝置流程控制,或列印期間具有列印作業之控制資訊的任何多任務處理。

根據預設,Bidi 查詢和狀態要求會透過用於列印的USB裝置介面路由傳送。 這允許使用 getSchemas JavaScript 方法進行狀態的完整雙向通訊,以及允許使用 setSchema JavaScript 方法的 Set 作業。 雖然沒有列印作業傳送到列印裝置,但可能會進行完整的雙向通訊。

在列印期間,列印作業數據會封鎖寫入,因此 getStatus 方法只會使用讀取通道從裝置取得未經請求的狀態。 但是,如果裝置支援次要USB介面,則 requestStatus 方法函式會用來在裝置列印時從印表機取得狀態。

在 Windows 8.1已擴充 v4 驅動程式模型,以提供主機型裝置的支援。 此外,USBMon 已更新,可讓 IHV 使用 JavaScript 程式代碼,以更妥善地控制列印路徑,以及執行以列印作業為基礎的動作。 更新包含新增 API,以提供新的 Bidi JavaScript 進入點。 這些 API 會與 USBMon 中的現有函式一致。

startPrintJob。 這個新函式會與USBMon中的 startDocPort 對齊。 由於每個新的 USB 印表作業都是在連線到主機型列印裝置 USBMon 的埠上啟動,所以會呼叫提供的 IHV 提供的 JavaScript,以允許它執行所需的任何前置工作處理。 這可能包括在作業屬性包中設定作業全域屬性、查詢裝置的目前狀態和組態數據或沒有任何內容。 完成的工作完全取決於裝置和 IHV。

writePrintData。 這個新函式會與USBMon中的 writePort 一致。 當USBMon在列印過程中從多任務緩衝處理程式接收每個 writePort 函式呼叫時,提供的列印數據必須透過IHV JavaScript 函式傳送至主機型裝置。 這可讓 IHV JS 決定目前應該傳送至裝置的內容。 IHV 可以視需要移除、新增或儲存部分的數據緩衝區。 這可讓 IHV 完全控制何時傳送至裝置的內容。 這可協助啟用手動雙工之類的案例,方法是讓IHV有機會在列印作業的偶數頁面儲存(在其中一個持續性數據流內)數據,以便處理一旦從後台處理程式接收所有數據。 IHV 也可以使用 printerBidiSchemaResponses 物件,在處理作業期間傳回列印作業狀態或裝置狀態。

endPrintJob。 這個新函式會與USBMon中的 endDocPort 一致。 當 USBMon 在連接到主機型列印裝置 USBMon 的埠上收到每個 USB 列印作業的 endDocPort 呼叫時,會呼叫 IHV 提供的 JavaScript,以允許它執行所需的任何後續作業處理。 這可能包括將任何保留的數據傳送至裝置、傳回 Bidi Schema 值以開始手動雙工,或 IHV/裝置所需的任何其他專案。

下圖提供 USB Bidi 延伸模組架構的概觀,其中顯示 getStatus 方法用來透過 USBPrint 介面從裝置取得未請求狀態的案例

使用 getstatus 方法的 usb bidi 擴充器架構。

如需使用 USB 印表機的詳細資訊,請參閱 USB 列印

USB Bidi 擴充器 API 參考

USB Bidi 擴充器中的 JavaScript 程式代碼會使用下列函式來與列印裝置通訊:

  • getSchemas

  • setSchema

  • getStatus

  • requestStatus

  • startPrintJob

  • writePrintData

  • endPrintJob

如需這些 API 的詳細資訊,請參閱 JavaScript API 參考

USBMon Bidi 延伸模組 XML 架構

USBMon Bidi Extension 檔案會使用與 SNMP Bidi Extension 檔案和 WSDMon Bidi Extension 檔案相同的基本結構。 XML 架構檔案會在 Windows 驅動程式套件和 USBMon Bidi 延伸模組檔案中發佈,在 INFGate WHCK 測試期間會自動進行架構驗證。 當您開發 Bidi 延伸模組架構並使用 USB 總線時,請務必注意下列資訊:

  • 值可以指定 Get、Set 或 GetSet 的 accessType。 這表示 Bidi Get 或 Set 作業類型支援描述的架構專案的位置。

  • 值可以指定 queryKey。 這應該用來表示用來從裝置取得數據的實體作業。 相同 queryKey 下的所有屬性都應該在一個 USB 讀取/寫入作業中擷取。

  • 如果 Bidi API 呼叫中要求 Bidi 值,則會立即輪詢這些值。 refreshInterval 值是初始值,指出何時輪詢裝置以取得特定 Bidi 架構值的更新。 每次輪詢之後,refreshInterval 就會增加,直到我們停止輪詢為止。 下列公式顯示 refreshInterval 的遞增方式:

    currentRefreshInterval = refreshInterval * (3 * numPolls);
    

USBMon 和 USB Bidi 延伸模組檔案互動

建立或開啟每個新的 USB 埠時,USBMon 會判斷連接的裝置和相關聯的驅動程式是否包含新的 Bidi Extension 檔案和 Bidi Extension JavaScriptfile。 USBMon 會搜尋 v4 驅動程式指令清單或驅動程式 INI 檔案,並擷取檔案的名稱。 如果 USBMon 找到相關的檔案,它會使用這些檔案來判斷此裝置所支援的擴充 Bidi 架構值清單,然後與裝置通訊以查詢其值。 此時,USBMon 可透過現有的列印後台處理程式 API 支援 IHV 指定的 Bidi 架構動作。

GitHub 上的 Windows 驅動程式範例

USBMon Bidi XML 檔案範例 - 這會提供USBMon Bidi Extension XML 檔案的範例。 它會使用標準 Bidi 架構屬性 DeviceInfo、Configuration 和 Memory,也會定義一些自定義延伸模組。

如需 Bidi 延伸模組檔案的詳細資訊,請參閱 雙向通訊架構

USBMon Bidi JavaScript 檔案範例。 此範例包含 USBMon Bidi Extender JavaScript 檔案。 它示範如何支援 Bidi SET 和 GET 作業,以及如何在印表機列印時接聽事件。

偵錯

您可以藉由建立下列登錄機碼來啟用互動式偵錯。 針對USB Bidi JavaScript,列印後台處理程式必須先重新啟動,才能啟用偵錯。

機碼名稱: 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

JavaScript API 參考

USB 列印

V4 印表機驅動程式連線能力