趙嘉樂 孫夢 夏明潔 王大偉
摘要:為了解決部分瀏覽器不支持NPAPI的問題,在web和TWAIN應(yīng)用程序之間采用WebSocket協(xié)議進(jìn)行通信。通過監(jiān)聽對(duì)應(yīng)端口號(hào),對(duì)不同的消息觸發(fā)不同的操作,包括選擇數(shù)據(jù)源、設(shè)置參數(shù)、啟動(dòng)掃描,在應(yīng)用程序和數(shù)據(jù)源管理、數(shù)據(jù)源之間選擇TWAIN協(xié)議進(jìn)行通信,優(yōu)點(diǎn)是屏蔽了不同硬件設(shè)備廠商和操作系統(tǒng)的差異,TWAIN應(yīng)用程序不做任何修改就可以驅(qū)動(dòng)各種圖形獲取設(shè)備?;谏鲜龇桨福ㄟ^VC++6.0開發(fā)環(huán)境進(jìn)行代碼實(shí)現(xiàn),使用HP M226掃描儀進(jìn)行測試,并取得成功,表明該方案的可行性。
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.
關(guān)鍵詞:WebSocket;TWAIN協(xié)議;圖像掃描
Key words: WebSocket;TWAIN protocol;image scanning
中圖分類號(hào):TP311.5? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文章編號(hào):1006-4311(2019)35-0223-04
0? 引言
隨著掃描儀等圖像獲取設(shè)備的出現(xiàn),很多業(yè)務(wù)系統(tǒng)都逐漸引入這些設(shè)備。然而,市場上掃描儀的設(shè)備種類、生產(chǎn)廠家眾多,而應(yīng)用程序如何驅(qū)動(dòng)這些設(shè)備是所有需要完成掃描功能項(xiàng)目的關(guān)鍵環(huán)節(jié)。如果應(yīng)用程序?qū)γ糠N圖像獲取設(shè)備單獨(dú)開發(fā)界面和其對(duì)應(yīng)的驅(qū)動(dòng)程序,那么其軟件維護(hù)的成本太大。TWAIN(Toolkit Without An Interesting Name)協(xié)議就是在這樣的背景下產(chǎn)生的,TWAIN協(xié)議[1]是應(yīng)用程序和設(shè)備之間的一個(gè)標(biāo)準(zhǔn)通信協(xié)議,用以規(guī)避系統(tǒng)及設(shè)備之間不兼容的問題,大部分的掃描儀和數(shù)碼相機(jī)等圖像獲取設(shè)備都提供了TWAIN驅(qū)動(dòng)程序,利用統(tǒng)一的TWAIN接口,應(yīng)用程序可以方便得從這些設(shè)備中獲取圖像。
但是目前互聯(lián)網(wǎng)上關(guān)于TWAIN的中文資料非常少,只能通過閱讀TWAIN官方網(wǎng)站上提供的TWAIN白皮書即TWAIN-2.4-Specification之后實(shí)現(xiàn)了應(yīng)用程序驅(qū)動(dòng)掃描儀的功能。WebSocket協(xié)議是一種基于TCP(Transmission Control Protocol)連接的網(wǎng)絡(luò)協(xié)議[2]。實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信,允許服務(wù)器主動(dòng)發(fā)送信息給客戶端。本方案采用WebSocket協(xié)議進(jìn)行通信[3],可以有效得解決不是所有瀏覽器都支持NPAPI(Netscape Plugin Application Programming Interface)功能的問題。
1? TWAIN的組成
TWAIN是一組標(biāo)準(zhǔn)協(xié)議和API接口,它為應(yīng)用程序和掃描儀、數(shù)碼相機(jī)等圖像采集設(shè)備之間定義了統(tǒng)一的規(guī)范,其主要由三部分構(gòu)成,具體包括應(yīng)用程序(Application)、數(shù)據(jù)源管理器(Source Manager)和數(shù)據(jù)源(Source)。應(yīng)用程序指使用TWAIN協(xié)議開發(fā)的軟件,比如word、Photoshop等程序,本文設(shè)計(jì)的系統(tǒng)是基于TWAIN協(xié)議開發(fā)的銀行票據(jù)掃描系統(tǒng),應(yīng)用程序不必關(guān)心數(shù)據(jù)源管理器和數(shù)據(jù)源內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。由TWAIN組織開發(fā)的數(shù)據(jù)源管理器,其主要功能是管理應(yīng)用程序和數(shù)據(jù)源之間的信息交互,承擔(dān)著應(yīng)用程序和數(shù)據(jù)源之間通信和數(shù)據(jù)傳輸?shù)娜蝿?wù)。所以,在開發(fā)應(yīng)用程序的時(shí)候,必須先裝載數(shù)據(jù)源管理器。數(shù)據(jù)源直接與硬件交互,是設(shè)備開發(fā)商開發(fā)的符合TWAIN協(xié)議標(biāo)準(zhǔn)的驅(qū)動(dòng)程序。TWAIN組成結(jié)構(gòu)如圖1所示。
2? TWAIN的工作原理
2.1 通信方式
應(yīng)用程序、數(shù)據(jù)源管理器和數(shù)據(jù)源三者之間的通信,僅僅可以通過DSM-Entry()和DS-Entry()兩個(gè)接口來實(shí)現(xiàn)。應(yīng)用程序在獲取圖像的過程中,不能和數(shù)據(jù)源直接通信,所有參數(shù)設(shè)置和數(shù)據(jù)獲取的請(qǐng)求都要通過數(shù)據(jù)源管理器來處理。當(dāng)來自應(yīng)用程序的信息到達(dá)源管理器的入口點(diǎn)DSM_Entry()時(shí),源管理器的處理方式有兩種:如果DSM_Entry()調(diào)用的目的地是數(shù)據(jù)源管理器,則數(shù)據(jù)源管理器直接處理接收過來的操作;如果 DSM_Entry()調(diào)用的目的地是數(shù)據(jù)源,數(shù)據(jù)源管理器將調(diào)用相應(yīng)數(shù)據(jù)源的入口點(diǎn)函數(shù)DS_Entry()。
TWAIN協(xié)議要求每個(gè)數(shù)據(jù)源都必須提供一個(gè) DS_Entry()入口點(diǎn)函數(shù),TWAIN定義了100多種操作,應(yīng)用程序可以根據(jù)自己的實(shí)際需求選擇不同的參數(shù)組合來實(shí)現(xiàn)不同的功能。應(yīng)用程序?qū)⑦@些操作發(fā)送給源管理器,然后由源管理器分析并執(zhí)行這些操作。
2.2 TWAIN狀態(tài)機(jī)
應(yīng)用程序、數(shù)據(jù)源管理器和數(shù)據(jù)源相互通信以管理圖像數(shù)據(jù)的采集。這個(gè)過程必須是合乎邏輯的,按照定義的時(shí)序切換TWAIN狀態(tài)。例如,在加載源管理器并準(zhǔn)備好發(fā)送請(qǐng)求之前,應(yīng)用程序無法成功請(qǐng)求從數(shù)據(jù)源獲取數(shù)據(jù)。
為了確保TWAIN狀態(tài)正確執(zhí)行,TWAIN協(xié)議定義了會(huì)話中存在的七種狀態(tài)。會(huì)話是應(yīng)用程序通過數(shù)據(jù)源管理器連接到特定數(shù)據(jù)源的過程,或者是應(yīng)用程序連接到數(shù)據(jù)源管理器的過程。狀態(tài)機(jī)的轉(zhuǎn)換是由應(yīng)用程序或數(shù)據(jù)源請(qǐng)求的操作引起的,可以是前向或向后的方向轉(zhuǎn)換。一般情況,狀態(tài)的切換是連續(xù)的,例如從狀態(tài)1切換到狀態(tài)2,而不能從狀態(tài)1切換到狀態(tài)3[5]。
狀態(tài)1、2和3:僅由源管理器占用,數(shù)據(jù)源管理器不會(huì)占用大于3的狀態(tài)。
狀態(tài)4、5、6和7:僅由數(shù)據(jù)源占用,如果數(shù)據(jù)源處于打開狀態(tài),則其狀態(tài)不會(huì)小于4,如果應(yīng)用程序使用多個(gè)源,則每個(gè)會(huì)話都是相互獨(dú)立的。TWAIN狀態(tài)切換如圖2所示。
2.3 TWAIN工作流程
應(yīng)用程序、數(shù)據(jù)源管理器和數(shù)據(jù)源,三者必須遵循一個(gè)操作流程才可以正確傳輸數(shù)據(jù)。操作應(yīng)該按照流程規(guī)定的邏輯順序去執(zhí)行,具體的操作流程見圖3。
在沒有加載數(shù)據(jù)源管理器之前,應(yīng)用程序是不能要求數(shù)據(jù)源傳輸數(shù)據(jù)的。應(yīng)用程序可以使用多個(gè)數(shù)據(jù)源,每個(gè)數(shù)據(jù)源的連接都會(huì)單獨(dú)建立會(huì)話,對(duì)于打開的每個(gè)數(shù)據(jù)源,都是獨(dú)立的,相互之間無關(guān)聯(lián)。
3? 票據(jù)掃描系統(tǒng)實(shí)現(xiàn)方案
3.1 系統(tǒng)方案設(shè)計(jì)
出于通用性考慮,解決不是所有瀏覽器都支持NPAPI的問題,本方案采用WebSocket技術(shù)在瀏覽器和TWAIN應(yīng)用程序之間進(jìn)行通信,而TWAIN應(yīng)用程序和數(shù)據(jù)源管理器、數(shù)據(jù)源之間則采用TWAIN協(xié)議進(jìn)行通信,如圖4所示。采用該方案可以保證用戶在web端驅(qū)動(dòng)掃描儀的操作無需關(guān)注太多細(xì)節(jié)即可完成設(shè)計(jì),如用戶使用的瀏覽器的種類、打印機(jī)的廠家和型號(hào)等,都可以通過該方案實(shí)現(xiàn)細(xì)節(jié)的屏蔽。
瀏覽器和TWAIN應(yīng)用程序之間采用WebSocket技術(shù)進(jìn)行通信,瀏覽器啟動(dòng)TCP 客戶端,而TWAIN應(yīng)用程序啟動(dòng)TCP服務(wù)端,監(jiān)聽相應(yīng)的服務(wù)端口。瀏覽器上布局三個(gè)按鈕,對(duì)應(yīng)的功能分別是選擇源、設(shè)置參數(shù)和啟動(dòng)掃描,分別對(duì)應(yīng)三個(gè)不同消息。TWAIN應(yīng)用程序除了負(fù)責(zé)解析消息參數(shù),還要根據(jù)不同參數(shù)執(zhí)行不同的本地操作。
選擇源按鈕對(duì)應(yīng)的功能是當(dāng)TWAIN應(yīng)用程序收到選擇源按鈕被點(diǎn)擊消息后,可以選擇使用參數(shù)MSG_USERSELECT調(diào)用TWAIN接口,數(shù)據(jù)源管理器就會(huì)彈出界面,讓用戶選擇需要的數(shù)據(jù)源(掃描儀)。如用戶無需手動(dòng)選擇數(shù)據(jù)源,可以選擇使用參數(shù)MSG_GETDEFAULT,即選擇默認(rèn)數(shù)據(jù)源。
設(shè)置參數(shù)按鈕對(duì)應(yīng)的功能是彈出參數(shù)設(shè)置的界面,此界面由設(shè)備驅(qū)動(dòng)提供,用于設(shè)置一些常用參數(shù),如尺寸、分辨率等。
當(dāng)啟動(dòng)掃描按鈕被點(diǎn)擊時(shí),不顯示參數(shù)設(shè)置的界面,而是直接驅(qū)動(dòng)掃描儀開始啟動(dòng)掃描程序。當(dāng)TW_USERINTERFACE.ShowUI為True時(shí),會(huì)彈出參數(shù)設(shè)置對(duì)話框,用戶根據(jù)需求設(shè)置對(duì)應(yīng)參數(shù)。當(dāng)TW_USERINTERFACE.ShowUI為False時(shí),不顯示參數(shù)設(shè)置對(duì)話框,直接啟動(dòng)掃描程序,顯示掃描進(jìn)度條。
3.2 程序?qū)崿F(xiàn)步驟
3.2.1 庫的加載
TWAIN協(xié)議提供的所有API接口都可以通過動(dòng)態(tài)庫twain_32.dll來訪問,該庫文件隨同windows操作系統(tǒng)一起發(fā)布。通過LoadLibrary()載入TWAIN庫文件,然后通過函數(shù)GetProcAddress()獲取數(shù)據(jù)源管理器入口函數(shù)地址,后續(xù)所有操作都是基于這個(gè)函數(shù)實(shí)現(xiàn)的,不同的參數(shù)序列的組合對(duì)應(yīng)不同的操作,具體實(shí)現(xiàn)方式如下。
htwain = LoadLibrary(TEXT("TWAIN_32"));
pEntry= (DSMENTRYPROC) GetProcAddress(
htwain, "DSM_Entry");
3.2.2 打開數(shù)據(jù)源管理器
TWAIN是一個(gè)數(shù)據(jù)源管理程序,應(yīng)用程序通過設(shè)置入口函數(shù)的參數(shù)為MSG_OPENDSM,打開數(shù)據(jù)源管理器,同時(shí)需要指定一個(gè)窗口句柄,應(yīng)用程序應(yīng)該在此窗口的消息循環(huán)中處理TWAIN消息(MSG_PROCESSEVENT)。具體實(shí)現(xiàn)方式如下。
DsmEntry(NULL, DG_CONTROL,
DAT_PARENT,MSG_OPENDSM, &hParent);
3.2.3 選擇數(shù)據(jù)源
系統(tǒng)可能存在多個(gè)設(shè)備,用戶需要根據(jù)需求選擇一個(gè)數(shù)據(jù)源。選擇數(shù)據(jù)源通常有兩種方法:①選擇默認(rèn)數(shù)據(jù)源,系統(tǒng)自動(dòng)選擇默認(rèn)數(shù)據(jù)源,無需用戶關(guān)心(MSG_GETDEFAULT);②彈出選擇數(shù)據(jù)源對(duì)話框,將由用戶來決定選擇其中一個(gè)數(shù)據(jù)源(MSG_USERSELECT)。彈出選擇數(shù)據(jù)源對(duì)話框如圖5所示。