node.js上的指纹读取器通过.NET SDK

poc*_*sar 10 .net c# fingerprint node.js edge.js

我正在尝试使用node.js应用程序与名为U.are.U的.NET SDK指纹识别器进行交互.SDK提供.dll(win32和x64),Java和.NET库.我决定使用.NET简单易用,所有接口都可以使用.

所以,我面临的当前问题是如何调用这些.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

根据edge.js作者,它可以轻松完成https://github.com/tjanczuk/edge/issues/54#issuecomment-17967082我只是没有足够的.NET技能(从一个完整的模块) )与所有回调.

poc*_*sar 2

自从这个问题发布以来很长一段时间后,我可以使用节点事件发射器轻松使用edge.js在我的.NET UI中进行输入和输出通信(甚至可以从.NET UI控制node-webkit内的node.js):

// demo basic code in node.js

var 
  edge = require('edge'), 
  Bridge = edge.func('../path/to/compiled.dll'),
  callback,
  ev = new require('events').EventEmitter();

ev.on('acquire', function(fingerdata){
  console.log(fingerdata);
});

ev.on('error', function(){
}); 

callback = function(event, report){
  // report the result of the event emitter back to .NET
  // you can even pass the "report" to the event handler, so you can return anything you want back to .NET, not just a boolean
  report(null, ev.emit(event.name, event.data));
  //ev.emit(event.name, {data: event.data, report: report});
};

var bridge = Bridge(callback, true);

// calling bridge(null, true); "releases" my device, should be called on process.on('exit')
Run Code Online (Sandbox Code Playgroud)

现在您可以使用事件从 .NET 调用输入/输出,而不是调用本机代码(这可能不是线程安全的)

namespace Bridge
{
    public class Startup
    {
        public async Task<object> Invoke(Func<object, Task<object>>callback)
        {
            Bridge.Base.setCallback(callback);

            MainForm mainForm = new Bridge.MainForm();

            Task.Run(async () =>
            {
                Application.Run(mainForm);
            });

            return (Func<object, Task<object>>)(async (i) => { Bridge.Base.release(); return null; });
        }
    }
}

// inside Bridge.Base


static public void setCallback(Func<object, Task<object>> cb)
{
    if (callback == null)
    {
        callback = cb;
    }
}

static public async void Emit(string name, object data)
{
    return await Task.Run(async () =>
    {
        return await callback(new {
            name = name,
            data = data
        });
    });
}

static public Func<object, Task<object>> callback = null;
Run Code Online (Sandbox Code Playgroud)

现在可以Emit('error', "My error")从任何地方异步调用我的派生类Base。请注意,我最近开始使用 C#,这里提供的代码可能不是最合适的。