使用 M2SYS SDK 进行指纹识别器集成






4.79/5 (31投票s)
探索将指纹识别器集成到用户应用程序的文章

引言
本文介绍了 M2SYS Bio-PlugIn™ 指纹识别软件开发工具包的初步体验。该 SDK 为独立软件供应商提供了一种相对直接且健壮的方式,可以将生物特征指纹识别集成到自定义应用程序中。文章提供了一个测试应用程序,该程序演示了 SDK 的相关功能。您需要获取 M2SYS Bio-Plugin SDK 才能编译和运行示例代码。
背景
Bio-Plugin™ 由一个与主应用程序通信的小型客户端应用程序和一个高性能的后端指纹识别引擎组成,该引擎执行所有比较请求。客户端应用程序通过一个独特、松耦合的接口与主应用程序通信,并通过 M2SYS 连接管理器与识别引擎通信。

当主应用程序向 Bio-Plugin™ 发送注册、验证或识别指纹样本的请求时,会弹出一个指纹采集窗口,该窗口会与主应用程序融为一体。尽管对于最终用户来说,它看起来像是主应用程序的完全集成组件,但 Bio-Plugin™ 实际上是独立处理所有指纹活动的。
该系统可以处理许多客户端安装,并至少需要一个服务器。服务器在数据库中存储指纹和其他元数据,该数据库可以与指纹服务器位于同一服务器上,也可以位于单独的服务器上。在开发和测试阶段,客户端、服务器和数据库可以位于同一服务器上。您需要购买兼容的 USB 指纹读取器才能开始尝试该系统。
该系统的架构允许开发人员构建一个集成了指纹识别功能的应用程序,该应用程序可以在多个工作站上运行,而无需在每个系统上都注册用户指纹。每个客户端都与一个服务器通信,最终从中央数据库获取指纹数据。
客户端和服务器软件安装
我联系了 M2SYS 获取了服务器和客户端软件的副本。整个系统需要从供应商那里获得许可,费用很大程度上取决于指纹数据库中要存储的用户数量。
服务器安装
服务器安装是一个 Windows .MSI 包,用于安装服务器。安装完成后,必须对服务器进行许可,这通过一个控制面板小程序完成。M2SYS 将为客户提供一个网站的访问权限,让他们可以在其中管理其客户端/服务器许可。通过 Windows .chm 帮助文件提供的安装过程文档相当不错。在我的 Vista 系统上,帮助文件起初没有正确显示内容。后来我发现,需要右键单击 .chm 文件,选择属性,然后信任该文件,再用 Windows 帮助系统重新打开它。

服务器软件还会将一个带有交通灯图标的小程序安装到 Windows 任务栏中,允许您启动或停止服务器。启动服务器后,在 M2SYS 控制面板中按“查看核心服务器日志”按钮有助于诊断可能的问题,主要是许可和/或数据库连接问题。服务器默认安装并使用本地 Access (.mdb) 文件,但可以通过 ODBC 连接字符串配置其他数据库服务器。

以上显示了一个配置正确的日志。
客户端安装
客户端也通过 .msi 安装,在安装结束时会启动 U.are.U Digital Persona 底层 SDK 的另一个安装程序。这个辅助安装程序会安装所需的 USB 指纹驱动程序。安装完客户端后,就可以插入 USB 指纹读取器了。第一次插入读取器时,操作系统应该会自动检测到硬件并进行配置。根据购买的指纹读取器类型,在安装客户端软件后重启工作站时,可能会出现一个客户端许可对话框。
客户端验证
安装并激活 BioPlugin 客户端软件后,您可以通过以下步骤手动验证其基本功能:
- 打开命令提示符窗口(开始 -> 运行 -> “cmd”)。
- 切换到 BioPlugin 客户端的安装目录(“cd \Program Files\BioPlugin”)。
- 手动调用单指扫描窗口“m2sysplugin.exe IS 0”。
- 指纹扫描窗口将出现在屏幕中央。
- 将您的手指放在指纹读取器的扫描表面上。
- 在对话框顶部,您将看到消息“Fingerprint processed”。这表明客户端正在与服务器通信。
- 如果显示“Server connection failed”或“Invalid server name”消息,请确认
- BioPlugin 服务器软件正在正常运行,方法是检查服务器日志文件。
- 如果显示“Server connection failed”或“Invalid server name”消息,请确认
完成后手动停止扫描窗口“m2sysplugin.exe IS -1”
检测 M2Sys 客户端软件
在使用客户端软件之前,最好编写一些代码来确保 M2Sys 客户端软件已安装。下面的代码可以从 Main()
调用,在任何使用 M2Sys ActiveX 控件的 Windows 或窗体之前调用。尽管 SDK 提供了检测指纹读取器的例程,但如果缺少客户端软件,这些例程将无法使用。首先要编写一些检测逻辑。我选择检测客户端软件安装的 ActiveX Bioplugin 的 COM 注册。我希望这个 GUID 在 M2SYS SDK 的未来版本中不会改变。
private const string BiopluginNameInRegistry = "BioPlugInActX Control";
private const string BioPluginKey = @"CLSID\{05E8280C-D45A-494F-AE42-840A40444AFF}";
private static bool IsM2SysBioPluginInstalled()
{
RegistryKey bioPluginRegistryKey;
const string bioPluginKeyName = BioPluginKey;
try
{
bioPluginRegistryKey = Registry.ClassesRoot.OpenSubKey(bioPluginKeyName, false);
}
catch
{
return false;
}
if (bioPluginRegistryKey == null)
return false;
string name = (string)bioPluginRegistryKey.GetValue(string.Empty);
if (name == BiopluginNameInRegistry)
return true;
return false;
}
上面的代码在应用程序启动时插入,如下所示:
[STAThread]
private static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (!IsM2SysBioPluginInstalled())
{
MessageBox.Show(Resources.ProgramNeedsM2Sys, Resources.MessageBoxTitle,
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Application.Run(new FingerTestForm());
}
指纹演示应用程序
现在我们继续编写用于操作该控件的软件。起初,我以为 ActiveX 控件可以用作一个无 UI 的 COM 服务器。我尝试添加对 COM 服务器的引用,创建实例并使用 API。但没有成功,实际上需要将 Visual ActiveX 控件嵌入到应用程序中。方法是转到所需的窗体,转到工具箱,右键单击并使用“选择项...” - 然后选择指纹控件。

然后,该控件会出现在 Visual Studio 工具箱中,之后可以将其拖放到设计界面上。该控件可以被激活以显示当前扫描,也可以保持不可见;无论哪种方式,一旦它在设计界面上,就可以使用该控件。WPF 用户需要创建一个 WinForms UserControl
来承载 Bioplugin ActiveX 控件。然后,这个 WinForms Usercontrol
通过 <WindowsFormsHost>
元素插入到 WPF 窗口或页面中。Loaded 事件处理程序然后将 WinForms UserControl
赋给 WindsFormsHost
的子项。
异步方法调用
由于其客户端-服务器架构,BioPluginActX 控件需要向服务器发出请求。然后服务器与数据库交互,最终将信息返回给 ActiveX 控件。收到服务器响应后,BioPluginActX 控件会向位于客户端的一个接收器触发一个事件。在客户端接收到事件后,客户端可以进行另一次调用来检索错误和响应代码。对于客户端应用程序来说,处理异步方法调用比使用同步模型更复杂。注册指纹的调用顺序如下:
- 客户端调用注册,使用
bioPlugin.RegisterPrintShort(name)
。 - BioPlugIn ActiveX 控件显示一个模态对话框以注册指纹。
- 用户扫描指纹。
- 控件将扫描发送到服务器。
- 服务器将扫描结果保存在数据库中。
- 控件将
OnRegister
事件触发回客户端应用程序。 - 客户端应用程序回调 ActiveX 控件以检索结果属性。
下面的应用程序代码显示了如何让异步事件在应用程序中看起来像同步的。
// a synchronization primitive that helps with the
// waiting associated with asynchronous calls
private readonly ManualResetEvent _eventRecievedInfo = new ManualResetEvent(true);
// this is the event handler for the button press
// we pass the equivalent of a function pointer to the DoFingerPrintAction call
private void _registerShortButton_Click(object sender, EventArgs e)
{
DoFingerPrintAction(()=>_fpReader.RegisterPrintShort(_enterIdText.Text),
ResultCode.RegisterPrintShort);
}
private void DoFingerPrintAction(Action action, ResultCode resultCode)
{
_currentResult = resultCode;
_eventRecievedInfo.Reset();
action(); // this is where the call to the ActiveX is made
WaitForInfo(); // we wait for a response here
}
private void WaitForInfo()
{
for (int i = 0; i < 60; i++) // maximum wait = 60 seconds
{
// this needs to be called for the Windows Message pump
// to work, and for the events to come in.
Application.DoEvents();
bool gotSignal = _eventRecievedInfo.WaitOne(1000);
if (gotSignal)
{
return;
}
}
}
// This is the event handler for the OnRegister Event
// on the bioPlugin control
private void bioPlugin_OnRegister(object sender, EventArgs e)
{
string fromAxControl = bioPlugin.result;
switch (_currentResult)
{
case ResultCode.RegisterPrintShort:
_returnCodeFromRegistration = fromAxControl;
break;
case ResultCode.UpdatePrint:
_returnCodeFromRegistration = fromAxControl;
break;
}
_eventRecievedInfo.Set();
}
请注意,在等待期间我们需要调用 Application.DoEvents
。这确保了 Windows 消息循环系统可以将 COM 事件传递给我们的应用程序。硬编码 60 秒的限制存在一个问题,那就是用户必须在一分钟内实际注册其指纹,否则将错过返回代码。
仍需要指纹管理 UI
M2SYS Bio-Plugin 控件有助于解决存储和匹配指纹、注册和更新指纹以及删除指纹的问题。然而,集成商仍负责构建用于配置、注册、更新和删除指纹的 UI。尽管控件承担了大部分繁重的工作,但我遇到的一个问题是,指纹删除功能要求您传入要删除记录的原始唯一 ID(通常是名称)。如果从不同的客户端机器向中央数据库进行注册,则所有 ID 在特定机器上都不可用。出于安全原因,该控件显然不允许开发人员获取数据库中所有 ID 的列表。下面是一些代码,它将连接到本地 Access 数据库并检索 ID。[下面的代码中的密码应更改为与数据库密码匹配。]
private void ReadAccessDatabase()
{
OleDbConnection thisConnection =
new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\Program Files\BioPlugin\Database.mdb ;
Persist Security Info=False; Jet OLEDB:Database Password=password;");
OleDbCommand thisCommand = new OleDbCommand
("SELECT REGISTRATIONNO FROM PERSON", thisConnection);
try
{
thisConnection.Open();
OleDbDataReader thisReader = thisCommand.ExecuteReader();
while (thisReader.Read())
{
Debug.WriteLine(thisReader.GetString(0));
}
}
catch (OleDbException ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
thisConnection.Close();
}
}
与此相反,读取 SQL Express 2008 数据库信息 [为什么我们不得不改变除连接字符串以外的其他东西?] 的代码如下所示:
private void _readDB_Click(object sender, EventArgs e)
{
SqlDataReader myDataReader = null;
SqlConnection mySqlConnection =
new SqlConnection(
@"Data Source=10.0.0.1\SQLEXPRESS;
Initial Catalog=FingerDB; User ID=user; Password=password;");
SqlCommand mySqlCommand = new SqlCommand
("SELECT REGISTRATIONNO FROM dbo.PERSON", mySqlConnection);
mySqlConnection.Open();
myDataReader = mySqlCommand.ExecuteReader(CommandBehavior.CloseConnection);
while (myDataReader.Read())
{
Debug.WriteLine(myDataReader.GetString(0));
}
mySqlCommand.Dispose();
mySqlConnection.Close();
}
通过在连接字符串中添加 'Trusted_Connection=True
',还可以加密数据库客户端和服务器之间的流量。
使用 SQL Server Express 2008 数据库服务器
文章的最后一部分是关于如何让事情与 SQLExpress 2008 协同工作;您需要连接到真实的网络数据库服务器才能从远程客户端查询数据库。我不会详细解释如何配置数据库以使其正常工作,M2SYS 的文档在这方面相当详细。然而,文档没有提及您需要做什么才能使 SQLExpress 2008 服务器启动并运行。大致步骤如下:
- 下载 SQL Express 2008。
- 安装 SQL Express 2008,并把 'sa' 密码记录下来。
- 下载并安装“Microsoft SQL Server Management Studio Express”。
- 接下来的步骤在 SQL Server Management Studio Express 程序中进行。使用 'sa' 作为用户名,以及您记下的密码。服务器应该是 localhost\SQLEXPRESS。
- 创建一个新数据库。
- 为数据库创建一个新用户,并设置密码。
- 授予新创建的用户创建表、选择等权限。
- 执行安装在此处的创建表查询:“C:\Program Files\BioPlugin\Tables-Script-SQL Server.sql”。您可能需要在文件开头添加一个 use yourdatabasename; 语句。
- 在运行 BioPlugin 服务器的机器上,修改“C:\Program Files\BioPlugin\server.ini”中的
ConnectStr
条目,使其指向正确的连接字符串(请参阅上面的代码格式示例)以连接到 SQLExpress。 - 停止并重新启动 BioPlugin 服务器服务。
我遇到的大多数问题都是识别正确的连接字符串。
结论
即使使用良好的软件集成工具包,将生物特征无缝集成到您的应用程序中也可能需要一些努力。除了必需的指纹管理应用程序外,部署此类系统很可能需要中大型组织的 IT 部门参与。您的系统文档必须完善,并且您的支持组织必须能够帮助您的客户解决潜在问题。您的应用程序可能需要包含一个先决条件安装程序来安装所需的客户端组件;从部署角度来看,客户端和服务器许可的工作方式需要明确,并与供应商协商。指纹读取器硬件也必须购买,并与应用程序一起分发。在受严格监管的环境中,用户需要审计跟踪并需要频繁地进行身份验证,集成的生物特征解决方案可以使您的客户的工作效率显著提高,并且您的软件也将更容易使用,更有趣。
历史
- 2009 年 8 月 11 日 - 初始发布