用户发现华视读卡器需要单独调用初始化和关闭方法,而SSCard.dll好像没有单独的初始化步骤,为什么会有这种差异?
// SSCard.dll 的使用方式
public static JObject ReadIdCard()
{
if (!initialized)
{
Initialize(); // 内部自动初始化
}
// 直接读卡,无需手动管理连接
Int32 result = ReadSFZ(outptr, buffSize, signptr, buffSize);
// 无需手动关闭连接,DLL内部管理
}
特点:
// 华视SDK 的使用方式
CVR_InitComm(1001); // 1. 必须手动初始化
CVR_Authenticate(); // 2. 认证卡片
CVR_Read_FPContent(); // 3. 读取数据
GetPeopleName(); // 4. 获取具体信息
CVR_CloseComm(); // 5. 必须手动关闭
特点:
对比项 | SSCard.dll | 华视SDK |
---|---|---|
应用场景 | 医保业务系统 | 通用身份证读取 |
使用频率 | 偶尔读卡 | 可能频繁读卡 |
用户类型 | 医保系统集成商 | 各类应用开发者 |
复杂度要求 | 简单易用 | 灵活可控 |
应用层 → SSCard.dll → 医保平台 → 硬件设备
应用层 → termb.dll → 硬件驱动 → 读卡器设备
public static JObject ReadIdCard()
{
if (!initialized)
{
Initialize(); // 🔄 自动检查并初始化
}
try
{
// 读卡逻辑
}
catch (Exception e)
{
initialized = false; // 🛡️ 异常时重置状态,下次自动重新初始化
}
}
// 用户必须明确管理生命周期
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();
患者来就诊 → 工作人员点击"读社保卡" → 系统自动读取 → 显示信息
应用启动 → 初始化读卡器 → 等待身份证 → 连续读取 → 应用关闭时释放资源
🏥 医保业务特点:
🛡️ 稳定性要求:
🌐 网络架构:
🔧 硬件直控:
⚡ 性能考虑:
🎛️ 灵活性:
结论:两种设计模式都有其合理性,SSCard.dll追求简单易用,华视SDK追求灵活高效。我们的封装层已经实现了自动初始化,让华视读卡器也能像SSCard.dll一样简单使用! 🎉