长沙泰和医院的ThCardReader项目分析报告.md 12 KB

ThCardReader项目分析报告

📋 目录

  1. SSCard.dll与项目文件的完整关联关系分析
  2. MainForm.cs网址功能详细分析

SSCard.dll与项目文件的完整关联关系分析

📋 一级关联 - 直接调用SSCard.dll的文件

🔹 1. SsCardBusiness.cs - 核心业务类

与SSCard.dll的直接映射关系:

// 文档函数 → C# P/Invoke声明 → 实际调用
Init(pUrl, pUser) → Init(string, string) → address.readSiCardUrl, address.readSiCardUser
ReadCardBas(...) → ReadCardBas(StringBuilder...) → 社保卡读取
ReadSFZ(...) → ReadSFZ(StringBuilder...) → 身份证读取

📋 二级关联 - 配置和数据管理

🔹 2. SiBusinessAddress.cs - 配置参数类

与SSCard.dll文档参数的严格对应:

// SSCard.dll文档参数 → 配置属性 → 使用位置
pUrl → readSiCardUrl → Init()初始化参数
pUrl → readIdCardUrl → Init()初始化参数  
pUser → readSiCardUser → Init()初始化参数
pUser → readIdCardUser → Init()初始化参数
建议1024字节 → readSiCardBuffSize → ReadCardBas()缓冲区
建议4096字节 → readIdCardBuffSize → ReadSFZ()缓冲区

🔹 3. ReadCardResult.cs - 返回数据模型

与SSCard.dll返回格式的对应:

// SSCard.dll返回值 → ReadCardResult属性
0/非0 → code (200成功/1001失败)
错误描述/卡片数据 → message/data
签名数据 → sign

📋 三级关联 - 业务调用层

🔹 4. EntryController.cs - Web API入口

路由到SSCard.dll功能的映射:

// Web请求 → 业务方法 → SSCard.dll函数
GET /readcard/entry?param=sicard → SsCardBusiness.ReadSiCard() → ReadCardBas()
GET /readcard/entry?param=idcard → SsCardBusiness.ReadIdCard() → ReadSFZ()

🔹 5. MainForm.cs - 主窗体管理

配置初始化与SSCard.dll的关系:

// 配置获取流程:
GetSiBusinessAddress() → 远程获取配置 → 失败时使用默认配置
默认配置 → address.readSiCardUrl/readSiCardUser等 → 传递给SSCard.dll
测试按钮 → TestSiCard()/TestIdCard() → 直接调用SsCardBusiness
驱动重置 → ResetDriver() → 删除SSCardDriver目录

🔹 6. MainForm.Designer.cs - UI控件绑定

UI与SSCard.dll功能的绑定:

// UI控件 → 事件处理 → SSCard.dll功能
sicard_test.Click → TestSiCard() → ReadCardBas()
idcard_test.Click → TestIdCard() → ReadSFZ()
resetDriver.Click → ResetDriver() → 删除SSCard驱动目录
result_text → 显示SSCard.dll返回的数据

📋 四级关联 - 服务基础设施

🔹 7. RestService.cs - Web服务启动

// Web服务 → API路由 → SSCard.dll调用链
localhost:8321 → Startup配置 → EntryController → SsCardBusiness → SSCard.dll

🔹 8. Startup.cs - OWIN配置

// 路由配置 → SSCard.dll访问路径
routeTemplate: "readcard/{controller}/{id}" → /readcard/entry → SSCard.dll功能

🔹 9. Program.cs - 程序入口

// 应用启动 → 主窗体 → 配置初始化 → SSCard.dll准备
Application.Run(new MainForm()) → GetSiBusinessAddress() → SSCard.dll配置就绪

📋 五级关联 - 辅助和数据模型

🔹 10. FaceAuthData.cs - 认证数据

// 虽然主要用于NationECCode.dll,但可能与SSCard.dll的身份验证流程相关

🔹 11. App.config - 运行时配置

// .NET Framework版本配置 → 影响SSCard.dll的P/Invoke调用
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>

🔄 完整调用链路图

🌐 外部HTTP请求
    ↓
📡 RestService.cs (localhost:8321)
    ↓
⚙️ Startup.cs (路由配置)
    ↓
🎯 EntryController.cs (API入口)
    ↓
📊 SsCardBusiness.cs (业务逻辑)
    ↓
🏗️ SiBusinessAddress.cs (配置参数)
    ↓
💿 SSCard.dll (硬件驱动)
    ↓
📤 ReadCardResult.cs (返回数据)
    ↓
🖥️ MainForm.cs (UI显示/测试)

🔗 配置参数完整流向

🌐 远程配置服务器
    ↓ (HTTP请求)
🖥️ MainForm.GetSiBusinessAddress()
    ↓ (反序列化)
📊 SiBusinessAddress对象
    ↓ (参数传递)
💿 SSCard.dll.Init(readSiCardUrl, readSiCardUser)
    ↓ (缓冲区分配)
StringBuilder(readSiCardBuffSize/readIdCardBuffSize)
    ↓ (函数调用)
SSCard.dll.ReadCardBas()/ReadSFZ()

⚠️ 关键发现和潜在问题

🔹 1. 配置参数格式问题

// 文档要求:pUser = "使用地区"
// 实际传入:pUser = "430105|10.93.28.229:80" (地区码|服务器)
// 可能存在格式不匹配风险

🔹 2. 缓冲区大小配置

// 文档建议 vs 实际配置
ReadCardBas: 1024 vs 2048 ✅ (安全余量)
ReadSFZ: 4096 vs 8192 ✅ (安全余量)

🔹 3. 德生厂家特殊处理

// 文档提到需要SSCardDriver目录配置文件
// 项目有ResetDriver()删除该目录的功能
// 可能影响德生设备的正常工作

🔹 4. 错误处理机制

// SSCard.dll返回0=成功,非0=失败
// 项目统一转换为code: 200=成功,1001=失败
// 错误信息通过pOutBuff返回并包装到message字段

🎯 关联关系总结

所有文件与SSCard.dll的关联关系已完全梳理清楚,形成了严密的调用链和配置体系。项目架构设计合理,参数配置安全保守,但存在几个需要关注的配置格式问题。


MainForm.cs网址功能详细分析

🌐 网址详细功能分析

📋 1. http://172.16.32.167:8077/readCard/getSiBusinessAddress

🎯 作用:获取业务配置参数

private void GetSiBusinessAddress()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://172.16.32.167:8077/readCard/getSiBusinessAddress");
    // ...获取配置JSON数据
    address = Newtonsoft.Json.JsonConvert.DeserializeObject<SiBusinessAddress>(retString);
}

📊 具体功能:

  • 网址类型:内网配置服务器(172.16.32.167是内网IP)
  • 端口:8077
  • 数据格式:返回JSON格式的SiBusinessAddress对象
  • 调用时机:程序启动时首先调用
  • 失败处理:如果获取失败或validFlag == 0,使用硬编码的默认配置

🔧 返回的配置参数包括:

  • readSiCardUrl - 社保卡初始化API地址
  • readSiCardUser - 社保卡使用地区参数
  • readSiCardBuffSize - 社保卡缓冲区大小
  • readIdCardUrl - 身份证初始化API地址
  • readIdCardUser - 身份证使用地区参数
  • readIdCardBuffSize - 身份证缓冲区大小
  • readQrEcTokenUrl - 电子凭证查询API地址
  • organizationId - 机构ID

📋 2. https://scr.hun.hsip.gov.cn/hsa-hgs-adapt/api/card/initDll

🎯 作用:社保卡和身份证的DLL初始化API

// 作为默认配置设置给两个URL
address.readSiCardUrl = "https://scr.hun.hsip.gov.cn/hsa-hgs-adapt/api/card/initDll";
address.readIdCardUrl = "https://scr.hun.hsip.gov.cn/hsa-hgs-adapt/api/card/initDll";

📊 具体功能:

  • 网址类型:湖南省医保平台API(hun.hsip.gov.cn = 湖南省医保信息平台)
  • SSL加密:使用HTTPS协议
  • 用途:传递给SSCard.dllInit()函数作为pUrl参数
  • 调用链SsCardBusiness.Initialize()SSCard.dll.Init(address.readSiCardUrl, address.readSiCardUser)

🔧 在SSCard.dll中的作用:

  • 作为医保提供的API初始化动态库地址
  • 用于初始化读卡器驱动
  • 可能用于下载或验证读卡器驱动程序

📋 3. https://dvs.hun.hsip.gov.cn/localcfc/api/hsecfc/localQrCodeQuery

🎯 作用:医保电子凭证查询API

address.readQrEcTokenUrl = "https://dvs.hun.hsip.gov.cn/localcfc/api/hsecfc/localQrCodeQuery";

📊 具体功能:

  • 网址类型:湖南省医保电子凭证验证服务(dvs = 可能是Digital Verification Service)
  • SSL加密:使用HTTPS协议
  • 用途:传递给NationECCode.dllNationEcTrans()函数
  • 调用链NationalEcBusiness.ReadQrCode()NationECCode.dll.NationEcTrans(address.readQrEcTokenUrl, pindata, ...)

🔧 支持的业务类型:

  • ec.query - 电子凭证查询
  • cn.nhsa.cert.get - 获取身份证信息
  • cn.nhsa.qrcode.get - 获取二维码信息
  • cn.nhsa.ec.auth - 电子凭证认证
  • cn.nhsa.auth.check - 认证检查

📋 4. http://webhis.thyy.cn:8080/download/readcard/version.txt

🎯 作用:版本更新检查

public static string GetVersion()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://webhis.thyy.cn:8080/download/readcard/version.txt");
    // ...返回版本号字符串
}

📊 具体功能:

  • 网址类型:天河区人民医院下载服务器(thyy.cn = 可能是天河区医院)
  • 端口:8080
  • 数据格式:纯文本,返回版本号字符串
  • 调用时机:程序启动时自动检查 + 手动点击"检查更新"
  • 用途:与当前程序版本对比,提示用户是否需要更新

🔧 更新流程:

string currentVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
string newVersion = GetVersion();
if (!currentVersion.Equals(newVersion)) {
    // 提示用户更新,打开UpdateForm
}

🏗️ 网址的系统架构关系

🔗 配置获取流程

程序启动 → 172.16.32.167:8077 → 获取配置 → 失败时使用默认配置

🔗 读卡业务流程

社保卡/身份证读取 → SSCard.dll.Init() → scr.hun.hsip.gov.cn → 初始化驱动
电子凭证业务 → NationECCode.dll → dvs.hun.hsip.gov.cn → 查询验证

🔗 版本管理流程

程序启动/手动检查 → webhis.thyy.cn:8080 → 获取最新版本号 → 对比提示更新

🎯 网址用途总结表

网址 作用 调用时机 数据格式 失败处理
172.16.32.167:8077 配置中心 程序启动 JSON 使用默认配置
scr.hun.hsip.gov.cn 医保读卡初始化 读卡时 - DLL内部处理
dvs.hun.hsip.gov.cn 电子凭证验证 扫码/刷脸时 JSON 返回错误信息
webhis.thyy.cn:8080 版本检查 启动+手动 文本 忽略更新

⚠️ 潜在问题分析

  1. 内网依赖:172.16.32.167 是内网地址,部署到其他网络环境可能无法访问
  2. 单点故障:配置服务器故障时依赖默认配置
  3. 网络安全:版本检查使用HTTP而非HTTPS
  4. 地区绑定:所有API都指向湖南省医保平台,其他地区可能需要修改

🎯 网址架构总结

这些网址构成了完整的配置管理 + 业务服务 + 版本控制的网络架构体系!


📊 项目整体架构图

┌─────────────────────────────────────────────────────────────┐
│                    ThCardReader 项目架构                      │
├─────────────────────────────────────────────────────────────┤
│  配置层:172.16.32.167:8077 → SiBusinessAddress.cs        │
│  服务层:RestService.cs → Startup.cs → EntryController.cs  │
│  业务层:SsCardBusiness.cs → NationalEcBusiness.cs         │
│  驱动层:SSCard.dll → NationECCode.dll                     │
│  外部API:scr.hun.hsip.gov.cn → dvs.hun.hsip.gov.cn       │
│  版本管理:webhis.thyy.cn:8080 → UpdateForm.cs             │
│  界面层:MainForm.cs → MainForm.Designer.cs                │
└─────────────────────────────────────────────────────────────┘

📅 文档生成时间: $(date)
📝 分析范围: ThCardReader项目完整架构与网络依赖关系
🎯 分析目的: 为后续文档对比和参数修改提供详细参考