一种Mac系统中与USB设备通讯的方法及装置与流程

文档序号:16106312发布日期:2018-11-30 19:15阅读:1105来源:国知局

本发明涉及通信领域,尤其涉及一种Mac系统中与USB设备通讯的方法及装置。



背景技术:

现有技术中,在Mac10.10以上的操作系统中,使用USB设备时,如果安装该USB设备的安装包文件之前插入了该USB设备,则系统会第一时间独享该USB设备的通信权限,因此其他应用在访问该USB设备时,系统会报错;而为了其他应用能够获得该USB设备的通信权限,需要用户重新插拔该USB设备,降低了用户体验。



技术实现要素:

为解决现有技术中存在的技术问题,本发明提供了一种Mac系统中与USB设备通讯的方法及装置。

一方面,本发明提供了一种Mac系统中与USB设备通讯的方法,包括:

步骤S1:应用程序获取已插入USB设备的设备信息,在获取到的设备信息中查找到与目标USB设备匹配的第一设备信息;

步骤S2:所述应用程序连接第一设备信息对应的USB设备,如接收到预设错误码,则执行步骤S3;如连接成功,则与所述第一设备信息对应的USB设备进行数据通讯;

步骤S3:所述应用程序调用预设函数接口来枚举所述第一设备信息对应的USB设备,返回步骤S1;或者所述应用程序切断所述第一设备信息对应的USB设备与系统之间的连接并重新建立连接,返回步骤S1。

可选地,所述步骤S1之前,还包括:所述应用程序创建第一设备字典,并将所述目标USB设备的设备信息添加到所述第一设备字典中。

可选地,所述步骤S1中,所述在获取到的设备信息中查找到与目标USB设备匹配的第一设备信息,具体为:所述应用程序在所述获取到的设备信息中查找到与所述第一设备字典中的设备信息相同的第一设备信息。

可选地,所述步骤S2之前,还包括:

步骤A:所述应用程序获取第一设备信息对应的USB设备的设备类型。

可选地,所述步骤A之前,还包括:

步骤B:所述应用程序获取第一设备信息对应的USB设备的第一设备标识并保存到存储区中;

所述步骤A,具体为:所述应用程序根据所述第一设备标识,获取第一设备信息对应的USB设备的设备类型;

所述步骤S3中,返回步骤S1之前,还包括:清除所述存储区中与所述第一设备信息对应的USB设备对应的第一设备标识。

可选地,所述步骤B中,所述应用程序获取第一设备信息对应的USB设备的第一设备标识,具体为:

所述应用程序创建第一插件对象,通过所述第一插件对象获取第一设备信息对应的USB设备的第一设备标识,在获取到所述第一设备标识之后,释放所述第一插件对象。

可选地,当所述应用程序获取到第一设备信息对应的USB设备的设备类型为SCSI时,

所述预设错误码,具体为:第一独享设备错误码;

所述步骤S2,具体为:所述应用程序连接第一设备信息对应的USB设备并打开所述第一设备信息对应的USB设备的通讯接口,如接收到第一独享设备错误码,则执行步骤S3;如打开成功,则与所述第一设备信息对应的USB设备进行数据通讯。

可选地,所述步骤S3中,所述应用程序切断所述第一设备信息对应的USB设备与系统之间的连接并重新建立连接,具体为:

所述应用程序执行第一卸载指令来卸载设备类型为SCSI的USB设备的系统驱动,并执行第一加载指令来加载所述设备类型为SCSI的USB设备的系统驱动;

或者,

所述应用程序执行第二卸载指令来卸载USB设备的系统驱动类,并在监听到有USB设备插入时,自动加载所述USB设备的系统驱动类。

可选地,所述步骤S2之前,还包括:

步骤C:所述应用程序获取第一设备信息对应的USB设备的第一端口地址并判断所述存储区中是否存在所述第一端口地址,是则在监听到USB设备插入时,返回步骤S1,否则将所述第一端口地址保存到存储区中,执行步骤S2;

所述步骤S3中,返回步骤S1之前,还包括:清除所述存储区中与所述第一设备信息对应的USB设备对应的第一端口地址。

可选地,所述步骤S2中,所述应用程序连接第一设备信息对应的USB设备,具体包括:

步骤b1:所述应用程序创建第二设备字典并添加所述目标USB设备的设备信息到所述第二设备字典中;

步骤b2:所述应用程序获取已插入USB设备的设备信息,在获取到的设备信息中查找到与所述第二设备字典中的设备信息相同的第二设备信息;

步骤b3:所述应用程序获取第二设备信息对应的USB设备的第二端口地址,并判断所述第二端口地址与所述第一端口地址是否相同,是则连接第一设备信息对应的USB设备,否则在监听到USB设备插入时,返回步骤S1。

可选地,所述打开所述第一设备信息对应的USB设备的通讯接口之前,还包括:

步骤D:所述应用程序打开所述第一设备信息对应的USB设备并查找到所述第一设备信息对应的USB设备的通讯接口。

可选地,所述步骤D,具体为:所述应用程序调用第二函数接口打开所述第一设备信息对应的USB设备并创建第三插件对象,所述第三插件对象根据预设条件查找到所述第一设备信息对应的USB设备的通讯接口。

可选地,当所述应用程序获取到第一设备信息对应的USB设备的设备类型为CCID时,

所述预设错误码,具体为:第二独享设备错误码;

所述步骤S2,具体为:所述应用程序连接第一设备信息对应的USB设备,如接收到第二独享设备错误码,则执行步骤S3;如连接成功,则与所述第一设备信息对应的USB设备进行数据通讯。

可选地,所述步骤S2之前,还包括:

步骤E:所述应用程序检测PC/SC服务是否打开,是则执行步骤S2,否则打开所述PC/SC服务,执行步骤S2。

可选地,所述步骤S3中,所述应用程序切断所述第一设备信息对应的USB设备与系统之间的连接并重新建立连接,具体为:

所述应用程序关闭所述PC/SC服务,并重新打开所述PC/SC服务。

可选地,所述步骤S2之前,还包括:

步骤F:所述应用程序创建上下文环境,并在所述上下文环境中获取已插入设备类型为CCID的USB设备的设备列表,判断获取到的设备列表中是否含有所述目标USB设备的设备名称,是则将所述目标USB设备的设备名称与所述上下文环境对应保存,否则在监听到有USB设备插入时,返回步骤S1。

可选地,所述步骤S2中,所述应用程序连接第一设备信息对应的USB设备,具体为:

所述应用程序在所述上下文环境中调用第九函数接口连接保存的设备名称对应的USB设备。

另一方面,本发明提供了一种Mac系统中与USB设备通讯的装置,包括:

第一获取模块、查找模块、连接模块、通讯模块、接收模块和调用模块;

或者,

第一获取模块、查找模块、连接模块、通讯模块、接收模块和控制模块;

所述第一获取模块,用于获取已插入USB设备的设备信息;

所述查找模块,用于在所述第一获取模块获取到的设备信息中查找到与目标USB设备匹配的第一设备信息;

所述连接模块,用于连接所述查找模块查找到的第一设备信息对应的USB设备;

所述通讯模块,用于所述连接模块连接成功时,与所述第一设备信息对应的USB设备进行数据通讯;

所述接收模块,用于所述连接模块连接失败时,接收错误码;

所述调用模块,用于当所述接收模块接收到预设错误码时,调用预设函数接口来枚举所述第一设备信息对应的USB设备;

所述控制模块,用于当所述接收模块接收到预设错误码时,切断所述第一设备信息对应的USB设备与系统之间的连接并重新建立连接;

所述第一获取模块,还用于所述调用模块调用预设函数接口来枚举所述第一设备信息对应的USB设备之后,获取已插入USB设备的设备信息;还用于所述控制模块切断所述第一设备信息对应的USB设备与系统之间的通信并重新建立通信之后,获取已插入USB设备的设备信息。

可选地,所述装置,还包括:

创建模块,用于所述第一获取模块获取已插入USB设备的设备信息之前,创建第一设备字典,并将所述目标USB设备的设备信息添加到所述第一设备字典中。

可选地,所述查找模块,具体用于:在所述第一获取模块获取到的设备信息中查找到与所述第一设备字典中的设备信息相同的第一设备信息。

可选地,所述装置,还包括:

第二获取模块,用于所述连接模块连接所述查找模块查找到的第一设备信息对应的USB设备之前,获取第一设备信息对应的USB设备的设备类型。

可选地,所述装置,还包括:第三获取模块、保存模块和清除模块;

所述第三获取模块,用于所述第二获取模块获取第一设备信息对应的USB设备的设备类型之前,获取第一设备信息对应的USB设备的第一设备标识;

所述保存模块,用于将所述第三获取模块获取到的第一设备标识保存到存储区中;

所述第二获取模块,具体用于:根据所述第三获取模块获取到的第一设备标识,获取第一设备信息对应的USB设备的设备类型;

所述清除模块,用于所述调用模块触发所述第一获取模块之前,清除所述存储区中与所述第一设备信息对应的USB设备对应的第一设备标识;还用于所述控制模块触发所述第一获取模块之前,清除所述存储区中与所述第一设备信息对应的USB设备对应的第一设备标识。

可选地,所述第三获取模块,具体包括:

第一创建子模块,用于创建第一插件对象;

第一获取子模块,用于通过所述第一创建子模块创建的第一插件对象获取第一设备信息对应的USB设备的第一设备标识;

释放子模块,用于所述第一获取子模块获取到所述第一设备标识之后,释放所述第一插件对象。

可选地,当所述第二获取模块获取到第一设备信息对应的USB设备的设备类型为SCSI时,还包括:打开模块;

所述预设错误码,具体为:第一独享设备错误码;

所述连接模块,具体用于:连接第一设备信息对应的USB设备;

所述打开模块,用于所述连接模块连接第一设备信息对应的USB设备之后,打开所述第一设备信息对应的USB设备的通讯接口;

所述通讯模块,具体用于:当所述打开模块打开成功时,与所述第一设备信息对应的USB设备进行数据通讯;

所述调用模块,具体用于:当所述接收模块接收到第一独享设备错误码时,调用预设函数接口来枚举所述第一设备信息对应的USB设备;

所述控制模块,具体用于:当所述接收模块接收到第一独占设备错误码时,切断所述第一设备信息对应的USB设备与系统之间的连接并重新建立连接。

可选地,所述控制模块,具体用于:

执行第一卸载指令来卸载设备类型为SCSI的USB设备的系统驱动,并执行第一加载指令来加载所述设备类型为SCSI的USB设备的系统驱动;

或者,

执行第二卸载指令来卸载USB设备的系统驱动类,并在监听到USB设备插入时,自动加载所述USB设备的系统驱动类。

可选地,所述装置,还包括:第四获取模块和第一判断模块;

所述第四获取模块,用于所述连接模块连接第一设备信息对应的USB设备之前,获取第一设备信息对应的USB设备的第一端口地址;

所述第一判断模块,用于判断所述存储区中是否存在所述第一端口地址;

所述第一获取模块,还用于当所述第一判断模块判断出所述存储区中存在所述第一端口地址,且在监听到USB设备插入时,获取已插入USB设备的设备信息;

所述保存模块,还用于当所述第一判断模块判断出所述存储区中不存在所述第一端口地址时,将所述第一端口地址保存到存储区中;

所述连接模块,具体用于:所述保存模块将所述第一端口地址保存到存储区中之后,连接第一设备信息对应的USB设备;

所述清除模块,还用于当所述调用模块触发所述第一获取模块之前,清除所述存储区中与所述第一设备信息对应的USB设备对应的第一端口地址;还用于所述控制模块触发所述第一获取模块之前,清除所述存储区中与所述第一设备信息对应的USB设备对应的第一端口地址。

可选地,所述连接模块,具体包括:

第二创建子模块,用于创建第二设备字典并添加所述目标USB设备的设备信息到所述第二设备字典中;

第二获取子模块,用于获取已插入USB设备的设备信息;

查找子模块,用于在所述第二获取子模块获取到的设备信息中查找到与所述第二设备字典中的设备信息相同的第二设备信息;

第三获取子模块,用于获取第二设备信息对应的USB设备的第二端口地址;

判断子模块,用于判断所述第二端口地址与所述第一端口地址是否相同;

连接子模块,用于当所述判断子模块判断出所述第二端口地址与所述第一端口地址相同时,连接第一设备信息对应的USB设备;

所述第一获取模块,还用于当所述判断子模块判断出所述第二端口地址与所述第一端口地址不同时,在监听到USB设备插入时,获取已插入USB设备的设备信息。

可选地,所述装置,还包括:

打开查找模块,用于所述打开模块打开所述第一设备信息对应的USB设备的通讯接口之前,打开所述第一设备信息对应的USB设备并查找到所述第一设备信息对应的USB设备的通讯接口。

可选地,所述打开查找模块,具体用于:调用第二函数接口打开所述第一设备信息对应的USB设备并创建第三插件对象,所述第三插件对象根据预设条件查找到所述第一设备信息对应的USB设备的通讯接口。

可选地,当所述第二获取模块获取到第一设备信息对应的USB设备的设备类型为CCID时;

所述预设错误码,具体为:第二独享设备错误码;

所述连接模块,具体用于:连接第一设备信息对应的USB设备;

所述通讯模块,具体用于:当所述连接模块连接成功时,与所述第一设备信息对应的USB设备进行数据通讯;

所述调用模块,具体用于:当所述接收模块接收到第二独享设备错误码时,调用预设函数接口来枚举所述第一设备信息对应的USB设备;

所述控制模块,具体用于:当所述接收模块接收到第二独享设备错误码时,切断所述第一设备信息对应的USB设备与系统之间的连接并重新建立连接。

可选地,所述装置,还包括:检测模块和打开模块;

所述检测模块,用于所述连接模块连接第一设备信息对应的USB设备之前,检测PC/SC服务是否打开;

所述打开模块,用于当所述检测模块检测到PC/SC服务未打开时,打开所述PC/SC服务;

所述连接模块,具体用于:当所述检测模块检测到PC/SC服务打开时,连接第一设备信息对应的USB设备;还用于所述打开模块打开所述PC/SC服务时,连接第一设备信息对应的USB设备。

可选地,所述控制模块,具体用于:

关闭所述PC/SC服务,并重新打开所述PC/SC服务。

可选地,所述装置,还包括:创建模块、第五获取模块、第二判断模块;

所述创建模块,用于所述连接模块连接第一设备信息对应的USB设备之前,创建第一上下文环境;

所述第五获取模块,用于在所述第一上下文环境中获取已插入设备类型为CCID的USB设备的设备列表;

所述第二判断模块,用于判断获取到的设备列表中是否含有所述目标USB设备的设备名称;

所述保存模块,还用于当所述第二判断模块判断出获取到的设备列表中含有所述目标USB设备的设备名称时,将所述目标USB设备的设备名称与所述第一上下文环境对应保存;

所述第一获取模块,还用于当所述第二判断模块判断出获取到的设备列表中不含有所述目标USB设备的设备名称时,在监听到有USB设备插入时,获取已插入USB设备的设备信息。

可选地,所述连接模块,具体用于:在所述第一上下文环境中调用第九函数接口连接保存的设备名称对应的USB设备。

本发明与现有技术相比,具有以下优点:当系统独享USB设备的通信权限时,能够实现模拟USB设备的插拔从而使其他应用获得该USB设备的通信权限,减少了用户操作,提升用户体验。

附图说明

图1为本发明实施例一提供的一种Mac系统中与USB设备通讯的方法流程图;

图2为本发明实施例二提供的一种Mac系统中与USB设备通讯的方法流程图;

图3为本发明实施例三提供的一种Mac系统中与USB设备通讯的方法流程图;

图4为本发明实施例四提供的一种Mac系统中与USB设备通讯的装置图;

图5为本发明实施例四提供的另一种Mac系统中与USB设备通讯的装置图。

具体实施例方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一

本发明实施例一提供一种Mac系统中与USB设备通讯的方法,如图1所示,包括:

步骤101:应用程序获取已插入USB设备的设备信息,在获取到的设备信息中查找到与目标USB设备匹配的第一设备信息;

在本实施例中,步骤101之前,还包括:应用程序创建第一设备字典,并将目标USB设备的设备信息添加到第一设备字典中;

相应地,在获取到的设备信息中查找到与目标USB设备匹配的第一设备信息,具体为:在获取到的设备信息中查找到与第一设备字典中的设备信息相同的第一设备信息;

需要说明地,在本实施例中,应用程序在系统中注册监听函数来实时监听USB设备的插入,当监听到有USB设备插入时,执行步骤101;

在本实施例中,目标USB设备的设备信息优选为PID和VID;例如,目标USB设备的PID为0601、VID为085A,则应用程序将0601和085A添加到第一设备字典中。

步骤102:应用程序连接第一设备信息对应的USB设备,如接收到预设错误码,则执行步骤103;如连接成功,则与第一设备信息对应的USB设备进行数据通讯;

在本实施例中,步骤102之前,还包括:

步骤A:应用程序获取第一设备信息对应的USB设备的设备类型;

在本实施例中,步骤A之前,还包括:

步骤B:应用程序获取第一设备信息对应的USB设备的第一设备标识并保存到存储区中;

具体地,应用程序创建第一插件对象,通过第一插件对象获取第一设备信息对应的USB设备的第一设备标识,在获取到第一设备标识之后,释放第一插件对象。

相应地,步骤A,具体为:应用程序根据第一设备标识,获取第一设备信息对应的USB设备的设备类型;

由步骤103返回步骤101之前,还包括:清除存储区中与第一设备信息对应的USB设备对应的第一设备标识。

进一步地,在本实施例中,当步骤A中,应用程序获取到第一设备信息对应的USB设备的设备类型为SCSI时,

预设错误码,具体为:第一独享设备错误码;优选地,第一独享设备错误码为0xe00002c5;

相应地,步骤102具体为:应用程序连接第一设备信息对应的USB设备并打开第一设备信息对应的USB设备的通讯接口,如接收到第一独享设备错误码,则执行步骤103;如打开成功,则与第一设备信息对应的USB设备进行数据通讯。

可选地,步骤102之前,还包括:

步骤C:应用程序获取第一设备信息对应的USB设备的第一端口地址并判断存储区中是否存在第一端口地址,是则在监听到USB设备插入时,返回步骤101,否则将第一端口地址保存到存储区中,执行步骤102;

相应地,由步骤103返回步骤101之前,还包括:清除存储区中与第一设备信息对应的USB设备对应的第一端口地址。

可选地,步骤S2中,打开第一设备信息对应的USB设备的通讯接口之前,还包括:

步骤D:应用程序打开第一设备信息对应的USB设备并查找到第一设备信息对应的USB设备的通讯接口;

具体地,应用程序调用第二函数接口打开第一设备信息对应的USB设备并创建第三插件对象,第三插件对象根据预设条件查找到第一设备信息对应的USB设备的通讯接口;

优选地,第二函数接口为:USBDeviceOpen(m_dev),其中,参数m_dev具体为第一设备信息对应的USB设备。

在本实施例中,步骤102中,应用程序连接第一设备信息对应的USB设备,具体包括:

步骤b1:应用程序创建第二设备字典并添加目标USB设备的设备信息到第二设备字典中;

步骤b2:应用程序获取已插入USB设备的设备信息,在获取到的设备信息中查找到与第二设备字典中的设备信息相同的第二设备信息;

步骤b3:应用程序获取第二设备信息对应的USB设备的第二端口地址,并判断第二端口地址与第一端口地址是否相同,是则连接第一设备信息对应的USB设备,否则在监听到USB设备插入时,返回步骤101.

更进一步地,当步骤A中,应用程序获取到第一设备信息对应的USB设备的设备类型为CCID时,

预设错误码,具体为:第二独享设备错误码;优选地,第二独享设备错误码为0x80100017;

相应地,步骤102具体为:应用程序连接第一设备信息对应的USB设备,如接收到第二独享设备错误码,则执行步骤103;如连接成功,则与第一设备信息对应的USB设备进行数据通讯;

可选地,步骤S2之前,还包括:

步骤E:应用程序检测PC/SC服务是否打开,是则执行步骤102,否则打开PC/SC服务,执行步骤102。

可选地,步骤S2之前,还包括:

步骤F:应用程序创建第一上下文环境,并在第一上下文环境中获取已插入设备类型为CCID的USB设备的设备列表,判断获取到的设备列表中是否含有目标USB设备的设备名称,是则将目标USB设备的设备名称与第一上下文环境对应保存,否则在监听到有USB设备插入时,返回步骤S1。

相应地,步骤S2中,应用程序连接第一设备信息对应的USB设备,具体为:

应用程序在第一上下文环境中调用第九函数接口连接保存的设备名称对应的USB设备。

步骤103:应用程序调用预设函数接口来枚举第一设备信息对应的USB设备,返回步骤S1;或者应用程序切断第一设备信息对应的USB设备与系统之间的连接并重新建立连接,返回步骤101。

在本实施例中,应用程序调用预设函数接口来枚举第一设备信息对应的USB设备,相当于模拟第一设备信息对应的USB设备拔出后再重新插入的操作,此时第一设备信息对应的USB设备的安装包文件已安装完成,能够拦截系统与USB设备之间的通信,因此在返回步骤101时,其他应用享有与第一设备信息对应的USB设备的通讯权限。

需要说明地,在本实施例中,步骤103中,切断第一设备信息对应的USB设备与系统之间的连接,具体为切断系统独享第一设备信息对应的USB设备的权限,当重新建立连接时,第一设备信息对应的USB设备的安装包文件已安装完成,能够拦截系统与USB设备之间的通信,因此返回步骤101之后,其他应用享有与第一设备信息对应的USB设备的通讯权限;

可选地,当第一设备信息对应的USB设备的设备类型为SCSI时,应用程序切断第一设备信息对应的USB设备与系统之间的连接并重新建立连接,具体为:

应用程序执行第一卸载指令来卸载设备类型为SCSI的USB设备的系统驱动,并执行第一加载指令来加载设备类型为SCSI的USB设备的系统驱动;除此之外,当插入设备还包括HID设备时,对HID设备不会产生影响;

或者,

应用程序执行第二卸载指令来卸载USB设备的系统驱动类,并在监听到有USB设备插入时,自动加载USB设备的系统驱动类,模拟USB设备的重新插入。

可选地,当第一设备信息对应的USB设备的设备类型为CCID时,应用程序切断第一设备信息对应的USB设备与系统之间的连接并重新建立连接,具体为:

应用程序关闭PC/SC服务,并重新打开PC/SC服务。

实施例二

本发明实施例二提供一种Mac系统中与USB设备通讯的方法,本实施例中的USB设备的设备类型为SCSI,如图2所示,包括:

步骤201:应用程序创建第一设备字典,并开启监听线程实时监听USB设备的插入,当监听到有USB设备插入时,执行步骤202;

具体地,应用程序调用主端口,在主端口中创建第一设备字典并添加目标USB设备的设备信息到第一设备字典中;优选地,在本实施例中,调用的主端口为IOMasterPort(MACH_PORT_NULL,&masterPort),其中,&masterPort具体为调用的主端口的句柄,创建的第一设备字典为matchingDict,应用程序将目标USB设备的PID和VID添加到matchingDict中;

例如,目标USB设备的PID为0601、VID为085A,则应用程序将0601和085A添加到matchingDict中。

进一步地,在本实施例中,应用程序在系统中注册监听线程,并开启所述监听线程来实时监听USB设备的插入。

步骤202:应用程序获取已插入USB设备的设备信息,在获取到的设备信息中查找到与第一设备字典中的设备信息相同的第一设备信息;

在本实施例中,应用程序获取已插入USB设备的设备信息,具体为:应用程序获取已插入USB设备的PID和VID;

具体地,应用程序调用第一函数接口来获取已插入USB设备,读取插入USB设备的Oemid文件中的PID和VID,并从中查找到与第一设备字典中的PID和VID相同的PID和VID;

在本实施例中,第一函数接口具体为:

IOServiceGetMatchingServices(masterPort,matchingDict,&iteratorDevice);

其中,参数masterPort具体为调用的主端口,参数matchingDict具体为第一设备字典,参数iteratorDevice具体为调用该函数接口的返回结果;

需要说明地,设备的PID和VID在设备出厂时已预先设定并保存在设备中的Oemid文件中。

步骤203:应用程序获取第一设备信息对应的USB设备的第一设备标识和第一端口地址并保存;

具体地,应用程序创建第一插件对象,通过第一插件对象获取第一设备信息对应的USB设备的第一设备标识,在获取到第一设备标识之后,释放第一插件对象并根据第一设备标识获取第一端口地址,将获取到的第一设备标识和第一端口地址保存到存储区中;

进一步地,在本实施例中,当应用程序获取到第一设备标识和第一端口地址时,将其保存之前,还包括:应用程序判断存储区中是否存在第一端口地址,是则在监听到USB设备插入时,返回步骤202,否则将获取到的第一设备标识和第一端口地址保存到存储区中。

步骤204:应用程序连接第一设备信息对应的USB设备;

在本实施例中,步骤204具体包括:

步骤204-1:应用程序创建第二设备字典并添加目标USB设备的设备信息到第二设备字典中;

具体地,应用程序创建第二设备字典,并添加目标USB设备的PID和VID到第二设备字典中。

步骤204-2:应用程序获取已插入USB设备的设备信息,在获取到的设备信息中查找到与第二设备字典中的设备信息相同的第二设备信息;

在本实施例中,步骤204-2的实现过程与步骤202的实现过程相同,在此不再赘述。

步骤204-3:应用程序获取第二设备信息对应的USB设备的第二设备标识和第二端口地址,并判断第二端口地址与保存的第一端口地址是否相同,是则执行步骤204-4,否则在监听到USB设备插入时,返回步骤202;

具体地,应用程序创建第二插件对象,通过第二插件对象获取第二设备信息对应的USB设备的第二设备标识,在获取到第二设备标识之后,释放第二插件对象并根据第二设备标识获取第二端口地址。

步骤204-4:应用程序连接第一设备信息对应的USB设备。

步骤205:应用程序打开第一设备信息对应的USB设备,查找到符合SCSI协议的通讯接口;

具体地,应用程序调用第二函数接口打开第一设备信息对应的USB设备,获取第一设备信息对应的USB设备的所有通讯接口,并创建第三插件对象,第三插件对象根据预设条件在获取到的通讯接口中查找到符合SCSI协议的通讯接口;

在本实施例中,第二函数接口具体为:USBDeviceOpen(m_dev),其中,参数m_dev具体为第一设备信息对应的USB设备;

更加具体地,预设条件具体为如下赋值:

request.bInterfaceClass=kIOUSBFindInterfaceDontCare;

request.bInterfaceSubClass=kIOUSBFindInterfaceDontCare;

request.bInterfaceProtocol=kIOUSBFindInterfaceDontCare;

request.bAlternateSetting=kIOUSBFindInterfaceDontCare。

步骤206:应用程序打开查找到的通讯接口,如接收到第一预设错误码,则执行步骤207;如打开成功,则与第一设备信息对应的USB设备进行数据通讯;

优选地,在本实施例中,第一预设错误码具体为:第一独享设备错误码0xe00002c5,即系统独享第一设备信息对应的USB设备的通讯权限;

具体地,应用程序调用第三函数接口来打开查找到的通讯接口,当打开成功时,与第一设备信息对应的USB设备进行数据通讯,完成功能操作,例如,完成签名操作;当接收到第一独享设备错误码时,执行步骤207;

在本实施例中,第三函数接口具体为:USBInterfaceOpen(intf),其中,参数intf具体为通过第二插件对象查找到的通讯接口。

步骤207:应用程序枚举第一设备信息对应的USB设备,当监听到有USB设备插入时,返回步骤202;

具体地,应用程序调用第四函数接口来枚举第一设备信息对应的USB设备,并清空存储区中与第一设备信息对应的USB设备对应的第一设备标识和第一端口地址,所述第四函数接口具体为:

USBDeviceReEnumerate(m_dev,0);其中,第一参数m_dev具体为第一设备信息对应的USB设备,第二参数用于将来使用,在本实施例中可以忽略,故设置为0;

需要说明地,在本实施例中,当应用程序枚举第一设备信息对应的USB设备时,相当于模拟第一设备信息对应的USB设备的拔出后重新插入的操作,此时第一设备信息对应的USB设备的安装包文件已安装完成,能够拦截其与系统之间的通信,因而在返回步骤202之后,其他应用享有与第一设备信息对应的USB设备的通讯权限。

在本实施例中,当插入设备还包括HID设备时,对HID设备不会产生影响。

进一步地,在本实施例中,步骤207可以替换为:

步骤W1:应用程序卸载第一设备信息对应的USB设备的系统驱动;

具体地,应用程序执行第一卸载指令来卸载设备类型为SCSI的USB设备的驱动,模拟所有已插入设备类型为SCSI的USB设备的拔出;

优选地,第一卸载指令为kextunload/System/Library/Extensions/IOUSBMassStorageClass.kext。

步骤W2:应用程序重新加载第一设备信息对应的USB设备的系统驱动,当监听到有USB设备插入时,返回步骤202。

具体地,应用程序执行第一加载指令来加载设备类型为SCSI的USB设备的系统驱动,模拟设备类型为SCSI的USB设备的重新插入;

优选地,第一加载指令为kextload/System/Library/Extensions/IOUSBMassStorageClass.kext;

除此之外,当第一设备信息对应的USB设备的设备类型为HID时,应用程序执行相应的指令来卸载并加载其系统驱动。

更进一步地,在本实施例中,步骤W1和步骤W2还可以为:应用程序执行第二卸载指令来卸载USB设备的系统驱动类,模拟所有已插入USB设备的拔出,并在监听到有USB设备插入时,自动加载该USB设备的系统驱动类,模拟USB设备的重新插入;

优选地,第二卸载指令为kextunload-c IOSCSIProtocolServices;其中,USB设备的系统驱动类为IOSCSIProtocolServices。

实施例三

本发明实施例三提供一种Mac系统中与USB设备通讯的方法,如图3所示,包括:

步骤301:应用程序创建第一设备字典,并开启监听线程实时监听USB设备的插入,当监听到有USB设备插入时,执行步骤302;

具体地,应用程序调用主端口,在主端口中创建第一设备字典并添加目标USB设备的设备信息到第一设备字典中;优选地,在本实施例中,调用的主端口为IOMasterPort(MACH_PORT_NULL,&masterPort),其中,&masterPort具体为调用的主端口的句柄,创建的第一设备字典为matchingDict,应用程序将目标USB设备的PID和VID添加到matchingDict中;

例如,目标USB设备的PID为0601、VID为085A,则应用程序将0601和085A添加到matchingDict中。

进一步地,在本实施例中,应用程序在系统中注册监听线程,并开启所述监听线程来实时监听USB设备的插入。

步骤302:应用程序获取已插入USB设备的设备信息,在获取到的设备信息中查找到与第一设备字典中的设备信息相同的第一设备信息;

在本实施例中,应用程序获取已插入USB设备的设备信息,具体为:应用程序获取已插入USB设备的PID和VID;

具体地,应用程序调用第一函数接口来获取已插入USB设备,读取已插入USB设备的Oemid文件中的PID和VID,并从中查找到与第一设备字典中的PID和VID相同的PID和VID;

在本实施例中,第一函数接口具体为:

IOServiceGetMatchingServices(masterPort,matchingDict,&iteratorDevice);

其中,参数masterPort具体为调用的主端口,参数matchingDict具体为第一设备字典,参数iteratorDevice具体为调用该函数接口的返回结果;

需要说明地,设备的PID和VID在设备出厂时已预先设定并保存在设备中的Oemid文件中。

步骤303:应用程序获取第一设备信息对应的USB设备的第一设备标识并保存;

具体地,应用程序创建第一插件对象,通过第一插件对象获取第一设备信息对应的USB设备的第一设备标识,并保存到存储区中,在获取到第一设备标识之后,释放第一插件对象。

步骤304:应用程序获取第一设备信息对应的USB设备的设备类型,如为SCSI,则执行步骤305,如为CCID,则执行步骤309;

具体地,应用程序调用第四函数接口GetInterfaceClass(intf,&InterfaceClass)来获取第一设备信息对应的USB设备的设备类型,其中参数intf具体为第一设备标识,参数&InterfaceClass具体为设备类型,当其为1时,确认第一设备信息对应的USB设备的设备类型为SCSI,否则确认第一设备信息对应的USB设备的设备类型为CCID。

步骤305:应用程序获取第一设备信息对应的USB设备的第一端口地址并保存;

具体地,应用程序根据第一设备标识获取第一设备信息对应的USB设备的第一端口地址并保存到存储区中;

进一步地,在本实施例中,当应用程序获取到第一端口地址时,将其保存之前,还包括:应用程序判断存储区中是否存在第一端口地址,是则在监听到USB设备插入时,返回步骤302,否则将获取到的第一端口地址保存到存储区中。

步骤306:应用程序连接第一设备信息对应的USB设备;

在本实施例中,步骤306具体包括:

步骤306-1:应用程序创建第二设备字典并添加目标USB设备的设备信息到第二设备字典中;

具体地,应用程序创建第二设备字典,并添加目标USB设备的PID和VID到第二设备字典中。

步骤306-2:应用程序获取已插入USB设备的设备信息,在获取到的设备信息中查找到与第二设备字典中的设备信息相同的第二设备信息;

步骤306-3:应用程序获取第二设备信息对应的USB设备的第二设备标识和第二端口地址,并判断第二端口地址与保存的第一端口地址是否相同,是则执行步骤306-4,否则在监听到USB设备插入时,返回步骤302;

具体地,应用程序创建第二插件对象,通过第二插件对象获取第二设备信息对应的USB设备的第二设备标识,在获取到第二设备标识之后,释放第二插件对象并根据第二设备标识获取第二端口地址。

步骤306-4:应用程序连接第一设备信息对应的USB设备。

步骤307:应用程序打开第一设备信息对应的USB设备,查找到符合SCSI协议的通讯接口;

具体地,应用程序调用第二函数接口打开第一设备信息对应的USB设备,获取第一设备信息对应的USB设备的所有通讯接口,并创建第三插件对象,第三插件对象根据预设条件在获取到的通讯接口中查找到符合SCSI协议的通讯接口;

在本实施例中,第二函数接口具体为:USBDeviceOpen(m_dev),其中,参数m_dev具体为第一设备信息对应的USB设备;

更加具体地,预设条件具体为如下赋值:

request.bInterfaceClass=kIOUSBFindInterfaceDontCare;

request.bInterfaceSubClass=kIOUSBFindInterfaceDontCare;

request.bInterfaceProtocol=kIOUSBFindInterfaceDontCare;

request.bAlternateSetting=kIOUSBFindInterfaceDontCare。

步骤308:应用程序打开查找到的通讯接口,如接收到第一预设错误码,则执行步骤314;如打开成功,则与第一设备信息对应的USB设备进行数据通讯;

优选地,在本实施例中,第一预设错误码具体为:第一独享设备错误码0xe00002c5,即系统独享第一设备信息对应的USB设备的通讯权限;

具体地,应用程序调用第三函数接口来打开查找到的通讯接口,当打开成功时,与第一设备信息对应的USB设备进行数据通讯,完成功能操作,例如,完成签名操作;当接收到第一独享设备错误码时,执行步骤314;

在本实施例中,第三函数接口具体为:USBInterfaceOpen(intf),其中,参数intf具体为通过第二插件对象查找到的通讯接口;

优选地,在本实施例中,第一预设错误码具体为:0xe00002c5。

步骤309:应用程序检测PC/SC服务是否打开,是则执行步骤310,否则打开PC/SC服务,执行步骤310;

具体地,应用程序检测路径/var/run/下的pcscd文件是否存在,是则确认PC/SC服务已打开,否则确认PC/SC服务未打开。

步骤310:应用程序创建与资源管理器对应的上下文环境;

具体地,应用程序调用第五函数接口创建与资源管理器对应的上下文环境;

优选地,所述第五函数接口具体为:SCardEstablishContext(SCARD_SCOPE_SYSTEM,NULL,NULL,&hContext),其中,第一个参数具体为上下文环境的范围,在本实施例中,优选地,第一参数为SCARD_SCOPE_SYSTEM,表示上下文环境的范围是在系统域中完成对设备的操作,当第一参数为SCARD_SCOPE_USER时,表示上下文环境的范围是在用户域中完成对设备的操作;第二参数和第三参数用于保留,预定为NULL;第三参数hContext,具体为上下文环境的句柄。

需要说明地,在本实施例中,每个进程只能在与其对应的上下文环境中运行。

步骤311:应用程序在上下文环境中获取已插入设备类型为CCID的USB设备的设备列表;

具体地,应用程序将上下文环境的句柄hContext传入第六函数接口,并调用第六函数接口来获取已插入设备类型为CCID的USB设备的设备列表;

在本实施例中,第六函数接口具体为:LONG SCardListReaders(SCARDCONTEXT hContext,LPCSTR mszGroups,LPSTR mszRead ers,LPDWORD pcchReaders),其中,参数SCARDCONTEXT hContext具体为上下文环境的句柄;参数LPCSTR mszGroups具体为已插入设备类型为CCID的USB设备的组名,表示列出所有以插入设备类型为CCID的USB设备;参数LPSTR mszReaders具体为已插入设备类型为CCID的USB设备的设备名称,其中,每相邻的两个设备名称之间用“\0”分隔,最后一个设备名称之后为两个连续的“\0”;参数LPDWORD pcchReaders具体为设备名称的长度;

进一步地,在本实施例中,当已插入设备类型为CCID的USB设备中含有多个相同的USB设备时,在设备列表中,设备名称后添加预设标识予以区分,优选地,在设备名称后面添加00、01、02…予以区分;

例如,在本实例中,当已插入两个相同的USB设备时,则设备名称分别为“2000series 00 00”和“2000series 01 00”;

进一步地,在本实施例中,步骤310还可以为,应用程序调用第七函数接口得到所需分配缓存区的大小,之后调用第八函数接口获取已插入设备类型为CCID的USB设备的设备列表;

优选地,第七函数接口具体为:SCardListReaders(hContext,NULL,0,&dwReadersNameLen),第八函数接口具体为:SCardListReaders(hContext,NULL,mszReaders,&dwReadersNameLen)。

步骤312:应用程序判断获取到的设备列表中是否含有目标USB设备的设备名称,是则将目标USB设备的设备名称和设备类型与上下文环境对应保存,执行步骤313,否则当监听到USB设备插入时,返回步骤302;

在本实施例中,目标USB设备的设备名称预先设定并写入系统中。例如,;

例如,在本实施例中,目标USB设备的设备名称为“2000series”,设备类型为“2000series”;且已插入两个目标USB设备,则应用程序将设备名称和设备类型与上下文环境对应保存为:设备名称“2000series 00 00”、设备类型“2000series”,设备名称“2000series 01 00”、设备类型“2000series”。

步骤313:应用程序连接保存的设备名称对应的USB设备,如接收到第二预设错误码,则执行步骤314;如连接成功,则与保存的设备名称对应的USB设备进行数据通讯;

优选地,在本实施例中,第二预设错误码具体为:第二独享设备错误码0x80100017;

具体地,应用程序调用第九函数接口连接保存的设备名称对应的USB设备;

优选地,第九函数接口具体为:SCardConnect(&hContext,szReader,SCARD_SHARE_SHARED,SCARD_PROTOCO L_T0|SCARD_PROTOCOL_T1,(SCARDHANDLE*)&m_hCard,(uint32_t*)&dwProtocol),其中,参数&hContext为输入参数,具体为上下文环境的句柄;参数szReader为输入参数,具体为保存的设备名称;参数SCARD_SHARE_SHARED为输入参数,具体为应用程序对CCID设备的操作方式为多个应用共享该CCID设备;参数SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1为输入参数,具体为连接使用的协议为T=0协议或者T=1协议;参数(SCARDHANDLE*)&m_hCard为输出参数,具体为USB设备的数据通讯句柄,用于后续数据通讯使用;参数(uint32_t*)&dwProtocol为输出参数,具体为实际使用的协议;

进一步地,在本实施例中,当连接多个目标USB设备时,应用程序依次进行连接。

步骤314:应用程序枚举当前USB设备,当监听到USB设备插入时,返回步骤302。

具体地,应用程序调用第四函数接口来枚举当前USB设备,模拟当前USB设备的拔出后重新插入的操作,并且对其他已插入USB设备不产生影响;

优选地,第四函数接口具体为USBDeviceReEnumerate(m_dev,0);其中,第一参数m_dev具体为当前USB设备,第二参数用于将来使用,在本实施例中可以忽略,故设置为0;

进一步地,在本实施例中,当当前USB设备的设备类型为SCSI时,步骤314还可以为:

应用程序执行第一卸载指令kextunload/System/Library/Extensions/IOUSBMassStorageClass.kext来卸载设备类型为SCSI的USB设备的驱动,模拟所有已插入设备类型为SCSI的USB设备的拔出;执行第一加载指令kextload/System/Library/Extensions/IOUSBMassStorageClass.kext来加载设备类型为SCSI的USB设备的系统驱动,模拟设备类型为SCSI的USB设备的重新插入;

或者,

应用程序执行第二卸载指令kextunload-c IOSCSIProtocolServices来卸载USB设备的系统驱动类IOSCSIProtocolServices,模拟所有已插入USB设备的拔出,并在监听到有USB设备插入时,自动加载该USB设备的系统驱动类,模拟USB设备的重新插入。

上述模拟插拔操作之后,当前USB设备的安装包文件已安装完成,能够拦截其与系统之间的通信,因而在返回步骤302之后,其他应用享有与当前USB设备的通讯权限。

更进一步地,在本实施例中,当当前USB设备的设备类型为CCID时,步骤314还可以为:

应用程序关闭PC/SC服务,模拟所有已插入设备类型为CCID的USB设备的拔出,并重新打开PC/SC服务,模拟所有已插入设备类型为CCID的USB设备的插入。

更加具体地,当当前连接的USB设备的设备类型为HID时,应用程序执行相应的指令来卸载并重新加载设备类型为HID的USB设备的系统驱动,模拟设备类型为HID的USB设备的插拔。

实施例四

本发明实施例四提供一种Mac系统中与USB设备通讯的装置,如图4所示,包括:

第一获取模块401,用于获取已插入USB设备的设备信息;

查找模块402,用于在第一获取模块401获取到的设备信息中查找到与目标USB设备匹配的第一设备信息;

连接模块403,用于连接查找模块402查找到的第一设备信息对应的USB设备;

通讯模块404,用于当连接模块403连接成功时,与第一设备信息对应的USB设备进行数据通讯;

接收模块405,用于当连接模块403连接失败时,接收错误码;

调用模块406,用于当所述接收模块405接收到预设错误码时,调用预设函数接口来枚举第一设备信息对应的USB设备,模拟第一设备信息对应的USB设备的插拔;

第一获取模块401,还用于调用模块406调用预设函数接口来枚举第一设备信息对应的USB设备之后,获取已插入USB设备的设备信息。

本实施例中的装置,还包括:

创建模块,用于第一获取模块401获取已插入USB设备的设备信息之前,创建第一设备字典,并将目标USB设备的设备信息添加到第一设备字典中。

相应地,查找模块402,具体用于:在第一获取模块401获取到的设备信息中查找到与第一设备字典中的设备信息相同的第一设备信息。

本实施例中的装置,还包括:

第二获取模块,用于连接模块403连接查找模块402查找到的第一设备信息对应的USB设备之前,获取第一设备信息对应的USB设备的设备类型。

本实施例中的装置,还包括:第三获取模块、保存模块和清除模块;

其中,第三获取模块,用于第二获取模块获取第一设备信息对应的USB设备的设备类型之前,获取第一设备信息对应的USB设备的第一设备标识;

保存模块,用于将第三获取模块获取到的第一设备标识保存到存储区中;

第二获取模块,具体用于:根据第三获取模块获取到的第一设备标识,获取第一设备信息对应的USB设备的设备类型;

清除模块,用于调用模块406触发第一获取模块401之前,清除存储区中与第一设备信息对应的USB设备对应的第一设备标识。

在本实施例中,第三获取模块,具体包括:

第一创建子模块,用于创建第一插件对象;

第一获取子模块,用于通过第一创建子模块创建的第一插件对象获取第一设备信息对应的USB设备的第一设备标识;

释放子模块,用于第一获取子模块获取到第一设备标识之后,释放第一插件对象。

进一步地,在本实施例中,当第二获取模块获取到第一设备信息对应的USB设备的设备类型为SCSI时,所述装置还包括:打开模块;

相应地,预设错误码,具体为:第一独享设备错误码;

连接模块403,具体用于:连接第一设备信息对应的USB设备;

打开模块,用于连接模块403连接第一设备信息对应的USB设备之后,打开第一设备信息对应的USB设备的通讯接口;

通讯模块404,具体用于:当打开模块打开成功时,与第一设备信息对应的USB设备进行数据通讯;

调用模块406,具体用于:当接收模块405接收到第一独享设备错误码时,调用预设函数接口来枚举第一设备信息对应的USB设备,模拟第一设备信息对应的USB设备的插拔;

本实施例中的装置,还包括:第四获取模块和第一判断模块;

其中,第四获取模块,用于连接模块403连接第一设备信息对应的USB设备之前,获取第一设备信息对应的USB设备的第一端口地址;

第一判断模块,用于判断存储区中是否存在第一端口地址;

第一获取模块401,还用于当第一判断模块判断出存储区中存在所述第一端口地址,且在监听到USB设备插入时,获取已插入USB设备的设备信息;

保存模块,还用于当第一判断模块判断出存储区中不存在第一端口地址时,将第一端口地址保存到存储区中;

连接模块403,具体用于:保存模块将第一端口地址保存到存储区中之后,连接第一设备信息对应的USB设备;

清除模块,还用于当调用模块406触发第一获取模块401之前,清除存储区中与第一设备信息对应的USB设备对应的第一端口地址。

在本实施例中,当第二获取模块获取到第一设备信息对应的USB设备的设备类型为SCSI时,连接模块403,具体包括:

第二创建子模块,用于创建第二设备字典并添加目标USB设备的设备信息到第二设备字典中;

第二获取子模块,用于获取已插入USB设备的设备信息;

查找子模块,用于在第二获取子模块获取到的设备信息中查找到与第二设备字典中的设备信息相同的第二设备信息;

第三获取子模块,用于获取第二设备信息对应的USB设备的第二端口地址;

判断子模块,用于判断第二端口地址与第一端口地址是否相同;

连接子模块,用于当判断子模块判断出第二端口地址与第一端口地址相同时,连接第一设备信息对应的USB设备;

第一获取模块401,还用于当判断子模块判断出第二端口地址与第一端口地址不同时,在监听到USB设备插入时,获取已插入USB设备的设备信息。

本实施例中的装置,还包括:

打开查找模块,用于打开模块打开第一设备信息对应的USB设备的通讯接口之前,打开第一设备信息对应的USB设备并查找到第一设备信息对应的USB设备的通讯接口。

进一步地,打开查找模块,具体用于:调用第二函数接口打开第一设备信息对应的USB设备并创建第三插件对象,第三插件对象根据预设条件查找到第一设备信息对应的USB设备的通讯接口。

更进一步地,在本实施例中,当第二获取模块获取到第一设备信息对应的USB设备的设备类型位为CCID时;

相应地,预设错误码,具体为:第二独享设备错误码;

连接模块403,具体用于:连接第一设备信息对应的USB设备;

通讯模块404,具体用于:当连接模块403连接成功时,与第一设备信息对应的USB设备进行数据通讯;

调用模块406,具体用于:当接收模块405接收到第二独享设备错误码时,调用预设函数接口来枚举第一设备信息对应的USB设备,模拟第一设备信息对应的USB设备的插拔。

相应地,所述装置还包括:检测模块和打开模块;

其中,检测模块,用于连接模块403连接第一设备信息对应的USB设备之前,检测PC/SC服务是否打开;

打开模块,用于当检测模块检测到PC/SC服务未打开时,打开PC/SC服务;

相应地,连接模块403,具体用于:当检测模块检测到PC/SC服务打开时,连接第一设备信息对应的USB设备;还用于打开模块打开PC/SC服务时,连接第一设备信息对应的USB设备。

本实施例中的装置,还包括:创建模块、第五获取模块、第二判断模块;

其中,创建模块,用于连接模块403连接第一设备信息对应的USB设备之前,创建第一上下文环境;

第五获取模块,用于在第一上下文环境中获取已插入设备类型为CCID的USB设备的设备列表;

第二判断模块,用于判断获取到的设备列表中是否含有目标USB设备的设备名称;

保存模块,还用于当第二判断模块判断出获取到的设备列表中含有目标USB设备的设备名称时,将目标USB设备的设备名称与第一上下文环境对应保存;

第一获取模块401,还用于当第二判断模块判断出获取到的设备列表中不含有目标USB设备的设备名称时,在监听到有USB设备插入时,获取已插入USB设备的设备信息。

连接模块403,具体用于:在第一上下文环境中调用第九函数接口连接保存的设备名称对应的USB设备。

本实施例中还提供了另一种Mac系统中与USB设备通讯的装置,如图5所示,包括:

第一获取模块501,用于获取已插入USB设备的设备信息;

查找模块502,用于在第一获取模块501获取到的设备信息中查找到与目标USB设备匹配的第一设备信息;

连接模块503,用于连接查找模块502查找到的第一设备信息对应的USB设备;

通讯模块504,用于当连接模块503连接成功时,与第一设备信息对应的USB设备进行数据通讯;

接收模块505,用于当连接模块503连接失败时,接收错误码;

控制模块506,用于当接收模块505接收到预设错误码时,切断第一设备信息对应的USB设备与系统之间的连接并重新建立连接,模拟第一设备信息对应的USB设备的插拔;

接收模块505,还用于控制模块506切断第一设备信息对应的USB设备与系统之间的连接并重新建立连接之后,获取已插入USB设备的设备信息。

本实施例中的装置,还包括:

创建模块,用于第一获取模块501获取已插入USB设备的设备信息之前,创建第一设备字典,并将目标USB设备的设备信息添加到第一设备字典中。

相应地,查找模块502,具体用于:在第一获取模块501获取到的设备信息中查找到与第一设备字典中的设备信息相同的第一设备信息。

本实施例中的装置,还包括:

第二获取模块,用于连接模块503连接查找模块502查找到的第一设备信息对应的USB设备之前,获取第一设备信息对应的USB设备的设备类型。

相应地,所述装置还包括:第三获取模块、保存模块和清除模块;

其中,第三获取模块,用于第二获取模块获取第一设备信息对应的USB设备的设备类型之前,获取第一设备信息对应的USB设备的第一设备标识;

保存模块,用于将第三获取模块获取到的第一设备标识保存到存储区中;

第二获取模块,具体用于:根据第三获取模块获取到的第一设备标识,获取第一设备信息对应的USB设备的设备类型;

清除模块,用于控制模块506触发第一获取模块401之前,清除存储区中与第一设备信息对应的USB设备对应的第一设备标识。

在本实施例中,第三获取模块,具体包括:

第一创建子模块,用于创建第一插件对象;

第一获取子模块,用于通过第一创建子模块创建的第一插件对象获取第一设备信息对应的USB设备的第一设备标识;

释放子模块,用于第一获取子模块获取到第一设备标识之后,释放第一插件对象。

进一步地,在本实施例中,当第二获取模块获取到第一设备信息对应的USB设备的设备类型为SCSI时,所述装置还包括:打开模块;

相应地,预设错误码,具体为:第一独享设备错误码;

连接模块503,具体用于:连接第一设备信息对应的USB设备;

打开模块,用于连接模块503连接第一设备信息对应的USB设备之后,打开第一设备信息对应的USB设备的通讯接口;

通讯模块504,具体用于:当打开模块打开成功时,与第一设备信息对应的USB设备进行数据通讯;

控制模块506,具体用于:当接收模块505接收到第一独享设备错误码时,切断第一设备信息对应的USB设备与系统之间的连接并重新建立连接,模拟第一设备信息对应的USB设备的插拔。

其中,控制模块506,具体用于:

执行第一卸载指令来卸载设备类型为SCSI的USB设备的系统驱动,模拟所有已插入设备类型为SCSI的USB设备的拔出,并执行第一加载指令来加载设备类型为SCSI的USB设备的系统驱动,模拟设备类型为SCSI的USB设备的重新插入;

或者,

执行第二卸载指令来卸载USB设备的系统驱动类,模拟所有已插入USB设备的拔出,并在监听到USB设备插入时,自动加载该USB设备的系统驱动类,模拟USB设备的重新插入。

本实施例中的装置,还包括:第四获取模块和第一判断模块;

其中,第四获取模块,用于连接模块503连接第一设备信息对应的USB设备之前,获取第一设备信息对应的USB设备的第一端口地址;

第一判断模块,用于判断存储区中是否存在第一端口地址;

第一获取模块501,还用于当第一判断模块判断出存储区中存在所述第一端口地址,且在监听到USB设备插入时,获取已插入USB设备的设备信息;

保存模块,还用于当第一判断模块判断出存储区中不存在第一端口地址时,将第一端口地址保存到存储区中;

连接模块503,具体用于:保存模块将第一端口地址保存到存储区中之后,连接第一设备信息对应的USB设备;

清除模块,还用于控制模块506触发第一获取模块之前,清除存储区中与第一设备信息对应的USB设备对应的第一端口地址。

在本实施例中,当第二获取模块获取到第一设备信息对应的USB设备的设备类型为SCSI时,连接模块503,具体包括:

第一创建子模块,用于创建第二设备字典并添加目标USB设备的设备信息到第二设备字典中;

第二获取子模块,用于获取已插入USB设备的设备信息;

查找子模块,用于在第二获取子模块获取到的设备信息中查找到与第二设备字典中的设备信息相同的第二设备信息;

第三获取子模块,用于获取第二设备信息对应的USB设备的第二端口地址;

判断子模块,用于判断第二端口地址与第一端口地址是否相同;

连接子模块,用于当判断子模块判断出第二端口地址与第一端口地址相同时,连接第一设备信息对应的USB设备;

第一获取模块501,还用于当判断子模块判断出第二端口地址与第一端口地址不同时,在监听到USB设备插入时,获取已插入USB设备的设备信息。

相应地,本实施例中的装置,还包括:

打开查找模块,用于打开模块打开第一设备信息对应的USB设备的通讯接口之前,打开第一设备信息对应的USB设备并查找到第一设备信息对应的USB设备的通讯接口。

进一步地,打开查找模块,具体用于:调用第二函数接口打开第一设备信息对应的USB设备并创建第三插件对象,第三插件对象根据预设条件查找到第一设备信息对应的USB设备的通讯接口。

在本实施例中,当第二获取模块获取到第一设备信息对应的USB设备的设备类型为CCID时;

相应地,预设错误码,具体为:第二独享设备错误码;

连接模块503,具体用于:连接第一设备信息对应的USB设备;

通讯模块504,具体用于:当连接模块连接成功时,与第一设备信息对应的USB设备进行数据通讯;

控制模块506,具体用于:当接收模块503接收到第二独占设备错误码时,切断第一设备信息对应的USB设备与系统之间的通信并重新建立通信,模拟第一设备信息对应的USB设备的插拔。

本实施例中的装置,还包括:检测模块和打开模块;

其中,检测模块,用于连接模块503连接第一设备信息对应的USB设备之前,检测PC/SC服务是否打开;

打开模块,用于当检测模块检测到PC/SC服务未打开时,打开PC/SC服务;

相应地,连接模块503,具体用于:当检测模块检测到PC/SC服务打开时,连接第一设备信息对应的USB设备;还用于打开模块打开PC/SC服务时,连接第一设备信息对应的USB设备。

控制模块506,具体用于:关闭PC/SC服务,模拟设备类型为CCID的USB设备的拔出,并重新打开PC/SC服务,模拟设备类型为CCID的USB设备的插入。

本实施例中的装置,还包括:创建模块、第五获取模块、第二判断模块;

创建模块,用于连接模块503连接第一设备信息对应的USB设备之前,创建第一上下文环境;

第五获取模块,用于在第一上下文环境中获取已插入设备类型为CCID的USB设备的设备列表;

第二判断模块,用于判断获取到的设备列表中是否含有目标USB设备的设备名称;

保存模块,还用于当第二判断模块判断出获取到的设备列表中含有目标USB设备的设备名称时,将目标USB设备的设备名称与第一上下文环境对应保存;

第一获取模块,还用于当第二判断模块判断出获取到的设备列表中不含有目标USB设备的设备名称时,在监听到有USB设备插入时,获取已插入USB设备的设备信息。

相应地,连接模块503,具体用于:在第一上下文环境中调用第九函数接口连接保存的设备名称对应的USB设备。

通过本发明中的技术方案,当系统独享USB设备的通信权限时,能够实现模拟USB设备的插拔,从而使其他应用程序获得USB设备的通信权限,减少了用户操作,提升用户体验。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1