# 华视电子身份证阅读器SDK使用手册 **版本:V3.3.0.7** **发布:深圳华视电子读写设备有限公司** **日期:2018年08月20日** --- ## 📋 目录 1. [版本信息](#版本信息) 2. [文件说明](#文件说明) 3. [函数列表](#函数列表) 4. [数据结构](#数据结构) 5. [函数详细说明](#函数详细说明) 6. [函数调用流程](#函数调用流程) 7. [核心函数说明](#核心函数说明) 8. [信息格式说明](#信息格式说明) 9. [其他函数用法](#其他函数用法) --- ## 📝 版本信息 | 序号 | 版本号 | 修改日期 | 修改内容 | |------|---------|----------|----------| | 1 | V3.3.0.1 | 2016-09-20 | 在上一版本的基础上,修复多出动态库BUG,重新撰写使用说明 | | 2 | V3.3.0.2 | 2016-12-19 | 增加对穿青人和达斡尔族民族的显示 | | 3 | V3.3.0.3 | 2017-06-23 | 增加对外国人永居证的读取 | | 4 | V3.3.0.4 | 2017-08-08 | 增加对革家人民族的显示 | | 5 | V3.3.0.5 | 2017-11-09 | 增加对windows64位系统的支持 | | 6 | V3.3.0.6 | 2018-07-03 | 增加PB语言的示例代码 | | 7 | V3.3.0.7 | 2018-08-20 | 增加对港澳台居民居住证的读取 | | 8 | V3.3.0.8 | 2023-09-26 | 增加新版外国人 | --- ## 📁 文件说明 ### 🔧 SDK组件 | 文件名 | 说明 | 用途 | |--------|------|------| | `termb.dll` | API函数的动态联接库 | 主要接口库 | | `sdtapi.dll` | 安全模块通讯函数 | 安全通信 | | `WltRs.dll` | 身份证相片解码库 | 照片处理 | | `SysInfo.dll` | 系统信息库 | 系统支持 | ### 💻 系统支持 - **操作系统**:Windows XP、Windows7(32位和64位)等常见操作系统 - **开发语言**: - Visual C++ 6.0 及以后版本 - Visual Basic 6.0 及以后版本 - Delphi 6.0 及以后版本 - PowerBuilder 6.0 及以后版本 - Visual C# 2005 及以后版本 **技术支持联系人:13723716489 何工** --- ## 🔧 函数列表 ### 主要API函数 ```c int CVR_InitComm(int Port); // 初始化连接 int CVR_Authenticate(); // 卡认证 int CVR_AuthenticateForNoJudge(); // 卡认证一直成功版本 int CVR_Read_Content(int active); // 读卡操作 int CVR_Read_FPContent(); // 读卡操作,含指纹 int CVR_CloseComm(); // 关闭连接 int CVR_FindCard(); // 找卡 int CVR_SelectCard(); // 选卡 ``` --- ## 📊 数据结构 ### 1. 居民身份证结构 | 名称 | 含义 | 长度 | 备注 | |------|------|------|------| | 姓名 | 姓名 | 不超过30字节 | | | 性别 | 性别 | 不超过2个字节 | 符合GB/T 2261.1的规定 | | 民族 | 民族 | 不超过20个字节 | 或10个unicode字符 | | 出生日期 | 出生日期 | 不超过16个字节 | 格式为YYMMDD | | 住址 | 户口所在地 | 不超过70个字节 | 或35个unicode字符 | | 公民身份证号码 | 证件号码 | 不超过36个字节 | 或18个unicode字符 | | 签发机关 | 签发机关 | 不超过30字节 | | | 有效期起始日期 | 有效期起始日期 | 不超过16个字节 | 格式为YYMMDD | | 有效期终止日期 | 有效期终止日期 | 不超过16个字节 | 格式为YYMMDD | | 指纹数据 | 指纹数据 | 不超过1024字节 | 二进制数据,需证件内含有指纹 | ### 2. 外国人居留证结构 | 名称 | 含义 | 长度 | 备注 | |------|------|------|------| | 英文姓名 | 外国人英文姓名 | 不超过120字节 | | | 性别 | 外国人性别 | 不超过2个字节 | 符合GB/T 2261.1的规定 | | 永久居留证号码 | 证件号码 | 不超过30个字节 | 或15个unicode字符 | | 国籍、地区代码 | 国籍或所在地区代码 | | 参考GB/T 2659-2000中文缩写 | | 中文姓名 | 中文姓名 | 不超过30个字节 | 或15个unicode双字节(UTF16)字符 | | 证件签发日期 | 证件签发日期 | 不超过16个字节 | 格式为YYMMDD | | 证件终止日期 | 证件终止日期 | 不超过16个字节 | 格式为YYMMDD | | 出生日期 | 出生日期 | 不超过16个字节 | 格式为YYMMDD | | 证件版本号 | 证件版本号 | 不超过4字节 | | | 受理机关代码 | 当次申请受理机关代码 | 不超过8个字节 | | | 证件类别 | 证件类别 | | "I" | | 照片内容 | 照片内容 | | 若取得bmp数据,则不超过38862字节,jpg数据长度可变 | ### 3. 港澳台居住证结构 | 名称 | 含义 | 长度 | 备注 | |------|------|------|------| | 姓名 | 姓名 | 不超过30字节 | | | 性别 | 性别 | 不超过2个字节 | 符合GB/T 2261.1的规定 | | 出生日期 | 出生日期 | 不超过16个字节 | 格式为YYMMDD | | 住址 | 户口所在地 | 不超过70个字节 | 或35个unicode字符 | | 公民身份证号码 | 证件号码 | 不超过36个字节 | 或18个unicode字符 | | 签发机关 | 签发机关 | 不超过30字节 | | | 有效期起始日期 | 有效期起始日期 | 不超过16个字节 | 格式为YYMMDD | | 有效期终止日期 | 有效期终止日期 | 不超过16个字节 | 格式为YYMMDD | | 通行证号码 | 通行证号码 | 不超过18个字节 | | | 签发次数 | 签发次数 | 不超过4字节 | | | 证件类别 | 证件类别 | | "J" | | 照片内容 | 照片内容 | | 若取得bmp数据,则不超过38862字节,jpg数据长度可变 | | 指纹数据 | 指纹数据 | 不超过1024字节 | 2进制数据 | ### 4. 新版外国人居留证结构 | 名称 | 含义 | 长度 | 备注 | |------|------|------|------| | 英文姓名 | 外国人英文姓名 | 不超过92字节 | | | 性别 | 外国人性别 | 不超过2个字节 | 符合GB/T 2261.1的规定 | | 永久居留证号码 | 证件号码 | 不超过30个字节 | 或15个unicode字符 | | 国籍、地区代码 | 国籍或所在地区代码 | | 参考GB/T 2659-2000中文缩写 | | 中文姓名 | 中文姓名 | 不超过30个字节 | 或15个unicode双字节(UTF16)字符 | | 证件签发日期 | 证件签发日期 | 不超过16个字节 | 格式为YYMMDD | | 证件终止日期 | 证件终止日期 | 不超过16个字节 | 格式为YYMMDD | | 出生日期 | 出生日期 | 不超过16个字节 | 格式为YYMMDD | | 换证次数 | 换证次数 | 4字节 | | | 旧版证件号码 | 旧版证件号码 | 6字节 | | | 证件类别 | 证件类别 | | "Y" | | 照片内容 | 照片内容 | | 若取得bmp数据,则不超过38862字节,jpg数据长度可变 | > **注意**:CVR_Authenticate功能和CVR_FindCard+ CVR_SelectCard一样,CVR_Authenticate内部调用了找卡和选卡函数,接口分开是为了调用者开发方便。 --- ## 🔍 函数详细说明 ### 数据获取函数(多字节版本) #### 基本信息获取 ```c int GetPeopleName(char *strTmp, int *strLen); // 得到姓名信息 int GetPeopleSex(char *strTmp, int *strLen); // 得到性别信息 int GetPeopleNation(char *strTmp, int *strLen); // 得到民族信息 int GetPeopleBirthday(char *strTmp, int *strLen); // 得到出生日期 int GetPeopleIDCode(char *strTmp, int *strLen); // 得到身份证号信息 int GetPeopleAddress(char *strTmp, int *strLen); // 得到地址信息 int GetDepartment(char *strTmp, int *strLen); // 得到发证机关信息 int GetStartDate(char *strTmp, int *strLen); // 得到有效开始日期 int GetEndDate(char *strTmp, int *strLen); // 得到有效截止日期 ``` #### 扩展信息获取 ```c int GetNationCode(unsigned char *nationData, int *strLen); // 得到民族代码 int GetSexCode(unsigned char *sexData, int *pLen); // 得到性别代码 int GetCertType(unsigned char *nationData, int *pLen); // 获取证件类别 int GetFPDate(unsigned char *pData, int *pLen); // 得到指纹数据 int GetPassCheckID(unsigned char *strTmp, int *strLen); // 通行证号码 int GetIssuesNum(int *IssuesNum); // 签发次数 int GetNewAppMsg(unsigned char *nationData, int *pLen); // 获取追加地址 ``` #### 照片数据获取 ```c int GetBMPData(unsigned char *pData, int *pLen); // 得到头像照片bmp数据 int Getbase64BMPData(unsigned char *pData, int *pLen); // 得到头像照片base64编码数据 int Getbase64JpgData(unsigned char *pData, int *pLen); // 得到头像照片jpg数据 int GetJpgData(unsigned char *jpgData, int *pLen); // 获取jpg二进制数据 ``` #### 外国人专用函数 ```c int GetPeopleChineseName(unsigned char *strTmp, int *strLen); // 获取外国人中文姓名 int GetOldIDCardNumber(unsigned char *strTmp, int *strLen); // 获取旧版外国人证件号码 int GetStandbyEName(unsigned char *strTmp, int *strLen); // 获取英文备用名 int GetPeopleCertVersion(unsigned char *strTmp, int *strLen); // 得到外国人证件版本 ``` #### 系统函数 ```c int CVR_GetSAMID(char *SAMID); // 得到安全模块号 ``` ### Unicode版本函数 所有上述函数都有对应的Unicode版本,函数名后缀加"U": ```c int GetPeopleNameU(char *strTmp, int *strLen); // Unicode版本姓名获取 int GetPeopleSexU(char *strTmp, int *strLen); // Unicode版本性别获取 // ... 其他Unicode版本函数 ``` --- ## 🔄 函数调用流程 ```mermaid graph TD A[CVR_InitComm] --> B{初始化成功?} B -->|否| C[返回错误] B -->|是| D[CVR_Authenticate] D --> E{认证成功?} E -->|否| F[返回错误] E -->|是| G[CVR_Read_Content] G --> H[GetPeopleName
GetPeopleSex
GetPeopleNation
...
其他getter函数] H --> I[CVR_CloseComm] ``` --- ## ⚙️ 核心函数说明 ### 1. 初始化连接 ```c int CVR_InitComm(int Port) ``` **说明**:本函数用于PC与华视电子第二代居民身份证阅读器的连接。 **参数**: | 参数名 | 含义 | 取值范围 | |--------|------|----------| | int Port | 端口编号 | 见端口编号表 | **端口编号表**: | 值 | 意义 | 值 | 意义 | |----|------|----|------| | 1 | 串口1 | 1001 | USB口1 | | 2 | 串口2 | 1002 | USB口2 | | 3 | 串口3 | 1003 | USB口3 | | ... | ... | ... | ... | | 16 | 串口16 | 1016 | USB口16 | **返回值**: | 值 | 意义 | |----|------| | 1 | 正确 | | 2 | 端口打开失败 | | -1 | 未知错误 | | -2 | 动态库加载失败 | ### 2. 关闭端口 ```c int CVR_CloseComm(void) ``` **说明**:本函数用于关闭PC到阅读器的连接。 **参数**:无 **返回值**: | 值 | 意义 | |----|------| | 1 | 关闭成功 | | 0 | 端口号不合法 | | -1 | 端口已经关闭 | | -2 | 动态库加载失败 | ### 3. 卡认证 ```c int CVR_Authenticate(void) ``` **说明**:本函数用于读卡器和卡片之间的合法身份确认。卡认证循环间隔大于300ms。 **参数**:无 **返回值**: | 值 | 意义 | 说明 | |----|------|------| | 1 | 正确 | 卡片认证成功 | | 2 | 错误 | 寻卡失败 | | 3 | 错误 | 选卡失败 | | 4 | 错误 | 未连接读卡器 | | 0 | 错误 | 动态库未加载 | > **注意**:若卡片放置后发生认证错误时,请移走卡片重新放置。 ```c int CVR_AuthenticateForNoJudge(void) ``` **说明**:使用此接口读卡不用每次都拿起放下,可以一直读。此函数返回值一直为1。 ### 4. 读卡操作 ```c int CVR_Read_FPContent(void) ``` **说明**:本函数用于通过阅读器从第二代居民身份证中读取相应信息。卡认证成功以后才可做读卡操作,读卡完毕若继续读卡应移走二代证卡片重新放置做卡认证。 **参数**:无 **返回值**: | 返回值 | 意义 | |--------|------| | 1 | 正确 | | 0 | 错误,读身份证失败 | | 4 | 错误,身份证读卡器未连接 | | 99 | 动态库未加载 | ### 5. 获取性别代码 ```c int GetSexCode(unsigned char *sexData, int *pLen) ``` **说明**:本函数获取性别代码 **参数**: | 参数名 | 含义 | 取值范围 | |--------|------|----------| | unsigned char *sexData | 缓冲区地址 | | | int *pLen | 缓冲区长度指针 | 4字节 | **返回值**: | 值 | 意义 | |----|------| | 1 | 正确 | | 0 | 错误 | ### 6. 获取民族代码 ```c int GetNationCode(unsigned char *nationData, int *pLen) ``` **说明**:本函数获取民族代码 **参数**: | 参数名 | 含义 | 取值范围 | |--------|------|----------| | unsigned char *nationData | 缓冲区地址 | | | int *pLen | 缓冲区长度指针 | 4字节 | **返回值**: | 值 | 意义 | |----|------| | 1 | 正确 | | 0 | 错误 | ### 7. 获取设备状态 ```c int CVR_GetStatus(void) ``` **说明**:本函数获取设备状态 **返回值**: | 值 | 意义 | |----|------| | 1 | 状态正常 | | -1 | 状态异常 | --- ## 📄 信息格式说明 ### 1. 居民身份证txt文件格式 读卡成功后在当前目录下生成`wz.txt`(文字信息)和`zp.bmp`(照片信息) **wz.txt内容示例**: ``` 张红叶 女 汉 19881118 河北省邯郸市临漳县称勾镇称勾东村复兴路25号 130423198811184328 临漳县公安局 20110330-20210330 ``` ### 2. 外国人永居证txt文件格式 读卡成功后在当前目录下生成`wz.txt`(文字信息)和`zp.bmp`(照片信息) **wz.txt内容示例**: ``` ZHENGJIAN,YANGBEN 证件样本 女 19810803 加拿大 CAN 20151025-20251024 CAN110081080319 1500 01 ``` **从上到下依次为**:英文姓名,中文姓名,性别,出生日期,国籍,国籍代码,有效期限,证件号码,签发机关代码,证件版本号。 ### 3. 港澳台居民居住证TXT文件格式 读卡成功后在当前目录下生成`wz.txt`(文字信息)和`zp.bmp`(照片信息) **wz.txt内容示例**: ``` 金鑫 女 19940823 北京市西城区复兴门外大街999号院11号楼3单元502室 810000199408230013 北京市公安局西城分局 20171027-20221026 000000000 1 ``` ### 4. 新版外国人永局证TXT文件格式 **wz.txt内容示例**: ``` ZHENGJIAN, YANGBEN ZHENG JIAN YANG 证件样本证件样本 女 2016-01-01 巴基斯坦 PAK 20230808-20280807 931586201601010026 BEN 0 ``` --- ## 🛠️ 其他函数用法 ### 读各项文字信息到自定义内存缓冲 **函数原型**: ```c int GetPeopleName(char *strTmp, int *strLen); // 得到姓名信息 int GetPeopleSex(char *strTmp, int *strLen); // 得到性别信息 int GetPeopleNation(char *strTmp, int *strLen); // 得到民族信息 int GetPeopleBirthday(char *strTmp, int *strLen); // 得到出生日期 int GetPeopleAddress(char *strTmp, int *strLen); // 得到地址信息 int GetPeopleIDCode(char *strTmp, int *strLen); // 得到卡号信息 int GetDepartment(char *strTmp, int *strLen); // 得到发证机关信息 int GetStartDate(char *strTmp, int *strLen); // 得到有效开始日期 int GetEndDate(char *strTmp, int *strLen); // 得到有效截止日期 int CVR_GetSAMID(char *SAMID); // 得到安全模块号码 ``` **参数说明**: - `*strTmp`:返回的信息缓存指针 - `*strLen`:返回的信息长度指针 **返回值**: | 返回值 | 意义 | |--------|------| | 1 | 正确 | | 0 | 错误 | > **注意**:若采用查询方式自动判断卡片是否放置,则间隔时间建议大于600ms。 --- **本手册是操作身份证阅读器动态库应用函数的定义格式、调用方法和返回值的说明。**