与SSCard.dll的直接映射关系:
// 文档函数 → C# P/Invoke声明 → 实际调用
Init(pUrl, pUser) → Init(string, string) → address.readSiCardUrl, address.readSiCardUser
ReadCardBas(...) → ReadCardBas(StringBuilder...) → 社保卡读取
ReadSFZ(...) → ReadSFZ(StringBuilder...) → 身份证读取
与SSCard.dll文档参数的严格对应:
// SSCard.dll文档参数 → 配置属性 → 使用位置
pUrl → readSiCardUrl → Init()初始化参数
pUrl → readIdCardUrl → Init()初始化参数
pUser → readSiCardUser → Init()初始化参数
pUser → readIdCardUser → Init()初始化参数
建议1024字节 → readSiCardBuffSize → ReadCardBas()缓冲区
建议4096字节 → readIdCardBuffSize → ReadSFZ()缓冲区
与SSCard.dll返回格式的对应:
// SSCard.dll返回值 → ReadCardResult属性
0/非0 → code (200成功/1001失败)
错误描述/卡片数据 → message/data
签名数据 → sign
路由到SSCard.dll功能的映射:
// Web请求 → 业务方法 → SSCard.dll函数
GET /readcard/entry?param=sicard → SsCardBusiness.ReadSiCard() → ReadCardBas()
GET /readcard/entry?param=idcard → SsCardBusiness.ReadIdCard() → ReadSFZ()
配置初始化与SSCard.dll的关系:
// 配置获取流程:
GetSiBusinessAddress() → 远程获取配置 → 失败时使用默认配置
默认配置 → address.readSiCardUrl/readSiCardUser等 → 传递给SSCard.dll
测试按钮 → TestSiCard()/TestIdCard() → 直接调用SsCardBusiness
驱动重置 → ResetDriver() → 删除SSCardDriver目录
UI与SSCard.dll功能的绑定:
// UI控件 → 事件处理 → SSCard.dll功能
sicard_test.Click → TestSiCard() → ReadCardBas()
idcard_test.Click → TestIdCard() → ReadSFZ()
resetDriver.Click → ResetDriver() → 删除SSCard驱动目录
result_text → 显示SSCard.dll返回的数据
// Web服务 → API路由 → SSCard.dll调用链
localhost:8321 → Startup配置 → EntryController → SsCardBusiness → SSCard.dll
// 路由配置 → SSCard.dll访问路径
routeTemplate: "readcard/{controller}/{id}" → /readcard/entry → SSCard.dll功能
// 应用启动 → 主窗体 → 配置初始化 → SSCard.dll准备
Application.Run(new MainForm()) → GetSiBusinessAddress() → SSCard.dll配置就绪
// 虽然主要用于NationECCode.dll,但可能与SSCard.dll的身份验证流程相关
// .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()
// 文档要求:pUser = "使用地区"
// 实际传入:pUser = "430105|10.93.28.229:80" (地区码|服务器)
// 可能存在格式不匹配风险
// 文档建议 vs 实际配置
ReadCardBas: 1024 vs 2048 ✅ (安全余量)
ReadSFZ: 4096 vs 8192 ✅ (安全余量)
// 文档提到需要SSCardDriver目录配置文件
// 项目有ResetDriver()删除该目录的功能
// 可能影响德生设备的正常工作
// SSCard.dll返回0=成功,非0=失败
// 项目统一转换为code: 200=成功,1001=失败
// 错误信息通过pOutBuff返回并包装到message字段
所有文件与SSCard.dll的关联关系已完全梳理清楚,形成了严密的调用链和配置体系。项目架构设计合理,参数配置安全保守,但存在几个需要关注的配置格式问题。
🎯 作用:获取业务配置参数
private void GetSiBusinessAddress()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://172.16.32.167:8077/readCard/getSiBusinessAddress");
// ...获取配置JSON数据
address = Newtonsoft.Json.JsonConvert.DeserializeObject<SiBusinessAddress>(retString);
}
📊 具体功能:
SiBusinessAddress
对象validFlag == 0
,使用硬编码的默认配置🔧 返回的配置参数包括:
readSiCardUrl
- 社保卡初始化API地址readSiCardUser
- 社保卡使用地区参数readSiCardBuffSize
- 社保卡缓冲区大小readIdCardUrl
- 身份证初始化API地址readIdCardUser
- 身份证使用地区参数readIdCardBuffSize
- 身份证缓冲区大小readQrEcTokenUrl
- 电子凭证查询API地址organizationId
- 机构ID🎯 作用:社保卡和身份证的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";
📊 具体功能:
SSCard.dll
的Init()
函数作为pUrl
参数SsCardBusiness.Initialize()
→ SSCard.dll.Init(address.readSiCardUrl, address.readSiCardUser)
🔧 在SSCard.dll中的作用:
🎯 作用:医保电子凭证查询API
address.readQrEcTokenUrl = "https://dvs.hun.hsip.gov.cn/localcfc/api/hsecfc/localQrCodeQuery";
📊 具体功能:
NationECCode.dll
的NationEcTrans()
函数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
- 认证检查🎯 作用:版本更新检查
public static string GetVersion()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://webhis.thyy.cn:8080/download/readcard/version.txt");
// ...返回版本号字符串
}
📊 具体功能:
🔧 更新流程:
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 |
版本检查 | 启动+手动 | 文本 | 忽略更新 |
这些网址构成了完整的配置管理 + 业务服务 + 版本控制的网络架构体系!
┌─────────────────────────────────────────────────────────────┐
│ 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项目完整架构与网络依赖关系
🎯 分析目的: 为后续文档对比和参数修改提供详细参考