Implementation of Bank Ticket Scanning System Based on TWAIN Protocol
赵嘉乐 ZHAO Jia-le;孙梦 SUN Meng;夏明洁 XIA Ming-jie;王大伟 WANG Da-wei
(南京理工大学泰州科技学院移动互联网学院,泰州 225300)
(College of Mobile Internet,Taizhou Institute of Science & Technology,Nanjing University of Science & Technology,
Taizhou 225300,China)
摘要:为了解决部分浏览器不支持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所示。
3.2.4 设置参数
通过使用MSG_ENABLEDS消息,可以显示设备驱动提供的用户界面(UI),也就是提供给用户设置扫描仪具体参数的界面。同时,可以通过字段TW_USERINTERFACE.ShowUI控制设置参数对话框的显示与否,当ShowUI字段为FALSE时,则隐藏对话框,当ShowUI字段为TRUE时,则显示对话框。
弹出的设置参数对话框,用于提供界面给客户设置颜色模式、分辨率、扫描大小等,如图6所示。
弹出的设置参数对话框代码实现如下。
TW_USERINTERFACE ui;
ui.ShowUI = TRUE;
ui.ModalUI = TRUE;
ui.hParent = hParent;
DsmEntry(&source,DG_CONTROL,
DAT_USERINTERFACE,
MSG_ENABLEDS,&ui);
3.2.5 获取图片
TWAIN为数据传送定义了三种模式:本地、缓存和文件。本地模式最大的局限性是可能没有足够大的内存保存图像。缓存传输模式中,数据通常以非压缩格式传输。磁盘文件传输模式分两种,一种是确定支持文件传输模式后再启动传输,另外一种是传输到文件,也是用的最多的一种传输方式,本文也是使用该方法。
用户启动扫描程序后,可以在窗口的消息队列中捕获到扫描完成事件MSG_XFERREADY。同时,可以通过命令参数ICAP_IMAGEFILEFORMAT确定数据源支持的文件格式。根据返回消息,应用程序可以发送特定文件格式的请求,并且可以通过命令参数DAT_SETUPFILEXFER设置后续的数据传输文件名。
参数DAT_IMAGEFILEXFER用于通过磁盘文件传输机制将图片从数据源传输到应用程序。具体的实现方法见下:
DsmEntry(&source, DG_CONTROL,
DAT_SETUPFILEXFER, MSG_SET,
&twsfFile);
DsmEntry(&source, DG_IMAGE,
DAT_IMAGEFILEXFER, MSG_GET,
NULL);
3.2.6 关闭会话和释放资源
完成图片传输和保存功能之后,应用程序需要按照特定的时序关闭所有会话,包括关闭数据源和数据源管理器,最后把相关资源释放。
首先,应用程序需要关闭之前打开的所有数据源,如果应用程序无需启动其他TWAIN会话,在关闭数据源的基础上需要关闭数据源管理器,具体代码实现如下。
DsmEntry(NULL,DG_CONTROL,DAT_IDENTI
TY, MSG_CLOSEDS, &source);
DsmEntry(NULL, DG_CONTROL,
DAT_PARENT, MSG_CLOSEDSM,
&hParent);
if(hTwain)
{
FreeLibrary(hTwain);
hTwain = NULL;
}
4 结束语
本文在详细说明了TWAIN原理和工作流程的基础上,对银行票据扫描系统的总体方案设计做了详细的阐述。在web和TWAIN应用程序之间选择使用WebSocket进行通信,在应用程序和设备之间选择使用TWAIN协议进行通信。应用程序的代码向上向下都实现了兼容,不做任何修改就可以适配不同种类的浏览器和不同品牌、不同型号的扫描仪。提高代码利用率的同时也提供开发者的工作效率。
在上述方案基础上,采用VC++6.0开发环境,对上述方案进行代码实现[6],并使用型号为HP M226的扫描仪进行功能和性能测试,并取得成功,验证了该方案的可操作性。
参考文献:
[1]朱玉戈.基于TWAIN协议的图像处理系统[D].浙江:浙江工业大学,2014.
[2]Douglas E. Comer.Computer Networks and Internets [M]. Fifth Edition 北京:清华大学出版社,2010.
[3]谢希仁.计算机网络[M].七版.北京:电子工业出版社, 2017.
[4]朱朝华,皮佑国,张冬花.基于TWAIN标准的车票图像采集[J].微计算机信息,2006,22(16):233-234.
[5]TWAIN-2.4-Specification [EB/OL].TWAIN官方网站 http://www.twain.org.
[6]谭浩强.C++程序设计[M].北京:清华大学出版社,2004. |