一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种模拟打印方法、计算设备及存储介质与流程

2022-02-20 00:56:02 来源:中国专利 TAG:


1.本发明涉及操作系统领域,特别涉及一种模拟打印方法、计算设备及存储介质。


背景技术:

2.随着各种操作系统的发展,需要针对操作系统对硬件,如打印机的适配性进行针对性提高。在操作系统中,需要有驱动程序用于调用打印机,这样用户才能正常使用打印机。为了更好的适配打印机,有时需要将打印机连接到计算机上,通过驱动程序执行打印任务,此时打印机的驱动程序会输出打印数据。研究和分析这些打印数据,能够更好的对打印驱动进行开发和适配。
3.但现有技术在实施时,添加一个离线打印机并安装好对应的打印机驱动,用任意程序打印,可以正常选择这个添加的打印机作为目标打印机,生成一个打印作业,但是对应的打印机驱动却没有运行,系统没有检测到物理打印机,就不调用打印机驱动。因此测试和适配打印机的打印驱动时,如果不连接物理的打印机,就无法进行正常调用打印机驱动。
4.为此,需要一种新的模拟打印方法。


技术实现要素:

5.为此,本发明提供一种模拟打印方法,以力图解决或者至少缓解上面存在的问题。
6.根据本发明的一个方面,提供一种模拟打印方法,适于在服务器中执行,服务器与一个或多个客户端通信连接,服务器中存储有一个或多个实体打印机的打印机信息,客户端中包括打印机驱动,方法包括步骤:根据每个打印机信息生成对应的打印机配置;根据打印机配置构建每个实体打印机对应的虚拟打印机,得到一个或多个虚拟打印机,并设置服务器与一个或多个虚拟打印机连接;当接收到客户端的设备列表请求时,将设备列表发送到客户端,设备列表包括与服务器连接的一个或多个虚拟打印机;当接收到客户端根据设备列表中选择的虚拟打印机的连接请求时,根据选择的虚拟打印机所对应的打印机信息和打印机配置生成离线打印机数据;将离线打印机数据发送到客户端,以便客户端根据离线打印机数据调用打印机驱动,输出打印数据。
7.可选地,在根据本发明的方法中,打印机信息包括打印机的厂商标识、产品标识和通讯标识,根据每个打印机信息生成对应的打印机配置包括步骤:根据厂商标识、产品标识和通讯标识生成对应的打印机配置。
8.可选地,在根据本发明的方法中,打印机配置包括设备描述符、配置描述符、接口描述符和终结点描述符,根据打印机配置构建每个实体打印机对应的虚拟打印机包括步骤:根据设备描述符、配置描述符、接口描述符和终结点描述符构建实体打印机对应的虚拟打印机。
9.可选地,在根据本发明的方法中,当接收到客户端根据设备列表中选择的虚拟打印机的连接请求时,根据选择的虚拟打印机所对应的打印机信息和打印机配置生成离线打印机数据包括步骤:向客户端发送连接确认信息,以便客户端根据连接确认信息与所述虚
拟打印机建立通信连接,并根据与虚拟打印机的通信连接向服务器发送获取离线打印机数据的请求;接收到客户端获取离线打印机数据的请求后,根据所选择的虚拟打印机所对应的打印机信息和打印机配置生成离线打印机数据。
10.可选地,在根据本发明的方法中,离线打印机数据包括设备描述符、通讯标识和端口信息,客户端中构建有主机控制器,并运行有操作系统,操作系统包括内核和驱动库,驱动库包括多种驱动,客户端根据离线打印机数据调用打印机驱动包括步骤:主机控制器根据离线打印机数据中的端口信息,向内核发送枚举设备请求;内核接收到枚举设备请求后,根据设备描述符和通讯标识从驱动库中匹配与虚拟打印机对应的驱动程序;内核调用所匹配到的驱动程序输出打印数据。
11.根据本发明的一个方面,提供一种模拟打印方法,适于在客户端中执行,客户端与服务器通信连接,客户端中运行有操作系统,操作系统包括内核和驱动库,驱动库包括多种驱动程序,方法包括步骤:向服务器发送设备列表请求以便获取与服务器连接的一个或多个虚拟打印机;从服务器发送的设备列表中选择要连接的虚拟打印机,并向服务器发送虚拟打印机连接请求,以便服务器根据所选择的虚拟打印机生成离线打印机数据;当接收到服务器发送的离线打印机数据时,构建主机控制器,并通过虚拟主机控制器根据离线打印机数据向内核发送枚举设备请求;内核接收到枚举设备请求后,通过内核根据离线打印机数据从驱动库中匹配虚拟打印机所对应的驱动程序;通过内核调用所匹配到的驱动程序输出打印数据。
12.可选地,在根据本发明的方法中,从服务器发送的设备列表中选择要连接的虚拟打印机,并向服务器发送虚拟打印机连接请求,以便服务器根据所选择的虚拟打印机生成离线打印机数据包括步骤:当接收到服务器发送的连接确认信息,根据连接确认信息与虚拟打印机建立通信连接,并根据与虚拟打印机的通信连接向服务器发送获取离线打印机数据的请求,以便服务器在接收到客户端获取离线打印机数据的请求后生成离线打印机数据。
13.可选地,在根据本发明的方法中,离线打印机数据包括端口信息,根据离线打印机数据向内核发送枚举设备请求包括步骤:根据离线打印机数据中的端口信息,向内核发送枚举设备请求。
14.可选地,在根据本发明的方法中,离线打印机数据还包括设备描述符和通讯标识,根据离线打印机数据从驱动库中匹配虚拟打印机所对应的驱动程序包括步骤:根据设备描述符和通讯标识从驱动库中匹配与虚拟打印机对应的驱动程序。
15.可选地,在根据本发明的方法中,还包括步骤:根据打印数据构建新驱动程序,新驱动程序适配于新操作系统;在客户端中安装新操作系统,并在新操作系统中运行新驱动程序以调用虚拟打印机对应的实体打印机。
16.根据本发明的另一个方面,提供了一种计算设备,包括:一个或多个处理器;存储器;以及一个或多个程序,其中一个或多个程序存储在存储器中并被配置为由一个或多个处理器执行,一个或多个程序包括用于执行根据本发明的模拟打印方法。
17.根据本发明的再一个方面,提供了一种存储一个或多个程序的计算机可读存储介质,一个或多个程序包括指令,该指令当由计算设备执行时,使得计算设备执行根据本发明的模拟打印方法。
18.本发明公开了一种模拟打印方法,适于在服务器中执行。具体的,只需要有实体打印机的打印机信息,根据打印机信息生成打印机配置,进一步的即可根据打印机配置构建虚拟打印机。服务器在接收到客户端根据所述设备列表中选择的虚拟打印机的连接请求时,根据虚拟打印机所对应的打印机信息和打印机配置生成离线打印机数据。随后,将虚拟打印机数据发送到客户端,客户端即可根据离线打印机数据调用打印机驱动,输出打印数据。本发明中的模拟打印方法,不要实际的采购并安装打印机,节约大量时间和经费,仅需要打印机的打印机信息就能够完成对各种打印机的打印机驱动的开发。并且通过在服务器端构建虚拟打印机,客户端获取虚拟打印机的离线打印机数据后,从而能够调用服务器的虚拟打印机,并且即使与服务器切段连接后,还能够正常通过离线打印机数据进行离线打印,调用打印机驱动,输出打印数据。
附图说明
19.为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本发明公开的上述以及其它目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
20.图1示出了根据本发明一个示范性实施例的服务器与客户端通信连接的示意图;图2示出了根据本发明一个示范性实施例的计算设备200的结构框图;图3示出了根据本发明一个示范性实施例的模拟打印方法300的流程示意图。
具体实施方式
21.下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。相同的附图标记通常指代相同的部件或元素。
22.图1示出了根据本发明一个示范性实施例的服务器与客户端通信连接的示意图。如图1所示,客户端110与服务器120通信连接。本发明中服务器可连接一个或多个客户端,图1所示的服务器120与客户端的连接方式仅为示例性的,本发明对服务器120所连接的客户端的数量不做限制。
23.客户端110中包括硬件层111,并运行有操作系统113。操作系统113中还包括驱动库115和内核114。驱动库115中包括多个打印机驱动,每个打印机驱动均适配一台实体打印机。本发明对操作系统113的种类不做限制,操作系统113可实现为windows系统。系统层111中构建有主机控制器112,主机控制器112为虚拟的主机控制器,用于连接虚拟打印机,以便内核114根据虚拟打印机的离线打印机数据调用驱动库115中的打印机驱动,输出打印数据。离线打印机数据包括设备描述符、通讯标识和端口信息。
24.服务器120中包括硬件层121,硬件层121中包括外部存储器123,并构建有主机控制器122。外部存储器中存储有主机控制器112为虚拟的主机控制器,用于连接虚拟打印机。服务器120预先收集有一个或多个实体打印机的打印机信息,具体可通过从网络中查找获
取或由开发人员录入,本发明对服务器120收集打印机信息的方式不做限制。主机控制器112为虚拟的主机控制器,用于连接虚拟打印机。服务器120中还运行有操作系统124,本发明对操作系统124的种类不做限制,当操作系统124实现为linux系统时,内核125可实现为linux内核。打印机信息包括打印机的厂商标识、产品标识和通讯标识。
25.图1中客户端110和服务器120可实现为一种计算设备。图2示出了根据本发明一个示范性实施例的计算设备200的结构框图。如图2所示,在基本的配置202中,计算设备200典型地包括系统存储器206和一个或者多个处理器204。存储器总线208可以用于在处理器204和系统存储器206之间的通信。
26.取决于期望的配置,处理器204可以是任何类型的处理,包括但不限于:微处理器(
µ
p)、微控制器(
µ
c)、数字信息处理器(dsp)或者它们的任何组合。处理器204可以包括诸如一级高速缓存210和二级高速缓存212之类的一个或者多个级别的高速缓存、处理器核心214和寄存器216。示例的处理器核心214可以包括运算逻辑单元(alu)、浮点数单元(fpu)、数字信号处理核心(dsp核心)或者它们的任何组合。示例的存储器控制器218可以与处理器204一起使用,或者在一些实现中,存储器控制器218可以是处理器204的一个内部部分。
27.取决于期望的配置,系统存储器206可以是任意类型的存储器,包括但不限于:易失性存储器(诸如ram)、非易失性存储器(诸如rom、闪存等)或者它们的任何组合。系统存储器206可以包括操作系统220、一个或者多个程序222以及程序数据228。在一些实施方式中,程序222可以布置为在操作系统上由一个或者多个处理器204利用程序数据228执行根据本发明的方法300的指令223。
28.计算设备200还可以包括储存接口总线234。储存接口总线234实现了从储存设备232(例如,可移除储存器236和不可移除储存器238)经由总线/接口控制器230到基本配置202的通信。操作系统220、程序222以及数据224的至少一部分可以存储在可移除储存器236和/或不可移除储存器238上,并且在计算设备200上电或者要执行程序222时,经由储存接口总线234而加载到系统存储器206中,并由一个或者多个处理器204来执行。
29.计算设备200还可以包括有助于从各种接口设备(例如,输出设备242、外设接口244和通信设备246)到基本配置202经由总线/接口控制器230的通信的接口总线240。示例的输出设备242包括图形处理单元248和音频处理单元250。它们可以被配置为有助于经由一个或者多个a/v端口252与诸如显示器或者扬声器之类的各种外部设备进行通信。示例外围接口244可以包括串行接口控制器254和并行接口控制器256,它们可以被配置为有助于经由一个或者多个i/o端口258和诸如输入设备(例如,键盘、鼠标、笔、语音输入设备、触摸输入设备)或者其他外设(例如打印机、扫描仪等)之类的外部设备进行通信。示例的通信设备246可以包括网络控制器260,其可以被布置为以便经由一个或者多个通信端口264与一个或者多个其他计算设备200通过网络通信链路的通信。
30.网络通信链路可以是通信介质的一个示例。通信介质通常可以体现为在诸如载波或者其他传输机制之类的调制数据信号中的计算机可读指令、数据结构、程序模块,并且可以包括任何信息递送介质。“调制数据信号”可以这样的信号,它的数据集中的一个或者多个或者它的改变可以在信号中编码信息的方式进行。作为非限制性的示例,通信介质可以包括诸如有线网络或者专线网络之类的有线介质,以及诸如声音、射频(rf)、微波、红外(ir)或者其它无线介质在内的各种无线介质。这里使用的术语计算机可读介质可以包括存
储介质和通信介质二者。
31.在根据本发明的计算设备200中,程序222包括模拟打印方法300的多条程序指令,这些程序指令可以指示处理器204执行本发明的计算设备200中运行的模拟打印方法300中的部分步骤,以便计算设备200中的各部分通过执行本发明的模拟打印方法300来实现输出打印数据。
32.计算设备200可以实现为服务器,例如文件服务器240、数据库250、服务器、应用程序服务器等,这些电子设备可以是诸如个人数字助理(pda)、无线网络浏览设备、应用专用设备、或者可以包括上面任何功能的混合设备。可以实现为包括桌面计算机和笔记本计算机配置的个人计算机,也在一些实施例中,计算设备200被配置为模拟打印方法300。
33.图3示出了根据本发明一个示范性实施例的模拟打印方法300的流程示意图。本发明中的模拟打印方法300中步骤s301、步骤s302、步骤s304、步骤s306和步骤s307适于在服务器中执行,步骤s303、步骤s305、步骤s308、步骤s309和步骤s310适于在客户端中执行。
34.下面结合客户端110和服务器120对方法300进行说明。服务器120中存储有一个或多个实体打印机的打印机信息。打印机信息用于标识实体打印机,每个实体打印机的打印机信息均不相同。打印机信息包括打印机的厂商标识、产品标识和通讯标识。目前大多数打印机均采用usb与计算机进行连接,打印机属于usb设备,每个usb设备均有对应的厂商标识、产品标识和通讯标识。
35.厂商标识(vid)为usb协会给每个usb设备制造商分配的唯一厂商id,根据本发明的一个实施例,厂商标识为03f0。
36.产品标识(pid)为每个usb设备制造商给自己的usb设备分配的唯一产品id, 也是4个字符。根据本发明的一个实施例,一个实体打印机的产品标识为ac2a。
37.通讯标识(ieee1284 id)为国际电气与电子工程师协会的 ieee 1284标准里面用来唯一标识某个类型的打印机设备制定的标识规则。根据本发明的一个实施例,一个实体打印机的通讯标识为mfg:hp;cmd:pjl,pml,pclxl,pwg_raster,urp,pcl,pdf,postscript;mdl:hp colorlaserjet m253-m254;cls:printer;des:hp color laserjet m254dw;mem:mem=219mb;prn:t6b60a;comment:res=600x8;ledmdis:usb#ff#04#01;cid:hpljpdlv1;ipp-e:ff-04-01,ff-04-01,ff-09-01,ff-09-01;mct:pr;mcl:dl;mcv:2.0;通讯标识中包括打印机的厂商名,型号,支持的打印机语言等重要信息。
38.首先执行步骤s301,根据每个打印机信息生成对应的打印机配置。生成打印机配置时,根据厂商标识、产品标识和通讯标识生成对应的打印机配置。具体的,根据厂商标识、产品标识和通讯标识确定打印机配置的各项参数。
39.打印机配置为实体打印机的配置信息,根据打印机配置能够构建对应于实体打印机的虚拟打印机。每个虚拟打印机对应于一台实体打印机,当客户端或服务器连接有虚拟打印机时,客户端和服务器将虚拟打印机作为实体打印机进行调用,所输出的打印数据与连接实体打印机时输出的答应数据相同。
40.打印机配置包括设备描述符、配置描述符、接口描述符和终结点描述符。其中,设备描述符为每个usb设备的设备标识,其中包含有关设备的相关信息。具体的,设备标识符包括vid、pid、 bcdusb和bcddevice。其中,bcdusb字段指示设备符合的 usb 规范的版本,例如,0x0200 指示设备按照 usb 2.0 规范设计。 bcddevice字段指示设备定义的修订号。
41.配置描述符包含一系列接口, 每个接口都包含一个或多个备用设置,每个备用设置由一组终结点组成。 配置描述符包括接口、备用设置和终结点。 配置描述符还可以包括由设备制造商定义的自定义描述符。配置描述符的初始部分是固定的9个字节,其余是可变的,具体取决于接口的数量及其备用设置,以及设备支持的终结点。
42.接口描述符包含有关 usb 接口的替代设置的信息。终结点描述符中接口中的每个终结点都描述了设备的单个输入或输出流。终结点描述符包含地址、类型、方向和终结点可以处理的数据量。
43.根据本发明的一个实施例,一个实体打印机的厂商标识(vid)03f0,产品标识(pid)为ac2a,通讯标识(ieee1284 id)为mfg:hp;cmd:pjl,pml,pclxl,pwg_raster,urp,pcl,pdf,postscript;mdl:hp colorlaserjet m253-m254;cls:printer;des:hp color laserjet m254dw;mem:mem=219mb;prn:t6b60a;comment:res=600x8;ledmdis:usb#ff#04#01;cid:hpljpdlv1;ipp-e:ff-04-01,ff-04-01,ff-09-01,ff-09-01;mct:pr;mcl:dl;mcv:2.0。
44.根据该实体打印机的打印机信息生成对应的打印机配置,其中设备描述符包括:class devicedescriptor():
ꢀꢀꢀꢀ
def __init__(self,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
blength = 18,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bdescriptortype = 1,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bcdusb = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bdeviceclass = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bdevicesubclass = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bdeviceprotocol = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bmaxpacketsize0 = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
idvendor = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
idproduct = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bcddevice = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
imanufacturer = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
iproduct = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
iserialnumber = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bnumconfigurations = 0):
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.blength = blength
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdescriptortype = bdescriptortype
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bcdusb = bcdusb
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdeviceclass = bdeviceclass
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdevicesubclass = bdevicesubclass
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdeviceprotocol = bdeviceprotocol
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bmaxpacketsize0 = bmaxpacketsize0
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.idvendor = idvendor
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.idproduct = idproduct
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bcddevice = bcddevice
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.imanufacturer = imanufacturer
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.iproduct = iproduct
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.iserialnumber = iserialnumber
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bnumconfigurations = bnumconfigurations
ꢀꢀꢀꢀ
def __bytes__(self):
ꢀꢀꢀꢀꢀꢀꢀꢀ
return struct.pack('!bbhbbbbhhhbbbb', self.blength,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdescriptortype, self.bcdusb, self.bdeviceclass,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdevicesubclass, self.bdeviceprotocol,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.bmaxpacketsize0, self.idvendor, self.idproduct,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.bcddevice, self.imanufacturer, self.iproduct,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.iserialnumber, self.bnumconfigurations)配置描述符包括:class configurationdescriptor():
ꢀꢀꢀꢀ
def __init__(self,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
blength = 9,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bdescriptortype = 2,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
wtotallength = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bnuminterfaces = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bconfigurationvalue = 1,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
iconfiguration = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bmattributes = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bmaxpower = 0x1):
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.blength = blength
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdescriptortype = bdescriptortype
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.wtotallength = wtotallength
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bnuminterfaces = bnuminterfaces
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bconfigurationvalue = bconfigurationvalue
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.iconfiguration = iconfiguration
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bmattributes = bmattributes
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bmaxpower = bmaxpower
ꢀꢀꢀꢀ
def __bytes__(self):
ꢀꢀꢀꢀꢀꢀꢀꢀ
return struct.pack('bbhbbbbb',self.blength, self.bdescriptortype,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.wtotallength, self.bnuminterfaces,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.bconfigurationvalue, self.iconfiguration,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.bmattributes, self.bmaxpower)接口描述符包括:class interfacedescriptor():
ꢀꢀꢀꢀ
def __init__(self,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
blength = 9,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bdescriptortype = 4,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
binterfacenumber = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
balternatesetting = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bnumendpoints = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
binterfaceclass = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
binterfacesubclass = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
binterfaceprotocol = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
iinterface = 0):
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.blength = blength
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdescriptortype = bdescriptortype
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.binterfacenumber = binterfacenumber
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.balternatesetting = balternatesetting
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bnumendpoints = bnumendpoints
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.binterfaceclass = binterfaceclass
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.binterfacesubclass = binterfacesubclass
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.binterfaceprotocol = binterfaceprotocol
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.iinterface = iinterface
ꢀꢀꢀꢀ
def __bytes__(self):
ꢀꢀꢀꢀꢀꢀꢀꢀ
return struct.pack('bbbbbbbbb', self.blength,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdescriptortype, self.binterfacenumber,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.balternatesetting, self.bnumendpoints,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.binterfaceclass, self.binterfacesubclass,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.binterfaceprotocol, self.iinterface)终结点描述符包括:class endpointdescriptor():
ꢀꢀꢀꢀ
def __init__(self,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
blength = 7,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bdescriptortype = 5,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bendpointaddress = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bmattributes = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
wmaxpacketsize = 0,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
binterval = 0):
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.blength = blength
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdescriptortype = bdescriptortype
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bendpointaddress = bendpointaddress
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.bmattributes = bmattributes
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.wmaxpacketsize = wmaxpacketsize
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.binterval = binterval
ꢀꢀꢀꢀ
def __bytes__(self):
ꢀꢀꢀꢀꢀꢀꢀꢀ
return struct.pack('!bbbbhb', self.blength,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.bdescriptortype, self.bendpointaddress,
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.bmattributes, self.wmaxpacketsize, self.binterval)随后,执行步骤s320,根据打印机配置构建每个实体打印机对应的虚拟打印机,得到一个或多个虚拟打印机,并设置服务器120与一个或多个虚拟打印机连接。根据打印机配置构建每个实体打印机对应的虚拟打印机时,根据设备描述符、配置描述符、接口描述符和终结点描述符构建实体打印机对应的虚拟打印机。
45.服务器120中构建有主机控制器122。主机控制器122可实现为usb主机控制器,本发明对主机控制器122的类型不作限制。主机控制器122为虚拟的主机控制器,用于连接服务器120所构建的虚拟打印机。
46.服务器120中生成有设备列表,设备列表中包括与服务器120连接的一个或多个虚拟打印机。具体的,服务器120通过定义一个设备列表的类(devicelist类)构建并管理打印机列表。
47.devicelist类包括:class devicelist():
ꢀꢀꢀꢀ
def __init__(self):
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.device_list = []
ꢀꢀꢀꢀ
def add(self, device):
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.device_list.append(device)
ꢀꢀꢀꢀ
def __bytes__(self):
ꢀꢀꢀꢀꢀꢀꢀꢀ
ret = struct.pack('!i', len(self.device_list))
ꢀꢀꢀꢀꢀꢀꢀꢀ
for device in self.device_list:
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
ret = bytes(device)
ꢀꢀꢀꢀꢀꢀꢀꢀ
return ret
ꢀꢀꢀꢀ
def find_device(self, busid):
ꢀꢀꢀꢀꢀꢀꢀꢀ
for device in self.device_list:
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if busid == device.busid:
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return device随后,执行步骤s330,服务器120发送设备列表请求以便获取与服务器120连接的一个或多个虚拟打印机。客户端110中运行有操作系统113,并且操作系统113中包括内核114和驱动库115,驱动库115中包括多种驱动程序。
[0048]
根据本发明的一个实施例,客户端110与服务器120进行通信时,采用usbip协议进行通信。具体的客户端110通过向服务器120发送命令:op_req_devlist,向服务器120发送设备列表请求。
[0049]
随后,执行步骤s340,服务器120当接收到客户端110的设备列表请求时,将设备列表发送到客户端110。服务器120中通过定义一个usbip协议的类来解析客户端110的设备列表请求。
[0050]
usbip协议的类包括:class usbipheader():
ꢀꢀꢀꢀ
def __init__(self, data):
ꢀꢀꢀꢀꢀꢀꢀꢀ
tpl = struct.unpack('!hhi', data)
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.version = tpl[0]
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.code = tpl[1]
ꢀꢀꢀꢀꢀꢀꢀꢀ
self.status = tpl[2]
ꢀꢀꢀꢀ
def __str__(self):
ꢀꢀꢀꢀꢀꢀꢀꢀ
return 'version:{0:x}, code:{1:x}, status:{2:x}'.format(
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
self.version, self.code, self.status)
ꢀꢀꢀꢀ
def __bytes__(self):
ꢀꢀꢀꢀꢀꢀꢀꢀ
return struct.pack('!hhi', self.version, self.code, self.status)服务器120对客户端110的设备列表请求进行解析,并将设备列表发送至客户端110。
[0051]
随后,客户端110执行步骤s350,从服务器120发送的设备列表中选择要连接的虚拟打印机,并向服务器120发送虚拟打印机连接请求,以便服务器120根据所选择的虚拟打印机生成离线打印机数据。
[0052]
根据本发明的一个实施例,客户端110通过向服务器120发送命令op_req_import,向服务器120发送虚拟打印机连接请求。
[0053]
虚拟打印机连接请求中包括客户端110从设备列表中选择的虚拟打印机。服务器120在接收到虚拟打印机连接请求,向客户端110发送连接确认信息。客户端110当接收到服务器120发送的连接确认信息,根据所述连接确认信息与所述虚拟打印机建立通信连接,并根据与所述虚拟打印机的通信连接向所述服务器120发送获取离线打印机数据的请求,以便所述服务器120在接收到所述客户端110获取离线打印机数据的请求后生成离线打印机数据。
[0054]
根据本发明的一个实施例,客户端110通过向服务器120发送命令usbip_cmd_submit,向服务器120发送获取离线打印机数据的请求。
[0055]
获取离线打印机数据的请求中包括请求设备描述符、请求通讯标识和请求端口信息的自命令,分别用于获取设备描述符、通讯标识和端口信息。
[0056]
随后,服务器120执行步骤s360,当接收到客户端110根据设备列表中选择的虚拟打印机的连接请求时,根据选择的虚拟打印机所对应的打印机信息和打印机配置生成离线打印机数据。
[0057]
具体的,服务器120向客户端110发送连接确认信息,以便客户端110根据连接确认信息与虚拟打印机建立通信连接,并根据与虚拟打印机的通信连接向服务器120发送获取离线打印机数据的请求。
[0058]
根据本发明的一个实施例,服务器120通过向客户端110发送命令:usbip_ret_submit,向客户端110发送连接确认信息。
[0059]
服务器120在接收到客户端110获取离线打印机数据的请求后,根据所选择的虚拟
打印机所对应的打印机信息和打印机配置生成离线打印机数据。离线打印机数据包括设备描述符、通讯标识和端口信息。服务器120生成离线打印机数据时,从设备信息中获取通讯标识,再从配置信息中获取设备描述符,根据主机控制器122与虚拟打印机所连接的端口号和端口状态值确定端口信息。
[0060]
随后,执行步骤s307,将离线打印机数据发送到客户端110,以便客户端根据离线打印机数据调用打印机驱动,输出打印数据。
[0061]
根据本发明的一个实施例,服务器120通过向客户端110发送命令:usbip_ret_submit,向客户端110发送离线打印数据。并且离线打印数据被打包成一个urb数据块,urb(usb request block)是usb 设备驱动中用来描述与usb 设备通信所用的基本载体和核心数据结构,包含请求的usb终结点、数据传递方向等重要信息。
[0062]
随后,执行步骤s308,当接收到服务器120发送的离线打印机数据时,构建主机控制器112,并通过虚拟的主机控制器112根据离线打印机数据向内核114发送枚举设备请求。客户端110构建主机控制器112,用于调用服务器120端连接的虚拟服务器120。
[0063]
主机控制器112在接收到端口信息后,会认为客户端110中实际连接了实体打印机。随后根据离线打印机数据中的端口信息,向所述内核114发送枚举设备请求。枚举设备请求用于告知内核114根据离线打印机数据进行驱动程序的匹配。
[0064]
随后,执行步骤s309,内核114接收到枚举设备请求后,通过内核114根据离线打印机数据从驱动库115中匹配虚拟打印机所对应的驱动程序。具体的,根据设备描述符和通讯标识从驱动库115中匹配与虚拟打印机对应的驱动程序,从驱动库115中查找到与虚拟打印机对应的驱动程序。
[0065]
最后,执行步骤s310,通过内核114调用所匹配到的驱动程序输出打印数据。具体的,内核114通过usbip驱动根据虚拟打印机的离线打印机数据模拟安装实体打印机,并将模拟的实体打印机注册到操作系统113的设备总线。从而操作系统113中的打印机驱动测试程序可以正常调用该模拟的实体打印机匹配的驱动程序,输出打印数据。打印数据包括控制打印机工作的命令,使打印机根据命令组织被打印的文档,打印机按照这些命令来处理计算机传来的打印数据,并最终准确的打印出文字与图像。
[0066]
根据打印数据,能够开发和调试打印驱动。在对新操作系统进行开发时,为了能够构建新打印驱动以适配实体打印机,需要研究实体打印机的驱动程序在现有操作系统下工作原理和底层依赖,根据打印驱动的打印数据,能够开发和调试打印驱动。而这些打印机不仅数量众多,有些老旧打印机无从购买,并且散步在全国各地,无法每个打印机均到现场进行测试。而操作系统判断计算机没有接入实体打印机,就不调用打印驱动输出答应数据。因此本发明通过方法300获取打印数据。
[0067]
根据本发明的一个实施例,方法还包括步骤:根据打印数据构建新驱动程序,新驱动程序适配于新操作系统。新驱动程序根据答应数据和新操作系统进行构建,用于在新操作系统环境下运行,并为相应的实体打印机提供服务。随后在客户端110中安装新操作系统,即能够在新操作系统中运行新驱动程序以调用虚拟打印机对应的实体打印机。
[0068]
本发明公开了一种模拟打印方法,适于在服务器中执行。具体的,只需要有实体打印机的打印机信息,根据打印机信息生成打印机配置,进一步的即可根据打印机配置构建虚拟打印机。服务器在接收到客户端根据所述设备列表中选择的虚拟打印机的连接请求
时,根据虚拟打印机所对应的打印机信息和打印机配置生成离线打印机数据。随后,将虚拟打印机数据发送到客户端,客户端即可根据离线打印机数据调用打印机驱动,输出打印数据。本发明中的模拟打印方法,不要实际的采购并安装打印机,节约大量时间和经费,仅需要打印机的打印机信息就能够完成对各种打印机的打印机驱动的开发。并且通过在服务器端构建虚拟打印机,客户端获取虚拟打印机的离线打印机数据后,从而能够调用服务器的虚拟打印机,并且即使与服务器切段连接后,还能够正常通过离线打印机数据进行离线打印,调用打印机驱动,输出打印数据。
[0069]
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0070]
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。
[0071]
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组间可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
[0072]
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组间组合成一个模块或单元或组间,以及此外可以把它们分成多个子模块或子单元或子组间。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0073]
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。
[0074]
此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
[0075]
这里描述的各种技术可结合硬件或软件,或者它们的组合一起实现。从而,本发明的方法和设备,或者本发明的方法和设备的某些方面或部分可采取嵌入有形媒介,例如软盘、cd-rom、硬盘驱动器或者其它任意机器可读的存储介质中的程序代码(即指令)的形式,其中当程序被载入诸如计算机之类的机器,并被所述机器执行时,所述机器变成实践本发明的设备。
[0076]
在程序代码在可编程计算机上执行的情况下,计算设备一般包括处理器、处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件),至少一个输入装置,和至少一个输出装置。其中,存储器被配置用于存储程序代码;处理器被配置用于根据该存储器中存储的所述程序代码中的指令,执行本发明模拟打印方法。
[0077]
以示例而非限制的方式,计算机可读介质包括计算机存储介质和通信介质。计算机可读介质包括计算机存储介质和通信介质。计算机存储介质存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息。通信介质一般以诸如载波或其它传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其它数据,并且包括任何信息传递介质。以上的任一种的组合也包括在计算机可读介质的范围之内。
[0078]
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
[0079]
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的,而非限制性的,本发明的范围由所附权利要求书限定。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献