You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让C# WebSocket服务实时发送ZK4500指纹设备的Base64数据

解决方案

核心问题分析

你之前的问题出在依赖类变量传递指纹+未在回调内实时触发发送,导致只有首次扫描的指纹被发送,后续更新的指纹没有触发WebSocket的发送逻辑。正确的做法是在SDK的指纹接收回调中,直接使用活跃的WebSocket实例发送最新的Base64指纹数据。

步骤1:全局管理WebSocket实例

将WebSocket实例声明为WinForms窗体的成员变量,确保客户端连接后始终持有有效的活跃实例,避免使用临时变量或未更新的旧实例:

using WebSocketSharp;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

public partial class FingerprintForm : Form
{
    // 全局WebSocket实例,确保连接后始终有效
    private WebSocket _activeWs;

    // 初始化WebSocket连接的方法(比如在窗体加载或按钮点击时调用)
    private void ConnectToReactServer()
    {
        // 先关闭旧连接(如果存在)
        _activeWs?.Close();
        
        _activeWs = new WebSocket("ws://你的React服务器地址");
        
        _activeWs.OnOpen += (sender, e) =>
        {
            MessageBox.Show("已连接到React服务器");
        };
        
        _activeWs.OnClose += (sender, e) =>
        {
            MessageBox.Show("与服务器断开连接");
            // 可选:自动重连逻辑
            // Task.Delay(3000).ContinueWith(_ => ConnectToReactServer());
        };
        
        _activeWs.Connect();
    }
}

步骤2:在SDK回调内实时发送指纹

在zkFprint_OnImageReceived回调中,直接处理指纹图像、转Base64,并通过全局WebSocket实例发送。注意处理跨线程问题(SDK回调可能在非UI线程执行):

// 绑定SDK的指纹接收回调(确保在初始化SDK时正确注册此方法)
private void zkFprint_OnImageReceived(IntPtr imagePtr, int width, int height)
{
    // 1. 从SDK提供的指针中提取指纹图像
    using (Bitmap fingerprintBmp = new Bitmap(width, height, width * 4, PixelFormat.Format32bppArgb, imagePtr))
    {
        // 2. 将Bitmap转为字节数组
        byte[] imageBytes;
        using (MemoryStream ms = new MemoryStream())
        {
            fingerprintBmp.Save(ms, ImageFormat.Png); // 选择PNG格式保证图像质量
            imageBytes = ms.ToArray();
        }

        // 3. 转为Base64字符串
        string base64Fingerprint = Convert.ToBase64String(imageBytes);

        // 4. 检查WebSocket状态并发送
        if (_activeWs != null && _activeWs.ReadyState == WebSocketState.Open)
        {
            // 跨线程处理:WinForms控件操作需在UI线程执行,WebSocket.Send本身线程安全,但保险起见用Invoke
            if (InvokeRequired)
            {
                Invoke(new Action(() => _activeWs.Send(base64Fingerprint)));
            }
            else
            {
                _activeWs.Send(base64Fingerprint);
            }
        }
    }
}

关键注意事项

  • 回调注册:确保在初始化ZKT SDK时,将zkFprint_OnImageReceived方法正确绑定到SDK的事件委托上,否则不会触发回调。
  • 资源释放:用using包裹Bitmap和MemoryStream,避免内存泄漏。
  • 重连逻辑:在WebSocket断开时添加自动重连,保证后续扫描的指纹能正常发送。
  • 线程安全:WinForms中跨线程操作控件会报错,所以用Invoke确保WebSocket发送操作在UI线程执行(或确认websocket-sharp的Send方法无需UI线程)。

内容的提问来源于stack exchange,提问作者Bakhtovar Muzaffarov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:55:23