# ThCardReader项目分析报告 ## 📋 目录 1. [SSCard.dll与项目文件的完整关联关系分析](#sscarddll与项目文件的完整关联关系分析) 2. [MainForm.cs网址功能详细分析](#mainformcs网址功能详细分析) --- ## SSCard.dll与项目文件的完整关联关系分析 ### 📋 **一级关联 - 直接调用SSCard.dll的文件** #### 🔹 **1. SsCardBusiness.cs** - 核心业务类 **与SSCard.dll的直接映射关系:** ```csharp // 文档函数 → C# P/Invoke声明 → 实际调用 Init(pUrl, pUser) → Init(string, string) → address.readSiCardUrl, address.readSiCardUser ReadCardBas(...) → ReadCardBas(StringBuilder...) → 社保卡读取 ReadSFZ(...) → ReadSFZ(StringBuilder...) → 身份证读取 ``` ### 📋 **二级关联 - 配置和数据管理** #### 🔹 **2. SiBusinessAddress.cs** - 配置参数类 **与SSCard.dll文档参数的严格对应:** ```csharp // 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返回格式的对应:** ```csharp // SSCard.dll返回值 → ReadCardResult属性 0/非0 → code (200成功/1001失败) 错误描述/卡片数据 → message/data 签名数据 → sign ``` ### 📋 **三级关联 - 业务调用层** #### 🔹 **4. EntryController.cs** - Web API入口 **路由到SSCard.dll功能的映射:** ```csharp // Web请求 → 业务方法 → SSCard.dll函数 GET /readcard/entry?param=sicard → SsCardBusiness.ReadSiCard() → ReadCardBas() GET /readcard/entry?param=idcard → SsCardBusiness.ReadIdCard() → ReadSFZ() ``` #### 🔹 **5. MainForm.cs** - 主窗体管理 **配置初始化与SSCard.dll的关系:** ```csharp // 配置获取流程: GetSiBusinessAddress() → 远程获取配置 → 失败时使用默认配置 默认配置 → address.readSiCardUrl/readSiCardUser等 → 传递给SSCard.dll 测试按钮 → TestSiCard()/TestIdCard() → 直接调用SsCardBusiness 驱动重置 → ResetDriver() → 删除SSCardDriver目录 ``` #### 🔹 **6. MainForm.Designer.cs** - UI控件绑定 **UI与SSCard.dll功能的绑定:** ```csharp // 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服务启动 ```csharp // Web服务 → API路由 → SSCard.dll调用链 localhost:8321 → Startup配置 → EntryController → SsCardBusiness → SSCard.dll ``` #### 🔹 **8. Startup.cs** - OWIN配置 ```csharp // 路由配置 → SSCard.dll访问路径 routeTemplate: "readcard/{controller}/{id}" → /readcard/entry → SSCard.dll功能 ``` #### 🔹 **9. Program.cs** - 程序入口 ```csharp // 应用启动 → 主窗体 → 配置初始化 → SSCard.dll准备 Application.Run(new MainForm()) → GetSiBusinessAddress() → SSCard.dll配置就绪 ``` ### 📋 **五级关联 - 辅助和数据模型** #### 🔹 **10. FaceAuthData.cs** - 认证数据 ```csharp // 虽然主要用于NationECCode.dll,但可能与SSCard.dll的身份验证流程相关 ``` #### 🔹 **11. App.config** - 运行时配置 ```csharp // .NET Framework版本配置 → 影响SSCard.dll的P/Invoke调用 ``` ### 🔄 **完整调用链路图** ``` 🌐 外部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. 配置参数格式问题** ```csharp // 文档要求:pUser = "使用地区" // 实际传入:pUser = "430105|10.93.28.229:80" (地区码|服务器) // 可能存在格式不匹配风险 ``` #### 🔹 **2. 缓冲区大小配置** ```csharp // 文档建议 vs 实际配置 ReadCardBas: 1024 vs 2048 ✅ (安全余量) ReadSFZ: 4096 vs 8192 ✅ (安全余量) ``` #### 🔹 **3. 德生厂家特殊处理** ```csharp // 文档提到需要SSCardDriver目录配置文件 // 项目有ResetDriver()删除该目录的功能 // 可能影响德生设备的正常工作 ``` #### 🔹 **4. 错误处理机制** ```csharp // SSCard.dll返回0=成功,非0=失败 // 项目统一转换为code: 200=成功,1001=失败 // 错误信息通过pOutBuff返回并包装到message字段 ``` ### 🎯 **关联关系总结** **所有文件与SSCard.dll的关联关系已完全梳理清楚,形成了严密的调用链和配置体系。项目架构设计合理,参数配置安全保守,但存在几个需要关注的配置格式问题。** --- ## MainForm.cs网址功能详细分析 ### 🌐 **网址详细功能分析** #### 📋 **1. http://172.16.32.167:8077/readCard/getSiBusinessAddress** **🎯 作用:获取业务配置参数** ```csharp private void GetSiBusinessAddress() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://172.16.32.167:8077/readCard/getSiBusinessAddress"); // ...获取配置JSON数据 address = Newtonsoft.Json.JsonConvert.DeserializeObject(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** ```csharp // 作为默认配置设置给两个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.dll`的`Init()`函数作为`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** ```csharp address.readQrEcTokenUrl = "https://dvs.hun.hsip.gov.cn/localcfc/api/hsecfc/localQrCodeQuery"; ``` **📊 具体功能:** - **网址类型**:湖南省医保电子凭证验证服务(dvs = 可能是Digital Verification Service) - **SSL加密**:使用HTTPS协议 - **用途**:传递给`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` - 认证检查 --- #### 📋 **4. http://webhis.thyy.cn:8080/download/readcard/version.txt** **🎯 作用:版本更新检查** ```csharp public static string GetVersion() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://webhis.thyy.cn:8080/download/readcard/version.txt"); // ...返回版本号字符串 } ``` **📊 具体功能:** - **网址类型**:天河区人民医院下载服务器(thyy.cn = 可能是天河区医院) - **端口**:8080 - **数据格式**:纯文本,返回版本号字符串 - **调用时机**:程序启动时自动检查 + 手动点击"检查更新" - **用途**:与当前程序版本对比,提示用户是否需要更新 **🔧 更新流程:** ```csharp 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项目完整架构与网络依赖关系 **🎯 分析目的:** 为后续文档对比和参数修改提供详细参考