hn-readcard-go/README.md

121 lines
4.4 KiB
Markdown
Raw Permalink Normal View History

2026-08-06 11:23:33 +08:00
# readcard-go
2026-08-12 13:40:06 +08:00
## GUI 读卡界面
双击打包后的 `readcard-go.exe` 会启动桌面读卡界面和后台 HTTP 服务。点击“读卡”后,成功时显示二维码,内容格式为:
```text
encodeURIComponent(Name)|IDNum|CardNum|CardIDCode
```
失败时错误原因显示在二维码下方。GUI 默认使用杭州免 PIN 读卡器类型,可在 `config.json` 中修改:
```json
"gui_reader_type": "ZJ_HZ_310000"
```
Windows Common Controls v6 清单已通过 `rsrc_windows_386.syso` 嵌入 EXE用于避免 GUI 启动时出现 `TTM_ADDTOOL failed``readcard-go.exe.manifest` 是资源的源文件;如修改该文件,需要重新生成对应的 `.syso` 资源。
2026-08-06 11:23:33 +08:00
`card-read-service` 的 Go 版本,保持原有 HTTP 接口和响应格式并增加业务失败、panic、DLL 崩溃与异常退出日志。
## 构建和运行
### 打包环境要求
执行打包操作的电脑必须已经安装 Go 开发环境,并且 `go` 命令已加入系统 `PATH`。可以在命令行中执行以下命令检查:
```powershell
go version
```
能够正常输出 Go 版本信息即可,例如:
```text
go version go1.26.5 windows/amd64
```
不需要另外安装 32 位 Go。厂商 `CardReaderDLL.dll` 是 32 位 DLL打包脚本会自动设置 `GOOS=windows``GOARCH=386``CGO_ENABLED=0`,使用常规的 64 位 Go 环境即可生成 32 位程序。
最终使用 `dist/readcard-go.exe` 的电脑不需要安装 Go 环境,但必须复制完整的 `dist` 目录,不能只复制 exe 文件。
### 执行打包
在 PowerShell 中执行:
```powershell
.\build.ps1 -Version "1.0.0"
.\dist\readcard-go.exe
```
也可以直接双击项目根目录下的 `一键打包.bat`。脚本会自动调用 PowerShell 完成测试、构建和厂商依赖复制,成功后自动打开 `dist` 发布目录;打包版本可修改批处理文件顶部的 `BUILD_VERSION`
在 macOS 中可使用 `一键打包.sh` 交叉编译 Windows 32 位产物:
```bash
chmod +x ./一键打包.sh
./一键打包.sh
```
只检查打包环境、不执行构建:
```bash
./一键打包.sh --check
```
macOS 脚本会检查 Go 版本和 `windows/386` 目标,编译 Windows 测试程序(不在 macOS 上运行),生成 `dist/readcard-go.exe`,并复制 `config.json` 和完整的厂商 DLL 目录。最终产物仍需在 Windows 真机上验证。
构建脚本会运行测试、生成 `dist/readcard-go.exe`,并把原项目的 `package/DWCardReaderDLL` 复制到发布目录。开发运行可执行:
```powershell
.\run.ps1
```
启动后:
- 健康检查:`GET http://127.0.0.1:17880/health`
- 免 PIN 读卡:`POST http://127.0.0.1:17880/api/card/read-nopin`
- 嘉兴带 PIN 读卡:`POST http://127.0.0.1:17880/api/card/read`
- HMAC-SM3`POST http://127.0.0.1:17880/api/hmac-sm3`
免 PIN 读卡示例:
```powershell
Invoke-RestMethod -Method Post -Uri http://127.0.0.1:17880/api/card/read-nopin `
-ContentType "application/json" `
-Body '{"reader_type":"ZJ_HZ_310000"}'
```
## 日志
日志默认写入程序目录下的 `logs`
- `service-组件-YYYY-MM-DD.log`启动、配置、DLL 加载、HTTP 失败、读卡失败、panic 堆栈和自动重启记录。
- `crash-YYYY-MM-DD.log`:工作进程写到标准错误的 Go runtime/native crash 信息。
日志达到 `log_max_file_mb` 后自动生成 `-001``-002` 分卷;日志目录超过 `log_max_total_mb` 时优先删除最旧分卷,同时仍按 `log_retention_days` 清理过期日志。默认单文件最大 20MB、目录总量最大 200MB、保留 30 天。
程序默认由守护进程启动工作进程。若 DLL 导致工作进程直接崩溃,守护进程会记录 PID、退出码、运行时长并自动重启30 秒内连续崩溃达到 `max_rapid_restarts` 后停止,避免无限重启。日志不会记录身份证号、卡号、密钥或请求正文。
## 配置
`config.json`
```json
{
"host": "127.0.0.1",
"port": 17880,
"dll_dir": "package/DWCardReaderDLL",
"cors_origin": "*",
"log_dir": "logs",
"log_retention_days": 30,
"log_max_file_mb": 20,
"log_max_total_mb": 200,
"restart_delay_ms": 1500,
"max_rapid_restarts": 5
}
```
支持环境变量:`CARD_HOST``CARD_PORT``CARD_DLL_DIR``CARD_CORS_ORIGIN``CARD_LOG_DIR``CARD_LOG_MAX_FILE_MB``CARD_LOG_MAX_TOTAL_MB`。调试时设置 `CARD_NO_SUPERVISOR=1` 可直接运行工作进程。
接口行为和 `reader_type` 列表请参照原项目 `card-read-service/README.md`