趙嘉樂 孫夢 夏明潔 王大偉



摘要:為了解決部分瀏覽器不支持NPAPI的問題,在web和TWAIN應用程序之間采用WebSocket協議進行通信。通過監聽對應端口號,對不同的消息觸發不同的操作,包括選擇數據源、設置參數、啟動掃描,在應用程序和數據源管理、數據源之間選擇TWAIN協議進行通信,優點是屏蔽了不同硬件設備廠商和操作系統的差異,TWAIN應用程序不做任何修改就可以驅動各種圖形獲取設備。基于上述方案,通過VC++6.0開發環境進行代碼實現,使用HP M226掃描儀進行測試,并取得成功,表明該方案的可行性。
Abstract: In order to solve the problem that some web browsers do not support the NPAPI ,WebSocket protocol is used for communication between the web and the twain application. Different operations are triggered for different messages by monitoring the corresponding port number, including selecting data source, setting parameters, and scanning. The twain protocol is selected between the application and the data source management and the data source to communicate, because it can shield the differences between different hardware device manufacturers and operating systems, so that the twain application can drive various graphics acquisition devices without any modification. Based on the program, the code is implemented by the VC++ development environment, and the HP M226 scanner is used for testing and success, the feasibility of the program is proved.
關鍵詞:WebSocket;TWAIN協議;圖像掃描
Key words: WebSocket;TWAIN protocol;image scanning
中圖分類號:TP311.5? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?文獻標識碼:A? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文章編號:1006-4311(2019)35-0223-04
0? 引言
隨著掃描儀等圖像獲取設備的出現,很多業務系統都逐漸引入這些設備。然而,市場上掃描儀的設備種類、生產廠家眾多,而應用程序如何驅動這些設備是所有需要完成掃描功能項目的關鍵環節。如果應用程序對每種圖像獲取設備單獨開發界面和其對應的驅動程序,那么其軟件維護的成本太大。TWAIN(Toolkit Without An Interesting Name)協議就是在這樣的背景下產生的,TWAIN協議[1]是應用程序和設備之間的一個標準通信協議,用以規避系統及設備之間不兼容的問題,大部分的掃描儀和數碼相機等圖像獲取設備都提供了TWAIN驅動程序,利用統一的TWAIN接口,應用程序可以方便得從這些設備中獲取圖像。
但是目前互聯網上關于TWAIN的中文資料非常少,只能通過閱讀TWAIN官方網站上提供的TWAIN白皮書即TWAIN-2.4-Specification之后實現了應用程序驅動掃描儀的功能。WebSocket協議是一種基于TCP(Transmission Control Protocol)連接的網絡協議[2]。實現了瀏覽器與服務器全雙工(full-duplex)通信,允許服務器主動發送信息給客戶端。本方案采用WebSocket協議進行通信[3],可以有效得解決不是所有瀏覽器都支持NPAPI(Netscape Plugin Application Programming Interface)功能的問題。
1? TWAIN的組成
TWAIN是一組標準協議和API接口,它為應用程序和掃描儀、數碼相機等圖像采集設備之間定義了統一的規范,其主要由三部分構成,具體包括應用程序(Application)、數據源管理器(Source Manager)和數據源(Source)。應用程序指使用TWAIN協議開發的軟件,比如word、Photoshop等程序,本文設計的系統是基于TWAIN協議開發的銀行票據掃描系統,應用程序不必關心數據源管理器和數據源內部的實現細節。由TWAIN組織開發的數據源管理器,其主要功能是管理應用程序和數據源之間的信息交互,承擔著應用程序和數據源之間通信和數據傳輸的任務。所以,在開發應用程序的時候,必須先裝載數據源管理器。數據源直接與硬件交互,是設備開發商開發的符合TWAIN協議標準的驅動程序。TWAIN組成結構如圖1所示。
2? TWAIN的工作原理
2.1 通信方式
應用程序、數據源管理器和數據源三者之間的通信,僅僅可以通過DSM-Entry()和DS-Entry()兩個接口來實現。應用程序在獲取圖像的過程中,不能和數據源直接通信,所有參數設置和數據獲取的請求都要通過數據源管理器來處理。當來自應用程序的信息到達源管理器的入口點DSM_Entry()時,源管理器的處理方式有兩種:如果DSM_Entry()調用的目的地是數據源管理器,則數據源管理器直接處理接收過來的操作;如果 DSM_Entry()調用的目的地是數據源,數據源管理器將調用相應數據源的入口點函數DS_Entry()。
TWAIN協議要求每個數據源都必須提供一個 DS_Entry()入口點函數,TWAIN定義了100多種操作,應用程序可以根據自己的實際需求選擇不同的參數組合來實現不同的功能。應用程序將這些操作發送給源管理器,然后由源管理器分析并執行這些操作。
2.2 TWAIN狀態機
應用程序、數據源管理器和數據源相互通信以管理圖像數據的采集。這個過程必須是合乎邏輯的,按照定義的時序切換TWAIN狀態。例如,在加載源管理器并準備好發送請求之前,應用程序無法成功請求從數據源獲取數據。
為了確保TWAIN狀態正確執行,TWAIN協議定義了會話中存在的七種狀態。會話是應用程序通過數據源管理器連接到特定數據源的過程,或者是應用程序連接到數據源管理器的過程。狀態機的轉換是由應用程序或數據源請求的操作引起的,可以是前向或向后的方向轉換。一般情況,狀態的切換是連續的,例如從狀態1切換到狀態2,而不能從狀態1切換到狀態3[5]。
狀態1、2和3:僅由源管理器占用,數據源管理器不會占用大于3的狀態。
狀態4、5、6和7:僅由數據源占用,如果數據源處于打開狀態,則其狀態不會小于4,如果應用程序使用多個源,則每個會話都是相互獨立的。TWAIN狀態切換如圖2所示。
2.3 TWAIN工作流程
應用程序、數據源管理器和數據源,三者必須遵循一個操作流程才可以正確傳輸數據。操作應該按照流程規定的邏輯順序去執行,具體的操作流程見圖3。
在沒有加載數據源管理器之前,應用程序是不能要求數據源傳輸數據的。應用程序可以使用多個數據源,每個數據源的連接都會單獨建立會話,對于打開的每個數據源,都是獨立的,相互之間無關聯。
3? 票據掃描系統實現方案
3.1 系統方案設計
出于通用性考慮,解決不是所有瀏覽器都支持NPAPI的問題,本方案采用WebSocket技術在瀏覽器和TWAIN應用程序之間進行通信,而TWAIN應用程序和數據源管理器、數據源之間則采用TWAIN協議進行通信,如圖4所示。采用該方案可以保證用戶在web端驅動掃描儀的操作無需關注太多細節即可完成設計,如用戶使用的瀏覽器的種類、打印機的廠家和型號等,都可以通過該方案實現細節的屏蔽。
瀏覽器和TWAIN應用程序之間采用WebSocket技術進行通信,瀏覽器啟動TCP 客戶端,而TWAIN應用程序啟動TCP服務端,監聽相應的服務端口。瀏覽器上布局三個按鈕,對應的功能分別是選擇源、設置參數和啟動掃描,分別對應三個不同消息。TWAIN應用程序除了負責解析消息參數,還要根據不同參數執行不同的本地操作。
選擇源按鈕對應的功能是當TWAIN應用程序收到選擇源按鈕被點擊消息后,可以選擇使用參數MSG_USERSELECT調用TWAIN接口,數據源管理器就會彈出界面,讓用戶選擇需要的數據源(掃描儀)。如用戶無需手動選擇數據源,可以選擇使用參數MSG_GETDEFAULT,即選擇默認數據源。
設置參數按鈕對應的功能是彈出參數設置的界面,此界面由設備驅動提供,用于設置一些常用參數,如尺寸、分辨率等。
當啟動掃描按鈕被點擊時,不顯示參數設置的界面,而是直接驅動掃描儀開始啟動掃描程序。當TW_USERINTERFACE.ShowUI為True時,會彈出參數設置對話框,用戶根據需求設置對應參數。當TW_USERINTERFACE.ShowUI為False時,不顯示參數設置對話框,直接啟動掃描程序,顯示掃描進度條。
3.2 程序實現步驟
3.2.1 庫的加載
TWAIN協議提供的所有API接口都可以通過動態庫twain_32.dll來訪問,該庫文件隨同windows操作系統一起發布。通過LoadLibrary()載入TWAIN庫文件,然后通過函數GetProcAddress()獲取數據源管理器入口函數地址,后續所有操作都是基于這個函數實現的,不同的參數序列的組合對應不同的操作,具體實現方式如下。
htwain = LoadLibrary(TEXT("TWAIN_32"));
pEntry= (DSMENTRYPROC) GetProcAddress(
htwain, "DSM_Entry");
3.2.2 打開數據源管理器
TWAIN是一個數據源管理程序,應用程序通過設置入口函數的參數為MSG_OPENDSM,打開數據源管理器,同時需要指定一個窗口句柄,應用程序應該在此窗口的消息循環中處理TWAIN消息(MSG_PROCESSEVENT)。具體實現方式如下。
DsmEntry(NULL, DG_CONTROL,
DAT_PARENT,MSG_OPENDSM, &hParent);
3.2.3 選擇數據源
系統可能存在多個設備,用戶需要根據需求選擇一個數據源。選擇數據源通常有兩種方法:①選擇默認數據源,系統自動選擇默認數據源,無需用戶關心(MSG_GETDEFAULT);②彈出選擇數據源對話框,將由用戶來決定選擇其中一個數據源(MSG_USERSELECT)。彈出選擇數據源對話框如圖5所示。