c# - 通过 .NET SDK 在 node.js 上的指纹读取器

标签 c# .net node.js fingerprint edge.js

我正在尝试让 node.js 应用程序与名为 U.are.U 的 .NET SDK 指纹读取器交互。 SDK 提供 .dll(win32 和 x64)、Java 和 .NET 库。我决定使用 .NET 来简化使用,让所有接口(interface)都可以使用。

所以,我当前面临的问题是如何调用这些 .NET 函数并仍然保留 node.js 的异步特性。应用程序流程(在 .NET 示例中)非常简单,对库进行了 3 次调用,指纹就完成了。

private IEnumerable<Fmd> CaptureAndExtractFmd()
{
    while (!reset)
    {
        DataResult<Fmd> resultConversion;

        try
        {
            if (count >= 8)
            {
                SendMessage("Enrollment was unsuccessful.  Please try again.");
                count = 0;
                break;
            }

            Fid fid = null;
            if (!_sender.CaptureFinger(ref fid))
                break;

            if (fid == null)
                continue;

            count++;

            resultConversion = FeatureExtraction.CreateFmdFromFid(fid, Constants.Formats.Fmd.ANSI);

            SendMessage("A finger was captured.  \r\nCount:  " + (count));

            if (resultConversion.ResultCode != Constants.ResultCode.DP_SUCCESS)
                break;
        }
        catch (Exception)
        {
            break;
        }

        yield return resultConversion.Data;
    }
}

如何更改它以便它可以在 node.js 中使用,而不是在 .NET gui 程序中使用?

还需要注意的是,node.js 并不总是会调用 .NET 程序上的函数来接收函数。程序的识别部分是异步发生的,当有人将手指放在指纹读取器上时就会触发,这意味着 node.js 部分不知道什么时候会发生。所以我不能一直依赖在 .NET 部分询问数据,它必须在没有被询问的情况下调用 node.js 上的回调。 所以基本上,这是一种双向通信,不仅仅是根据请求,因为使用网络服务器进行请求会容易得多。

我找到了一个 node.js 库,它可以缩小 .NET 和 node.js 之间的差距,名为 edge.js这会有帮助吗?


基本上,edge.js可以使它工作,以及 node-webkit (我将发布我的应用程序),我可以直接在页面中调用 Node API,因此我可以根据库中的结果更新 DOM。 我需要能够注册一个异步任务,该任务可以通过发出事件或调用回调来从 CLR 内部通知 node.js 对应项!

根据edge.js作者的说法,这很容易做到https://github.com/tjanczuk/edge/issues/54#issuecomment-17967082我只是没有足够的 .NET 技能来处理所有回调(来自一个完整的模块)。

最佳答案

使用此 SDK 的 .NET 库不适合解决此问题。

Node.js 本身是一个 C++ 应用程序,尝试正确使用 .NET 库只会带来伤害,尤其是 SDK 还提供原生 C/C++ 库!

当然,你不能直接使用 C++ 库;您必须编写一个 C++ 包装器。在 Node 世界中,这些被称为 addons .编写插件并不简单,但即使是几乎没有 C++ 经验的人也应该能够按照文档中的示例进行操作。

获得内置于 Windows 中的 native 插件也可能有点棘手; here's some tips to help you get started .

由于您使用的 SDK 在付费墙后面,我无法提供任何具体示例。但是,我想您的 C++ 包装器对象将公开一些方法,并且您还将围绕它编写一个 JS 包装器以公开一个干净的 API。例如:

var uareu = require('./uareu.node') // the native C++ addon dll
    , events = require('events')
    , util = require('util');

function FingerprintReader() {
    events.EventEmitter.call(this); // initialize the EventEmitter

    // do stuff with the native module

    // whenever a finger is placed on the reader:
    this.emit('finger', { id: idFromSdk });
}

util.inherits(FingerprintReader, events.EventEmitter); // we want this module
                                                       // to be an EventEmitter

module.exports = FingerprintReader; // export for require()ing in your app

现在您的应用可以:

var FingerprintReader = require('fingerprint')
    , fp = new FingerprintReader();

fp.on('finger', function(d) {
    // do something with `d.id`
});

这个例子显然掩盖了很多,但应该让你很好地了解在 JS 端需要发生什么。至于检测手指何时放在阅读器上,我真的不能说如果不访问 SDK,您将如何做到这一点。我敢打赌,你最终会在某个地方进行投票。这应该在插件中的单独线程上完成。


奖励:走原生路线意味着您可能还与 SDK 的 Linux 版本兼容,因此您的应用也可以在 Linux 上运行!

关于c# - 通过 .NET SDK 在 node.js 上的指纹读取器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16430772/

相关文章:

c# - 为所有可能的数字生成一个 Random Int32

c# - Garbage Collector、call & callvirt 和 Debug/Release 代码模式执行差异

.net - 在游戏开发和 VirtualBox 等应用程序方面,C++ 比 .NET 有什么优势

c# - 在 .Net 中是否有可能在类中的任何方法传递给调用堆栈之前捕获所有未处理的异常?

c# - 如何从复杂的自适应卡中读取值?

javascript - 如何在Node中同步执行shell命令?

node.js - 是否可以使用 CoffeeScript for Node.js 分析我的代码?

javascript - Express 和 Jade 中内联 jade.render() ?

c# - 拉动刷新只执行一次命令

c# - 如何确定对象是 <type> 还是 <type> 的后代