江苏铭和医院华视读卡器和长沙泰和医院三合一的读卡器两种读卡器SDK设计模式对比分析.md 6.5 KB

两种读卡器SDK设计模式对比分析

📋 问题背景

用户发现华视读卡器需要单独调用初始化和关闭方法,而SSCard.dll好像没有单独的初始化步骤,为什么会有这种差异?


🔍 设计模式对比

1. SSCard.dll 设计模式:自动管理模式

// SSCard.dll 的使用方式
public static JObject ReadIdCard()
{
    if (!initialized)
    {
        Initialize();  // 内部自动初始化
    }
    
    // 直接读卡,无需手动管理连接
    Int32 result = ReadSFZ(outptr, buffSize, signptr, buffSize);
    
    // 无需手动关闭连接,DLL内部管理
}

特点

  • 自动初始化:每次读卡时检查是否已初始化,未初始化则自动调用
  • 隐式连接管理:DLL内部管理硬件连接状态
  • 简化使用:用户只需调用读卡方法,无需关心连接细节
  • 异常自愈:出错时自动重新初始化

2. 华视SDK 设计模式:显式管理模式

// 华视SDK 的使用方式
CVR_InitComm(1001);      // 1. 必须手动初始化
CVR_Authenticate();      // 2. 认证卡片
CVR_Read_FPContent();    // 3. 读取数据
GetPeopleName();         // 4. 获取具体信息
CVR_CloseComm();         // 5. 必须手动关闭

特点

  • 🔧 显式初始化:用户必须手动调用初始化和关闭
  • 🔧 精确控制:可以精确控制每个步骤的执行
  • 🔧 资源管理:需要用户主动管理硬件资源
  • 🔧 状态感知:用户需要了解设备的连接状态

🎯 为什么存在这种差异?

1. 应用场景不同

对比项 SSCard.dll 华视SDK
应用场景 医保业务系统 通用身份证读取
使用频率 偶尔读卡 可能频繁读卡
用户类型 医保系统集成商 各类应用开发者
复杂度要求 简单易用 灵活可控

2. 技术架构差异

SSCard.dll(湖南医保局定制)

应用层 → SSCard.dll → 医保平台 → 硬件设备
  • 🏥 医保专用:专门为医保业务设计
  • 🌐 网络化:通过网络连接医保平台
  • 🛡️ 高度封装:隐藏复杂的医保协议细节
  • 🔄 自动重连:网络断开时自动重连

华视SDK(通用硬件SDK)

应用层 → termb.dll → 硬件驱动 → 读卡器设备
  • 🔧 硬件直连:直接控制硬件设备
  • 💡 通用设计:适用于各种应用场景
  • 性能优先:减少不必要的自动化开销
  • 🎛️ 精确控制:开发者可控制每个细节

3. 代码实现对比

SSCard.dll 的"隐式初始化"

public static JObject ReadIdCard()
{
    if (!initialized)
    {
        Initialize();  // 🔄 自动检查并初始化
    }
    
    try
    {
        // 读卡逻辑
    }
    catch (Exception e)
    {
        initialized = false;  // 🛡️ 异常时重置状态,下次自动重新初始化
    }
}

华视SDK 的"显式初始化"

// 用户必须明确管理生命周期
public static JObject Initialize(int port)
{
    int result = CVR_InitComm(port);  // 🔧 显式初始化
    if (result == 1) {
        initialized = true;
    }
    return result;
}

public static JObject Close()
{
    CVR_CloseComm();  // 🔧 显式关闭
    initialized = false;
}

💡 优化华视读卡器使用体验

为了让华视读卡器更好用,我们可以在业务层实现"自动管理模式":

改进前(显式管理)

// 用户需要手动管理
HuaShiIdCardBusiness.Initialize(1001);  // 1. 手动初始化
var result = HuaShiIdCardBusiness.ReadIdCard();  // 2. 读卡
HuaShiIdCardBusiness.Close();  // 3. 手动关闭

改进后(自动管理)

// 华视读卡器ReadIdCard方法中的自动初始化逻辑
public static JObject ReadIdCard(string savePath = "")
{
    // 自动初始化(模仿SSCard.dll的设计模式)
    if (!initialized)
    {
        var initResult = Initialize();
        if ((int)initResult["code"] != 200)
        {
            return initResult; // 初始化失败,直接返回错误
        }
    }
    
    // ... 读卡逻辑
    
    // 异常处理中自动重置状态
    catch (Exception ex)
    {
        initialized = false;  // 异常时重置,下次自动重新初始化
        // ...
    }
}

现在用户可以像使用SSCard.dll一样简单:

// 直接读卡,无需手动初始化
var result = HuaShiIdCardBusiness.ReadIdCard();

🔧 实际应用场景分析

1. 医保系统场景(SSCard.dll)

患者来就诊 → 工作人员点击"读社保卡" → 系统自动读取 → 显示信息
  • 💡 间歇使用:患者来了才读卡,间隔时间长
  • 🎯 简单操作:工作人员只需点一个按钮
  • 🛡️ 自动容错:出错自动重试,不需要技术知识

2. 身份核验场景(华视SDK)

应用启动 → 初始化读卡器 → 等待身份证 → 连续读取 → 应用关闭时释放资源
  • 连续使用:可能需要连续读取多张身份证
  • 🎛️ 精确控制:开发者可控制每个环节
  • 📊 状态监控:可以实时监控设备状态

🎯 总结

SSCard.dll 采用"自动管理模式"的原因:

  1. 🏥 医保业务特点

    • 使用者是医院工作人员,不是技术人员
    • 需要极简的操作体验
    • 偶尔使用,每次使用间隔较长
  2. 🛡️ 稳定性要求

    • 医保系统对稳定性要求极高
    • 自动重连机制降低故障率
    • 减少人为操作错误
  3. 🌐 网络架构

    • 通过网络连接医保平台
    • 连接状态由医保平台管理
    • 本地DLL只是一个代理

华视SDK 采用"显式管理模式"的原因:

  1. 🔧 硬件直控

    • 直接控制硬件设备
    • 需要精确的资源管理
    • 避免资源冲突和泄露
  2. ⚡ 性能考虑

    • 频繁读卡场景下,保持连接更高效
    • 避免每次读卡都重新初始化
    • 开发者可以根据需要优化
  3. 🎛️ 灵活性

    • 不同应用有不同的使用模式
    • 开发者可以选择最适合的管理方式
    • 支持高级功能(如连续读卡模式)

结论:两种设计模式都有其合理性,SSCard.dll追求简单易用,华视SDK追求灵活高效。我们的封装层已经实现了自动初始化,让华视读卡器也能像SSCard.dll一样简单使用! 🎉