二代证Dll使用说明
神思二代身份证验证机具接口控件说明

神思第二代身份证验证机具ActiveX控件使用说明版本:V1.3.0.0山东神思电子技术有限公司2010年11月修订记录版本号日期章节号简单描述修订者审核者1.0 2007.6.12 初始创建谭雪欣1.0.55.0 2008.7.25 增加部分函数谭雪欣1.0.57.0 2008.9.8 修改了同时打开多个页面,关闭出错问题。
谭雪欣1.0.58.0 2008-09-12 增加了wlt图片的buffer属性等。
谭雪欣1.0.72.0 2008-11-12 增加手动读卡时读卡失败则清空卡面信息,打开界面自动开始读卡,身份证反正面为横版。
谭雪欣1.0.77.0 2008-11-13 增加保存身份证反正面图片函数等谭雪欣1.0.81.0 2008-11-25 增加安全模块号的读取谭雪欣1.0.82.0 2009-3-3 修改身份证图片生成temp文件夹下谭雪欣1.0.83.0 2009-3-10 增加清空属性的函数谭雪欣1.0.85.0 2009-5-31 用户自定义图片存放路径。
谭雪欣1.0.87.0 2009-08-27 增加身份证正反面的单独保存陈金华1.0.97 2009-09-09 增加临时文件自定义保存目录、配置文件ini存放在c盘根目录低下陈金华1.1.0.0 2010-11-19 Win7,IE8下界面显示黑框,修改源码,并去掉界面对于按钮,只显示身份证正面和签发机关、有效期限、最新住址。
谭雪欣1.2.0.0 2010-11-23 增加属性szCardInfo,方法readrfcard 谭雪欣1.3.0.0 2010-11-30 整理界面,更换最新rdcard2.0 谭雪欣目录1、说明 (5)2、控件方法 (5)2.1 打开端口连接设备 (5)2.2 关闭端口断开设备 (5)2.3 检测连接方法 (5)2.4 读取证件信息 (5)2.5 自动读取信息 (6)2.6 结束自动读卡 (6)2.7 删除读卡过程中生成的单个图片和文本文件 (6)2.8 删除读卡过程中在temp文件夹下生成的全部jpg图片 (6)2.9 删除读卡过程中生成的任意文件 (6)2.10获得读卡过程中生成文件的Base64编码 (6)2.11清空所有属性 (7)2.12打印身份证反正面图片 (7)2.13 readrfcard读卡 (7)2.14 错误代码表 (7)3、控件属性 (8)3.1 姓名 (8)3.2 性别 (8)3.3 民族 (8)3.4 出生日期 (9)3.5 住址 (9)3.6 公民身份号码 (9)3.7 签发机关 (9)3.8 有效期限 (9)3.9 有效期限起始日期 (10)3.10 有效期限截止日期 (10)3.11 JPG照片存放路径 (10)3.12 BMP照片存放路径 (10)3.13 WLT照片存放路径 (10)3.14JPG照片的Base64编码字符串 (11)3.15 BMP照片的Base64编码字符串 (11)3.16 WLT照片的Base64编码字符串 (11)3.17 身份证文本信息存放路径 (11)3.18 有数据标志 (11)3.19 控件状态标志 (11)3.20端口号码 (12)3.21 获得读卡过程中生成的jpg图片路径 (12)3.22 生成身份证反正面图片 (12)3.23 控件下载后是否处于自动读卡状态 (12)3.24读取设备安全模块号 (12)3.25设备安全模块号 (13)3.26 最新地址 (13)3.27 用户指定身份证图片存放位置和名称 (13)3.28 身份证正面JPG照片的Base64编码字符串 (13)3.29 身份证反面JPG照片的Base64编码字符串 (13)3.30 身份证临时文件保存目录 (14)3.31 szCardInfo卡信息 (14)4、示例网页使用说明 (14)1、说明本文档是针对神思联机型第二代居民身份证验证阅读机具通讯控件的使用说明文档,供用户使用ActiveX控件进行接入时参考。
(新中新)二代证SDK开发包开发说明

(新中新)二代证SDK开发包开发说明一、系统的基本要求a)Windows 98,Windows 2000 Pro,Windows 2000 Server,WinXP,Windows Vista,Windows7b)至少32兆内存(32M RAM or Larger)c)至少10兆空闲硬盘空间(10M Free Hard Disk Space or Larger)d)至少一个空闲普通串口或USB口(视用户需求而定)。
二、SDK函数说明(一)端口类API:Syn_SetMaxRFByte 设置射频适配器最大通信字节数int Syn_SetMaxRFByte (int iPort,unsigned char ucByte,int bIfOpen);参数说明:iPort[in] 整数,表示端口号。
串口0001至0016,USB1001至1016 ucByte[in] 无符号字符,24-255,表示射频适配器最大通信字节数。
iIfOpen[in] 整数,非0表示在API函数内部包含了打开端口和关闭端口函数,0表示在API函数内部不包含了打开端口和关闭端口函数返回值:0 成功其他失败(具体含义参见返回码表)Syn_GetCOMBaud查看串口当前波特率(该函数只用于SAM采用RS232串口的情形,如果采用USB接口则不支持该API)。
int Syn_GetCOMBaud (int iPort,unsigned int * puiBaudRate);参数说明:iPort[in] 整数,表示端口号。
此处端口号必须为1-16,表示串口puiBaudRate[out] 无符号整数指针,指向普通串口当前波特率, 默认情况下为115200。
返回值:0 成功0X01 端口打开失败/端口号不合法0X05 无法获得该SAM的波特率,该SAM串口不可用。
Syn_GetCOMBaudEx查看串口当前波特率(该函数只用于SAM采用RS232串口的情形,如果采用USB接口则不支持该API)。
神盾二代身份证读卡器智能接口使用手册

ICR-100M智能接口身份证阅读器使用手册北京中盾安全技术开发公司2010年06月14001环境管理体系、OHSMS职业安全卫生管理体系认证覆盖的产品。
目录版本 (4)出版日期 (4)声明 (4)商标 (4)联系方式 .......................................... 错误!未定义书签。
1. 产品概述 (5)2. 工作原理 (6)3. 主要技术指标 (6)4. 连接与安装 (6)4.1. 连接线结构说明 (7)4.1.1. 专用通讯电缆(标配) (7)4.1.2. 专用USB供电电缆(标配) (7)4.1.3. 专用PS/2供电电缆(选配) (7)4.2. 阅读器与PC机的连接 (7)4.2.1. 采用RS-232C串口通讯方式与PC机的连接 (7)4.2.2. 采用USB通讯方式与PC机的连接 (8)4.3. ICR阅读演示软件安装 (8)4.3.1. 正常安装 (8)4.3.2. 安装阅读程序可能出现的问题及故障排除 (9)4.4. USB驱动程序的安装 (10)5. USB设备配置工具 (10)6. 第二代居民身份证核验软件操作 (11)7. 注意事项 (11)ICR-100M智能接口身份证阅读器使用手册版本1.3.0出版日期2010年6月声明本书版权为北京中盾安全技术开发公司和其设计开发单位公安部第一研究所共同所有。
未经北京中盾安全技术开发公司和公安部第一研究所书面同意,任何公司、单位或个人,不得用任何手段复制本手册的部分或全部内容。
对印刷错误的更正,所述信息谬误的勘误,以及产品的改进,均由北京中盾安全技术开发公司和公安部第一研究所随时作出解释,恕不预先通知,修正内容将编入再版说明书中。
商标所有在本手册使用的商标为该商标所有人的资产。
1.产品概述1.1产品概述ICR-100M智能接口身份证阅读器是联机使用的身份证专用阅读设备,采用拥有国家专利(实用新型专利号ZL 200620000992.9,发明专利号ZL 200610001034.8)的智能识别技术,能自动识别计算机通讯端口、自动设置通讯参数、自动读卡。
关于二代身份证读卡器地二次开发

关于二代身份证读卡器地二次开发关于二代身份证读卡器地二次开发客户提供一台读卡器、sdtapi.dll、WltRS.dll,以及相应的头文件,我是通过java的jni 与所写c++代码进行交互,但是java这边接收到的身份证基本信息一直是乱码。
先说明c++向java传其他中文不会出现乱码,是在c++读出的身份证信息就是乱码。
c++的代码如下:#include "windows.h"#include "CardReader.h"#include "sdtapi.h"#include "String.h"#include "WltRS.h"JNIEXPORT jbyteArray JNICALL Java_CardReader_getMessage(JNIEnv * env, jobject jobj){ char* szStr="mei zhao dao xin xi";char cInput;int iRet; //返回码int iPort; //端口号int iIfOpen=0; //是否需要打开串口unsigned char pucIIN[8];unsigned char pucSN[8];unsigned char pucCHMsg[512]; //文字信息unsigned char pucPHMsg[1024]; //照片信息unsigned char pucFPMsg[1024]; //指纹信息unsigned int uiCHMsgLen,uiPHMsgLen;memset(pucCHMsg,0,sizeof(pucCHMsg));int length;jbyteArray RtnArr = NULL;jsize arrsize;if(iIfOpen==0){for (iPort = 1001; iPort <= 1016; iPort++){iRet=SDT_OpenPort(iPort);printf("SDT_OpenPort usb error, error code is: %02x\n", iRet);printf("SDT_OpenPort usb error, error code is: %02d\n", iPort);if(iRet==0x90) break;}if(iRet!=0x90){printf("SDT_OpenPort error, error code is: %02x\n", iRet);SDT_ClosePort(iPort);szStr="SDT_OpenPort error";printf(szStr);length = strlen(szStr);arrsize =(jsize)length;RtnArr=env->NewByteArray(arrsize);env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);return RtnArr;}iRet=SDT_StartFindIDCard(iPort,pucIIN, iIfOpen);printf("SDT_StartFindIDCard error, error code is: %02x\n", iRet);if (iRet != 0x9f){iRet=SDT_StartFindIDCard(iPort,pucIIN, iIfOpen); //再找卡if (iRet != 0x9f){iRet = SDT_ClosePort(iPort);printf("SDT_StartFindIDCard error, error code is: %02x\n", iRet);szStr="SDT_StartFindIDCard error";length = strlen(szStr);arrsize =(jsize)length;RtnArr=env->NewByteArray(arrsize);env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);return RtnArr;}}iRet=SDT_SelectIDCard (iPort,pucSN, iIfOpen);printf("SDT_SelectIDCard error, error code is: %02x\n", iRet);if (iRet != 0x90){iRet=SDT_SelectIDCard (iPort,pucSN, iIfOpen); //再选卡if (iRet != 0x90){iRet = SDT_ClosePort(iPort);printf("SDT_SelectIDCard error, error code is: %02x\n", iRet);szStr="SDT_SelectIDCard error";length = strlen(szStr);arrsize =(jsize)length;RtnArr=env->NewByteArray(arrsize);env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);return RtnArr;}}iRet=SDT_ReadBaseMsg(iPort,pucCHMsg,&uiCHMsgLen, pucPHMsg,&uiPHMsgLen, iIfOpen); printf("SDT_ReadBaseMsg error, error code is: %02x\n", iRet);if(iRet!=0x90){printf("SDT_ReadBaseMsg error, error code is: %02x\n", iRet);if(iIfOpen==0)SDT_ClosePort(iPort);printf("ssaaaasasasaas\n");szStr="SDT_ReadBaseMsg error";length = strlen(szStr);arrsize =(jsize)length;RtnArr=env->NewByteArray(arrsize);printf("123345453\n");env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);printf("12sssssssss33454534ssaaaasasasaas");return RtnArr;}printf("SDT_ReadBaseMsg OK\n");if(iIfOpen==0)SDT_ClosePort(iPort);RtnArr=env->NewByteArray(uiCHMsgLen);printf("pucCHMsg=%s\n",pucCHMsg);env->SetByteArrayRegion(RtnArr, 0,uiCHMsgLen, (jbyte*)pucCHMsg);return RtnArr;}length = strlen(szStr);arrsize =(jsize)length;RtnArr=env->NewByteArray(arrsize);env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr); return RtnArr;}。
精伦iDR210二代身份证读卡器二次开发

类(ReadIDCardService.cs):class ReadIDCardService{public IDCard ReadIDCard(int Port){StringBuilder Name = new StringBuilder(31);StringBuilder Gender = new StringBuilder(3);StringBuilder Folk = new StringBuilder(10);StringBuilder BirthDay = new StringBuilder(9);StringBuilder Code = new StringBuilder(19);StringBuilder Address = new StringBuilder(71);StringBuilder Agency = new StringBuilder(31);StringBuilder ExpireStart = new StringBuilder(9);StringBuilder ExpireEnd = new StringBuilder(9);//初始化端口//int intOpenRet = InitComm(1001);//if (intOpenRet != 1)//{// throw new Exception("");//}//设定当前操作的HID接口iDR210if (HIDSelect(Port)){//卡认证int intReadRet = Authenticate();if (intReadRet != 1){//CloseComm();throw new Exception("");}//读身份证信息int intReadBaseInfosRet = ReadBaseInfos(Name, Gender, Folk, BirthDay, Code, Address, Agency, ExpireStart, ExpireEnd);if (intReadBaseInfosRet != -3){//CloseComm();throw new Exception("");}//HID_BeepLED(true,true, 200);IDCard CardData = new IDCard();CardData.CardNo = Code.ToString().Trim(); = Name.ToString().Trim();CardData.Sex = Gender.ToString().Trim();CardData.Nationality = Folk.ToString().Trim();CardData.Birthday = BirthDay.ToString().Trim();CardData.Address = Address.ToString().Trim();CardData.Institution = Agency.ToString().Trim();CardData.Begin_validity = ExpireStart.ToString().Trim();CardData.End_validity = ExpireEnd.ToString().Trim();CardData.PhotoDirectory = System.IO.Directory.GetCurrentDirectory() + "//photo.bmp";//CloseComm();return CardData;}else{//CloseComm();throw new Exception("");}}[DllImport("sdtapi.dll")]private static extern int InitComm(int Port);//初始化[DllImport("Sdtapi.dll")]private static extern int Authenticate();//卡认证[DllImport("sdtapi.dll")]private static extern void CloseComm(); //关闭端口[DllImport("sdtapi.dll")]private static extern int ReadBaseInfos(StringBuilder Name,StringBuilder Gender, StringBuilder Folk, StringBuilder BirthDay, StringBuilder Code, StringBuilder Address,StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd);//读取数据[DllImport("sdtapi.dll")]private static extern int HID_BeepLED(bool BeepON, bool LEDON, int duration); //蜂鸣器[DllImport("sdtapi.dll")]private static extern bool HIDSelect(int index); //设定当前操作的HID接口iDR210[DllImport("sdtapi.dll")]private static extern int CardOn(); //判断身份证是否在设备上}类(IDCard.cs):class IDCard{public string Name;//姓名public string Sex;//性别public string CardNo; //身份证号public string Nationality; //民族public string Birthday; //生日public string Address;//家庭住址public string Institution;//发证机关public string Begin_validity;// 有效期开始public string End_validity;//有效期结束public string PhotoDirectory;//照片路径;}程序调用://初始化端口int intOpenRet = InitComm(1001);if (intOpenRet != 1){MessageBox.Show("读卡器初始化失败!");this.Close();}try{ReadIDCardService ReadIDCardService = new ReadIDCardService();IDCard CardData = ReadIDCardService.ReadIDCard(1);lb_Title.Text = "姓名:" + ;}catch (Exception ex){if (ex.Message != "")MessageBox.Show(ex.Message);}[DllImport("sdtapi.dll")]private static extern int InitComm(int Port);//初始化。
二代身份证验证设备CM008RU二次开发控件ID2Control使用说明书

⼆代⾝份证验证设备CM008RU⼆次开发控件ID2Control使⽤说明书⼆代⾝份证验证设备CM008R/U⼆次开发控件ID2Control 使⽤说明书⽬录1. 控件描述 (4)1.1. 基本描述 (4)1.2. 控件组成⽂件 (4)1.3. 控件安装 (4)1.3.1. 安装⽂件安装 (4)1.3.2. ⼿动安装 (5)2. 属性⽅法列表 (5)2.1. 属性列表 (5)2.2. ⽅法列表 (5)3. 调⽤流程 (6)3.1. 顺序读卡调⽤流程 (7)3.1.1. 设臵设备连接端⼝号 (7)3.1.2. 端⼝打开及关闭 (7)3.1.3. 设臵RF缓冲区⼤⼩ (7)3.1.4. 基本读卡调⽤流程 (8)3.2. ⾃动读卡调⽤流程 (9)3.2.1. 设臵设备连接端⼝号 (9)3.2.2. 开启⾃动读卡功能 (9)3.2.3. 获取⾝份证相关信息 (9)3.2.4. 停⽌⾃动读卡功能 (9)4. 属性⽅法详细说明 (10)4.1. 属性 (10)Port—通讯端⼝号 (10)Baudrate—串⾏通讯波特率 (10)AutoOpenPort—是否⾃动打开/关闭端⼝ (10)4.2. ⽅法 (10)SetMaxRFByte—设臵RF缓冲区⼤⼩ (10)OpenPort—打开端⼝ (11)ClosePort—关闭端⼝ (11)ResetSAM—复位安全模块 (11)GetSAMStatus—对安全模块运⾏状态检测 (12)GetSAMID—取得安全模块编号HEX码 (12)GetSAMIDToStr—取得安全模块编号字符串 (12)StartFindIDCard—开始寻卡 (13)SelectIDCard—选取卡⽚ (13)ReadBaseMsg—读取基本信息 (13)ReadNewAppMsg—读取追加信息 (14)ReadMngInfo—读取卡体管理号 (14)DecodeToBMP—把WLT⽂件解码到BMP中 (15)GetJPG—把BMP转换成JPG图像 (15)GetBaseInfo—获取⾝份证卡上基本信息 (16)GetAllInfo—获取⾝份证卡上所有信息 (16)SearchDevice—查找设备 (17)StartAutoReadCard—开启⾃动读卡功能 (17)StopAutoReadCard—关闭⾃动读卡功能 (17)GetErrorMsg—获取错误代码对应的信息 (18)GetNation—获取民族编号对应的民族信息 (18)GetSex—获取性别代码对应的性别信息 (18)GetComBaudrate—获取安全模块通讯波特率 (18)SetCOMBaud—设臵安全模块通讯波特率 (19)5. 错误代码表 (19)6. 使⽤⽰例 (20)6.1. VC调⽤⽰例 (20)6.2. VB调⽤⽰例 (23)6.3. Delphi调⽤⽰例 (25)1.控件描述1.1.基本描述⼆代⾝份证验证设备CM008R/U的⼆次开发控件ID2Control是基于公安部安全模块接⼝API函数的基础上开发的,继承了公安部安全模块接⼝所有API函数功能,并增加了相应的转换函数,使得⼆次开发⽤户更易于开发。
C#读取二代身份证信息源码
C#读取二代身份证信息源码using System;using System.Drawing;using System.Collections;using ponentModel;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Reflection ;using System.IO;namespace ICCard{public class clsICCard{//首先,声明通用接口[DllImport(‘sdtapi.dll‘)]public static extern int SDT_OpenPort(int iPortID);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_ClosePort(int iPortID);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_PowerManagerBegin(int iPortID, int iIfOpen); [DllImport(‘sdtapi.dll‘)]public static extern int SDT_AddSAMUser(int iPortID, string pcUserName, int iIfOpen); [DllImport(‘sdtapi.dll‘)]public static extern int SDT_SAMLogin(int iPortID, string pcUserName, string pcPasswd, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_SAMLogout(int iPortID, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_UserManagerOK(int iPortID, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_ChangeOwnPwd(int iPortID, string pcOldPasswd, string pcNewPasswd, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_ChangeOtherPwd(int iPortID, string pcUserName, string pcNewPasswd, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_DeleteSAMUser(int iPortID, string pcUserName, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_StartFindIDCard(int iPortID, ref int pucIIN, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_SelectIDCard(int iPortID, ref int pucSN, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_ReadBaseMsg(int iPortID, string pucCHMsg, ref int puiCHMsgLen, string pucPHMsg, ref int puiPHMsgLen, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_ReadBaseMsgToFile(int iPortID, string fileName1, ref int puiCHMsgLen, string fileName2, ref int puiPHMsgLen, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_WriteAppMsg(int iPortID, ref byte pucSendData, int uiSendLen, ref byte pucRecvData, ref int puiRecvLen, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_WriteAppMsgOK(int iPortID, ref byte pucData, int uiLen, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_CancelWriteAppMsg(int iPortID, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_ReadNewAppMsg(int iPortID, ref byte pucAppMsg, ref int puiAppMsgLen, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_ReadAllAppMsg(int iPortID, ref byte pucAppMsg, ref int puiAppMsgLen, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_UsableAppMsg(int iPortID, ref byte ucByte, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_GetUnlockMsg(int iPortID, ref byte strMsg, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_GetSAMID(int iPortID, ref byte StrSAMID, int iIfOpen);[Dl lImport(‘sdtapi.dll‘)]public static extern int SDT_SetMaxRFByte(int iPortID, byte ucByte, int iIfOpen);[DllImport(‘sdtapi.dll‘)]public static extern int SDT_ResetSAM(int iPortID, int iIfOpen);<A href="/">PDA</A>[DllImp ort(‘WltRS.dll‘)]public static extern int GetBmp(string file_name, int intf);public delegate void De_ReadICCardComplete(clsEDZ objEDZ); public event De_ReadICCardComplete ReadICCardComplete; private clsEDZ objEDZ = new clsEDZ();private int EdziIfOpen = 1; //自动开关串口int EdziPortID;public clsICCard(){}public bool ReadICCard(){bool bUsbPort = false;int intOpenPortRtn = 0;int rtnTemp = 0;int pucIIN = 0;int pucSN = 0;int puiCHMsgLen = 0;int puiPHMsgLen = 0;objEDZ = new clsEDZ();//检测usb口的机具连接,必须先检测usbfor (int iPort = 1001; iPort <= 1016; iPort++){intOpenPortRtn = SDT_OpenPort(iPort);if (intOpenPortRtn == 144){EdziPortID = iPort;bUsbPort = true;break;}}//检测串口的机具连接if (!bUsbPort){for (int iPort = 1; iPort <= 2; iPort++){intOpenPortRtn = SDT_OpenPort(iPort);if (intOpenPortRtn == 144){EdziPortID = iPort;bUsbPort = false;break;}}}if (intOpenPortRtn != 144){MessageBox.Show(‘端口打开失败,请检测相应的端口或者重新连接读卡器!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error);return false;}//在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID 保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,//您要考虑机具连接端口被用户改变的情况哦//下面找卡rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen);if (rtnTemp != 159){rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen); //再找卡if (rtnTemp != 159){rtnTemp = SDT_ClosePort(EdziPortID);MessageBox.Show(‘未放卡或者卡未放好,请重新放卡!‘, ‘提示‘, MessageBoxButt ons.OK, MessageBoxIcon.Error);return false;}}//选卡rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen);if (rtnTemp != 144){rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen); //再选卡if (rtnTemp != 144){rtnTemp = SDT_ClosePort(EdziPortID);MessageBox.Show(‘读卡失败!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error); return false;}}//注意,在这里,用户必须有应用程序当前目录的读写权限//检测串口的机具连接if (!bUsbPort){for (int iPort = 1; iPort <= 2; iPort++){intOpenPortRtn = SDT_OpenPort(iPort);if (intOpenPortRtn == 144){EdziPortID = iPort;bUsbPort = false;break;}}}if (intOpenPortRtn != 144){MessageBox.Show(‘端口打开失败,请检测相应的端口或者重新连接读卡器!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error);return false;}//在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID 保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,//您要考虑机具连接端口被用户改变的情况哦//下面找卡rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen);<A href="/">身份证读卡器</A>if (rtnTemp != 159){rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen); //再找卡if (rtnTemp != 159){rtnTemp = SDT_ClosePort(EdziPortID);MessageBox.Show(‘未放卡或者卡未放好,请重新放卡!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error);return false;}}//选卡rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen);if (rtnTemp != 144){rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen); //再选卡if (rtnTemp != 144){rtnTemp = SDT_ClosePort(EdziPortID);MessageBox.Show(‘读卡失败!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error);return false;}}//注意,在这里,用户必须有应用程序当前目录的读写权限FileInfo objFile = new FileI nfo(‘wz.txt‘);if (objFile.Exists){objFile.Attributes = FileAttributes.Normal;objFile.Delete();}objFile = new FileInfo(‘zp.bmp‘);if (objFile.Exists){objFile.Attributes = FileAttributes.Normal;objFile.Delete();}objFile = new FileInfo(‘zp.wlt‘);if (objFile.Exists){objFile.Attributes = FileAttributes.Normal;objFile.Delete();}rtnTemp = SDT_ReadBaseMsgToFile(EdziPortID, ‘wz.txt‘, ref puiCHMsgLen, ‘zp.wlt‘, ref puiPHMsgLen, EdziIfOpen);if (rtnTemp != 144){rtnTemp = SDT_ClosePort(EdziPortID);MessageBox.Show(‘读卡失败!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error);return false;}//下面解析照片,注意,如果在C盘根目录下没有机具厂商的授权文件Termb.Lic,照片解析将会失败if (bUsbPort)rtnTemp = GetBmp(‘zp.wlt‘, 2);elsertnTemp = GetBmp(‘zp.wlt‘, 1);switch (rtnTemp){case 0:MessageBox.Show(‘调用sdtapi.dll错误!‘, ‘提示‘, MessageBoxButtons.OK, MessageBox Icon.Error); break;case 1: //正常break;case -1:MessageBox.Show(‘相片解码错误!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error); break;case -2:MessageBox.Show(‘wlt文件后缀错误!‘, ‘提示‘, MessageBoxButtons.OK, Me ssageBoxIcon.Error); break;case -3:MessageBox.Show(‘wlt文件打开错误!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error); break;case -4:MessageBox.Show(‘wlt文件格式错误!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error); break;case -5:MessageBox.Show(‘软件未授权!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error); break;case -6:MessageBox.Show(‘设备连接错误!‘, ‘提示‘, MessageBoxButtons.OK, MessageBoxIcon.Error);break;}rtnTemp = SDT_ClosePort(EdziPortID);FileInfo f = new FileInfo(‘wz.txt‘);FileStream fs = f.OpenRead();byte[] bt = new byte[fs.Length];fs.Read(bt, 0, (int)fs.Length);fs.Close();string str = System.Text.UnicodeEncoding.Unicode.GetString(bt); = System.Text.UnicodeEncoding.Unicode.GetString(bt, 0, 30).Trim();objEDZ.Sex_Code = System.Text.UnicodeEncoding.Unicode.GetString(bt, 30, 2).Trim();objEDZ.NATION_Code = System.Text.UnicodeEncoding.Unicode.GetString(bt, 32, 4).Trim();string strBird = System.Text.UnicodeEncoding.Unicode.GetString(bt, 36, 16).Trim();objEDZ.BIRTH = Convert.ToDateTime(strBird.Substring(0, 4) + ‘年‘ + strBird.Substring(4, 2) + ‘月‘ + strBird.Substring(6) + ‘日‘);objEDZ.ADDRESS = System.Text.UnicodeEncoding.Unicode.GetString(bt, 52, 70).Trim();objEDZ.IDC = System.Text.UnicodeEncoding.Unicode.GetString(bt, 122, 36).Trim();objEDZ.REGORG = System.Text.UnicodeEncoding.Unicode.GetString(bt, 158, 30).Trim();string strTem = System.Text.UnicodeEncoding.Unicode.GetString(bt, 188, bt.GetLength(0) - 188).Trim();objEDZ.STARTDATE = Convert.ToDateTime(strTem.Substring(0, 4) + ‘年‘ + strTem.Substring(4, 2) + ‘月‘ + strTem.Substring(6, 2) + ‘日‘);strTem = strTem.Substring(8);if (strTem.Trim() != ‘长期‘){objEDZ.ENDDATE = Convert.ToDateTime(strTem.Substring(0, 4) + ‘年‘ + strTem.Substring(4, 2) + ‘月‘ + strTem.Substring(6, 2) + ‘日‘);}else{objEDZ.ENDDATE = DateTime.MaxValue;}objFile = new FileInfo(‘zp.bmp‘);if (objFile.Exists){Image img = Image.FromFile(‘zp.bmp‘);objEDZ.PIC_Image=(Image)img.Clone();System.IO.MemoryStream m = new MemoryStream();img.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg);objEDZ.PIC_Byte = m.ToArray();img.Dispose();img = null;}ReadICCardComplete(objEDZ);return true;}public class clsEDZ{private System.Collections.SortedList lstMZ = new SortedList();private string _Name; //姓名private string _Sex_Code; //性别代码private string _Sex_CName; //性别private string _IDC; //身份证号码private string _NATION_Code; //民族代码private string _NATION_CName; //民族private DateTime _BIRTH; //出生日期private string _ADDRESS; //住址private string _REGORG; //签发机关private DateTime _STARTDATE; //身份证有效起始日期private DateTime _ENDDATE; //身份证有效截至日期private string _Period_Of_Validity_Code; //有效期限代码,许多原来系统上面为了一代证考虑,常常存在这样的字段,二代证中已经没有了private string _Period_Of_Validity_CName; //有效期限private byte[] _PIC_Byte; //照片二进制private Image _PIC_Image; //照片public clsEDZ(){lstMZ.Add(‘02‘, ‘蒙古族‘); lstMZ.Add(‘03‘, ‘回族‘);l stMZ.Add(‘04‘, ‘藏族‘); lstMZ.Add(‘05‘, ‘维吾尔族‘); lstMZ.Add(‘06‘, ‘苗族‘); lstMZ.Add(‘07‘, ‘彝族‘); lstMZ.Add(‘08‘, ‘壮族‘); lstMZ.Add(‘09‘, ‘布依族‘); lstMZ.Add(‘10‘, ‘朝鲜族‘); lstMZ.Add(‘11‘, ‘满族‘); lstMZ.Add(‘12‘, ‘侗族‘);l stMZ.Add(‘13‘, ‘瑶族‘); lstMZ.Add(‘14‘, ‘白族‘); lstMZ.Add(‘15‘, ‘土家族‘); lstMZ.Add(‘16‘, ‘哈尼族‘); lstMZ.Add(‘17‘, ‘哈萨克族‘); lstMZ.Add(‘18‘, ‘傣族‘); lstMZ.Add(‘19‘, ‘黎族‘); lstMZ.Add(‘20‘, ‘傈僳族‘); lstMZ.Add(‘21‘, ‘佤族‘); lstMZ.Add(‘22‘, ‘畲族‘);lstMZ.Add(‘24‘, ‘拉祜族‘); lstMZ.Add(‘25‘, ‘水族‘); lstMZ.Add(‘26‘, ‘东乡族‘); lstMZ.Add(‘27‘, ‘纳西族‘); lstMZ.Add(‘28‘, ‘景颇族‘); lstMZ.Add(‘29‘, ‘柯尔克孜族‘); lstMZ.Add(‘30‘, ‘土族‘); lstMZ.Add(‘31‘, ‘达翰尔族‘); lstMZ.Add(‘32‘, ‘仫佬族‘); lstMZ.Add(‘33‘, ‘羌族‘); lstMZ.Add(‘34‘, ‘布朗族‘); lstMZ.Add(‘35‘, ‘撒拉族‘); lstMZ.Add(‘36‘, ‘毛南族‘); lstMZ.Add(‘37‘, ‘仡佬族‘); lstMZ.Add(‘38‘, ‘锡伯族‘); lstMZ.Add(‘39‘, ‘阿昌族‘); lstMZ.Add(‘40‘, ‘普米族‘); lstMZ.Add(‘41‘, ‘塔吉克族‘); lstMZ.Add(‘42‘, ‘怒族‘); lstMZ.Add(‘43‘, ‘乌孜别克族‘); lstMZ.Add(‘44‘, ‘俄罗斯族‘);lstMZ.Add(‘46‘, ‘德昂族‘);lstMZ.Add(‘47‘, ‘保安族‘);lstMZ.Add(‘48‘, ‘裕固族‘);lstMZ.Add(‘49‘, ‘京族‘);lstMZ.Add(‘50‘, ‘塔塔尔族‘);lstMZ.Add(‘51‘, ‘独龙族‘);lstMZ.Add(‘52‘, ‘鄂伦春族‘);lstMZ.Add(‘53‘, ‘赫哲族‘);lstMZ.Add(‘54‘, ‘门巴族‘);lstMZ.Add(‘55‘, ‘珞巴族‘);lstMZ.Add(‘56‘, ‘基诺族‘);lstMZ.Add(‘57‘, ‘其它‘);lstMZ.Add(‘98‘, ‘外国人入籍‘);}public string Name{get { return _Name; }set { _Name = value; }}public string Sex_Code{get { return _Sex_Code; }set{_Sex_Code = value;switch (value){case ‘1‘:Sex_CName = ‘男‘;break;case ‘2‘:Sex_CName = ‘女‘;break;}}}public string Sex_CName{get { return _Sex_CName; } set { _Sex_CName = value; } }public string IDC{get { return _IDC; }set { _IDC = value; }}public string NATION_Code{get { return _NATION_Code; }set{_NATION_Code = value;if (lstMZ.Contains(value))NATION_CName = lstMZ[value].ToString(); }}public string NATION_CName{get { return _NATION_CName; }set { _NATION_CName = value; }}public DateTime BIRTH{get { return _BIRTH; }set { _BIRTH = value; }}public string ADDRESS{get { return _ADDRESS; }set { _ADDRESS = value; }}public string REGORG{get { return _REGORG; }set { _REGORG = value; }}public DateTime STARTDATE{get { return _STARTDATE; }set { _STARTDATE = value; }}public DateTime ENDDATE{get { return _ENDDATE; }set{_ENDDATE = value;if (_ENDDATE == DateTime.MaxValue){_Period_Of_Validity_Code = ‘3‘;_Period_Of_Validity_CName = ‘长期‘;}else{if (_STARTDATE != DateTime.MinValue){switch (value.AddDays(1).Year - _STARTDATE.Year) {case 5:_Period_Of_Validity_Code = ‘4‘;_Period_Of_Validity_CName = ‘5年‘;break;case 10:_Period_Of_Validity_Code = ‘1‘;_Period_Of_Validity_CName = ‘10年‘;break;case 20:_Period_Of_Validity_Code = ‘2‘;_Period_Of_Validity_CName = ‘20年‘;break;}}}}}public string Period_Of_Validity_Code{get { return _Period_Of_Validity_Code; } set { _Period_Of_Validity_Code = value; } }public string Period_Of_Validity_CName{get { return _Period_Of_Validity_CName; } set { _Period_Of_Validity_CName = value; } }public byte[] PIC_Byte{get { return _PIC_Byte; }set { _PIC_Byte = value; }}public Image PIC_Image{get { return _PIC_Image; }set { _PIC_Image = value; }}}[转载]二代身份证读卡器接口函数Delphi声明(2010-06-30 22:09:33)转载原文标签:转载原文地址:二代身份证读卡器接口函数Delphi声明作者:虚伪人生前段时间做项目时用的,拿来一看全是C++的dll,就对应写了一下Delphi的声明查看串口当前波特率function SDT_GetCOMBaud(iPort: integer; puiBaudRate: Pinteger):integer;stdcall;External'SDTAPI.DLL';{iPort[in]表示端口,puiBaudRate[out]无符号指针,指向普通串口当前波特率,返回值0X90-成功,0x1-端口打开失败/端口号不合法,0x5无法获得SAM_V的波特率,串口不可用。
第二代居民身份证termb.dll应用开发使用手册
int_stdcallGetPeopleNation(char *strTmp, unsigned int strLen);
读出生日期:
int_stdcallGetPeopleBirthday(char *strTmp, unsigned int strLen);
读住址信息:
int_stdcallGetPeopleAddress(char *strTmp, unsigned int strLen);
读身份号码:
int_stdcallGetPeopleIDCode(char *strTmp, unsigned int strLen);
读签发机关:
int_stdcallGetDepartment(char *strTmp, unsigned int strLen);
读有效启始日期:
int_stdcallGetStartDate(char *strTmp, unsigned int strLen);
StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Button2: TButton;
Button3: TButton;
Image1: TImage;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
设置基本信息
16.
int _stdcall SetPhotoData(char *WltFileName)
设置照片WLT信息
4
5
5.1初始化串口
原型:int InitComm (intPort)
DOCOM二代系统板WinCE二次开发指南V2.0
D O C O M R &D DOCOM 二代系统板WinCE 二次开发指南-V2.0 版本更改说明时间 版本号 说明2012-7-1 1.0 基本发布版本2013-7-17 2.01.升级TXWDEVLib.dll 库文件到V2.0a.增加支持我司高速加密读卡器功能b.增加支持三合一身份证读卡器功能c.增加高速光学进口指纹机功能d.增加条码读卡器汉字输出和16进制输出功能2.升级网络版CE 例程到TXWDemo_OLV2.0a.增加指纹票的功能演示b.增加摄像头票的功能演示3.增加.net3.5错误提示的汉字显示安装包4.IPchange.exe 的bug 修正5.增加数据库功能的支持B 键盘设备声音修改7.ftp 访问加密功能注意:支持上述有些功能操作系统也需要升级到新版本TFT 版本:NK_TFT32.binVGA 版本:NK_VGA32.bin一.开发环境 Windows XP ,.Net3.5,VS2005或VS2008、C#开发平台 二.目录文件说明 C#下的Lib 库\TXWDEVLib.dll 在VS 平台C#下可以直接引用进来,并调用类库函数 TXWCfg.ini类库使用的配置文件 用户根据自己的使用环境配置该文件WinCE 必备文件\autorun.bat系统启动文件,用户可更改来启动其它文件 IPChange.exe物理地址和IP 地址管理软件 TaskMng.exe任务管理软件 TXWDEV .dll设备驱动库,必须拷贝的TXWDEVLib.dll 同目录下 被TXWDEVLib.dll 调用,用户无需直接调用 ok.wav音频文件“欢迎光临” 客户可根据需求自行添加音频文件 tkterr.wav 音频文件“无效票”IOTest.exe TXW 开发的IO 口测试工具D O C O M R &D WGTest.exe TXW 开发的韦根测试工具WltCE.exe 、LICENSE.DAT 身份证读卡器解密文件被TXWDEVLib.dll 调用,用户无需直接调用没有使用二代身份证读卡器可不添加VCOMExample.dll Lumidigm 指纹驱动文件被TXWDEVLib.dll 调用,用户无需直接调用没有使用指纹可不添加RegeditTool.exe 、Readtim.exe 产品注册工具NETCFv35.Messages.zh-CHS.cab .net3.5消息显示包,拷贝到CE 下安装到txwzn 目录下System.Data.SQLite.dll SQLite 数据库必备文件SQLite.Interop.087.dll SQLite 数据库必备文件TXWCamare.dll摄像头驱动,动态加载 ceMfDll.dll加密读卡器驱动 FTPTool.exe ftp 加密工具 regedit.exe注册表工具 SetSysV olum.exe系统声音配置工具CERDISP2.exe远程桌面控制工具开发例程\ 单机版 CE Demo 程序网络版 CE Demo 程序PC 服务端Demo 程序二代系统板通信协议V3.01(演示版)IC 读卡器例程桌面加密IC 读卡器二次开发包及例程其它工具,调试辅助工具ftp 上传工具 专业的ftp 工具,可以使用该工具拷贝文件 串口调试助手 Windows 的串口调试助手三.使用方法3.1. Lib 库的使用方法1.在VS2005或VS2008环境下,新建一个C#语音的智能设备应用程序。
二代身份证读卡器二次开发代码
While Mid(mf, readname, 1) = " "
readname = readname + 1
Wend
d = readname
i=i+1
End If
readname = readname + 1
Wend
idno1 = Mid(ii(3), 1, 18) '身份证号
sex1 = Mid(idno1, 17, 1) '性别代码
二代身份证读卡器二次开发代码(用)
本开发代码用 vb 编写经测试可以兼容现有的大部份二代身份证读卡器,使用本控件前请先安装二代身份证读卡器的驱程, 本控件用于网页开发。
1.说明与准备 进入 vb 新建工程 activex 控件,需要下图部件,这个是 ftp 部件。
做法右击左面工具 选部件就可以出现上图。 本控件只提供两个对外函数接口 (1)hx_IDname( ) 读身份证主函数接口没有参数,有返回值。 (2)toftp(urln, file) 上传照片到 ftp 服务器,照片以身份证号保存,参数 1 服器的 url,参数 2 上传后的文件名称。
<input size=25 name=fbirth maxLength=25 > </P></td> </tr> <tr> <td class="color2" > <P align=center><FONT size=3>住址:</FONT></P></td> <td class="color2" > <P align=left>
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二代证系统终端API
使用说明最新09/1/1
上海普天邮通商用机器有限公司
2009年1月
二代证系统终端API
使用说明
版本
1.4
出版日期
2010年03月
著作权注意事项
本书版权为上海普天邮通商用机器有限公司所有。
未经上海普天邮通商用机器有限公司书面同意,任何公司、单位或个人,不得用任何手段复制本手册的部分或全部内容。
对印刷错误的更正,所述信息谬误的勘误,以及产品的改进,均由上海普天邮通商用机器有限公司随时作出解释,恕不预先通知,修正内容将编入再版说明书中。
1.前言
本应用程序接口(API)用于二代证验证系统的验证终端应用系统的开发。
2.系统要求
使用本API的PC机,必须满足下列条件:
●Windows 2000, Windows XP
●至少64兆内存(64M RAM or Larger)
●至少10兆空闲硬盘空间(10M Free Hard Disk Space or Larger)
●至少一个空闲普通串口或USB口(视用户需求而定)。
3.文件列表
开发包含下列文件:
cardapi.h 数据类型和函数声明
cardapi2.lib 静态链接库
cardapi2.dll API函数动态链接库
sdtapi.dll cardapi2.dll依赖的动态链接库
WltRS.dll cardapi2.dll依赖的动态链接库
license.dat 授权文件
CardII.ini 配置文件
4.API详细说明
4.1long__stdcall OpenCardReader(long lPort, ULONG ulFlag)
打开并检测读卡器
参数
lPort:端口号,1~16表示串口号,1001表示USB口,0表示自动选择。
4.2long__stdcall GetPersonMsgW(PPERSONINFOW pInfo, const wchar_t* pszImageFile)
读取二代证,所有参数中的字符串使用UTF-16编码。
参数
pInfo:证件信息结构,见4.6。
pszImageFile:照片路径和文件名。
照片的格式是bmp。
建议不要使用相对路径或当前路径并且选择一个确定有读写权限的路径。
例如C:\Documents and Settings\test\Local Settings\Temp\image.bmp(如果当前用户是test的话)
返回值:错误代码。
4.3long__stdcall GetPersonMsgA(PPERSONINFOA pInfo, const char* pszImageFile)
读取二代证,所有参数中的字符串使用GBK编码。
参数
pInfo:证件信息结构,见4.6。
pszImageFile:照片路径和文件名。
照片的格式是bmp。
建议不要使用相对路径或当前路径并且选择一个确定有读写权限的路径。
例如C:\Documents and Settings\test\Local Settings\Temp\image.bmp(如果当前用户是test的话)
返回值:错误代码。
4.4long__stdcall ResetCardReader()
重置读卡器。
返回值:错误代码。
4.5long__stdcall CloseCardReader()
关闭读卡器。
返回值:错误代码。
4.6const wchar_t* __stdcall GetResultDescriptionW()
获取错误信息的文字描述。
返回值:错误信息,使用UTF-16编码。
4.7证件信息结构
PERSONINFOW结构的成员与PERSONINFOA类似。
typedef struct _personinfoa
{
char name[32];
char sex[4];
char nation[20];
char birthday[12];
char address[72];
char cardId[20];
char police[32];
char validStart[12];
char validEnd[12];
char sexCode[4];
char nationCode[4];
char appendMsg[72];
}PERSONINFOA,*PPERSONINFOA;。
有效截止日期可以是长期。
5.注意事项
应用程序使用OpenCardReader打开设备,使用GetPersonMsgA(或GetPersonMsgW)读取信息,使用CloseCardReader关闭设备。
应用程序只需要在初始化时打开一次设备即可,不需要每次读卡时都进行打开和关闭设备操作。
程序停止读卡后应该调用CloseCardReader。
当出现严重错误时,应用程序可以调用OpenCardReade打开设备,使用ResetCardReader重置设备,该函数会等待2秒钟,然后调用CloseCardReader关闭设备。
一般情况下不需要使用ResetCardReader。
应用程序如果使用自动读卡,读卡的频率一般设为0.5秒左右。