二代身份证读卡器二次开发代码
- 格式:pdf
- 大小:200.77 KB
- 文档页数:6
NFC读卡接口日期版本说明作者2018/12/09V1.0.0NFC&OTG证件读取,支持身份证/港澳居民居住证/护照/EID1.概述本SDK支持二代身份证、护照及EID的读取。
二代身份证接口添加了身份鉴权操作,只有当鉴权通过的用户才可以使用公司提供的解码服务器进行身份证解码。
护照及EID功能开通需要单独申请。
NFC读卡用于支持NFC的安卓设备上。
OTG读卡用于支持USB的安卓设备上(USB口需要配套专门证件读卡器)。
2.流程图3.回调在使用本SDK前必须实现ActiveCallBack接口中的相关函数,原型如下:public interface ActiveCallBack{void readProgress(int npaogress);void setUserInfo(String sztxt);}void readProgress(int npaogress);返回身份证读卡进度,一共20步。
●void setUserInfo(String sztxt);函数空实现即可,有时会返回调试信息。
4.接口●OTGReadCardAPI接口初始化操作。
paramContext:android的上下文cb:实现回调的类bNFC:统一写成false●GetVersion获取当前版本号●setServerInfo设置服务器列表(初始化后最先调用,必须)twoCardServerList:身份证解码服务器列表eidServerList:为nullbTestServer:统一填false返回值:无●NfcReadCard通过NFC读卡,同步操作,执行结束返回状态。
szAppID:APPID,每家商户的唯一ID(需要向本公司申请后获取)userInfo:用户信息,暂时为空intent:NFC句柄,OTG时填nulldefaultType:只能填eTwoGeneralCarduserData:用户透传数据,如不需要,直接填“”bAuth:填false返回值:41–失败90–成功●GetCardType返回NfcReadCard中读取的卡片类型。
普天身份证阅读器产品介绍普天身份证阅读器CP IDMR02/TG是专为国家发行第二代居民身份证而研制开发的一款台式身份证阅读器。
该款机型采用USB/RS232可选接口,是一体式TYPE B非接触卡读写机具,内含公安部二代证专用的安全模块及上海普天自主开发的射频读写模块,通过计算机通讯接口和安装在计算机中的阅读软件,将个人信息和相片进行显示和存储。
具有独立的知识产权,安全性、保密性及可靠性符合国家标准。
同时也适用于符合ISO/IEC 14443 TYPE B标准的非接触卡的研发、发卡系统及各个领域不同行业用户的应用。
适用范围安全系统:身份识别系统银行系统:身份识别系统交通管理:城市交通一卡通、路桥收费IC卡系统、高速公路IC卡管理系统消费系统:一卡通、门禁、考勤、消费教育事业:校园一卡通、学生证、图书馆、机房管理、食堂消费产品特点符合ISO/IEC 14443 TYPEA/ B 标准符合公安部台式居民身份证阅读器通用技术要求(GA 450-2003)及第1号修改单(草案)提供用户开发的API接口,提供SDK为用户提供良好的二次开发方案可选的RS232或USB接口,采用计算机供电体积小巧、外形美观技术参数支持卡型符合ISO/IEC 14443 TYPE B 标准的非接触卡工作频率13.56MHz 与卡片的通讯速率106Kbps检验循环冗余校检(CRC)感应区面积100×120mm最大感应距离﹥50mm传输速率USB接口:12MbpsRS232接口:9.6-115.2Kbpss软件接口支持VC、VB、DELPHI、PB等电源计算机供电(USB接口)工作电流200mA/DC平均无故障工作时间(MTBF)≥30000小时环境温度存放:-40°C~60°C 工作:0°C~50°C环境湿度存放:20~93%工作:<90%CP IDMR02/TG是为国家发行第二代居民身份证而研制开发的一款台式身份证阅读器。
⼆代⾝份证验证设备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函数功能,并增加了相应的转换函数,使得⼆次开发⽤户更易于开发。
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#语音的智能设备应用程序。
1650华视CVR-100U/D产品概述1、CVR-100U/D型第二代身份证阅读仪是采用非接触式IC卡技术,与计算机终端或其它设备连接可用于读取居民身份证专用芯片内相关信息的专用机具。
2、通过随机解码软件,可将身份证内的数字压缩相片还原为可视照片,实现完全的“人、证同一性”的认定。
3、本身份证专用阅读机具完全兼容ISO-14443(TYPE-B)标准,用户根据需要可用本设备读取其它非接触IC卡信息。
4、提供开放的应用程序接口(API),供系统集成进行二次开发。
5、CVR-100U/D型第二代身份证阅读仪外型美观大方、体积小巧、结构合理。
外壳采用ABS工程塑料注塑而成,制造工艺先进,检验手段科学,性能稳定可靠。
6、CVR-100U/D型第二代身份证阅读仪外观如下:性能参数基本参数:1、符合居民身份证阅读器通用技术要求,兼容ISO14443(TypeB)标准;2、工作频率:13.56MHz(fc);3、天线能量输出;1)天线表面磁场强度(Hmax)≤7.5A/m rms;2)天线表面法线方向5cm处电磁场强度(Hmin)≥1.5A/m rms;4、接口:USB接口;5、阅读距离:0-5cm;6、阅读时间:<0.5s;7、适用于WIN98/2000/XP/NT平台;8、可用开发工具:VC/DEPHI/VB/PB等;9、电源:DC9V/1A(±5%)。
具有电源自动保护设计;10、平均无故障工作时间(MTBF):大于5000小时;11、使用环境:1)工作温度:0℃~50℃;2)相对湿度:20%~90%RH;3)大气压力:60KPa~110 Kpa;12、重量:<0.75Kg;13、外型尺寸:180(L)×130(W)×38(H)mm。
CVR-100U/D型第二代身份证阅读仪外型美观大方、体积小巧、结构合理。
外壳采用ABS工程塑料注塑而成,制造工艺先进,检验手段科学,性能稳定可靠。
二代身份证读卡器二次开发说明编写目的为了在自行开发的项目中使用“新中新二代身份证读卡器”(以下简称读卡器)获得的二代身份证信息,需要对现有读卡器程序进行二次开发。
准备SDK: 新中新二代证SDK开发包.rar示例代码: “新中新二代证SDK开发包.rar\DLL\测试程序\C#”读卡器型号: DKQ-116D版本号:DU使用方法由于开发包中已提供了相对完整的示例代码,因此本文直接以示例代码中的例子进行讲解。
一、开发前先运行开发包中”\DLL\DLLTestSDK.exe”或者“新中新二代身份证验证系统”以保证读卡器硬件连接及驱动都已正确安装. 或者单独安装驱动程序(一)、“新中新二代身份证验证系统”1. 运行程序2. 在读卡器上扫描二代身份证,在界面上查看是否显示身份证信息(二)、“DLLTestSDK.exe”1. 运行程序2. 点击“自动寻找读卡器”,查看列表框提示信息及”端口号”内容是否被改变3. 点击”使用结构体返回信息”,查看列表框中是否已输出身份证信息.二、将” sdtapi.dll”、” SynIDCardAPI.dll”、” WltRS.dll” 3个文件复制到与程序运行相同目录三、参考示例代码,在自己开发的类中定义结构体”IDCardData”,并声明"SynIDCardAPI.dll"的方法.[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]public string Nation; //名族[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]public string Born; //出生日期[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]public string Address; //住址[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]public string IDCardNo; //身份证号[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string GrantDept; //发证机关[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]public string UserLifeBegin; // 有效开始日期[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]public string UserLifeEnd; // 有效截止日期[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]public string reserved; // 保留[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]public string PhotoFileName; // 照片路径}/************************端口类API *************************/[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetMaxRFByte", CharSet =CharSet.Ansi)]public static extern int Syn_SetMaxRFByte(int iPort, byte ucByte, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetCOMBaud", CharSet = CharSet.Ansi)] public static extern int Syn_GetCOMBaud(int iPort, ref uint puiBaudRate);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetCOMBaud", CharSet = CharSet.Ansi)] public static extern int Syn_SetCOMBaud(int iPort, uint uiCurrBaud, uint uiSetBaud); [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_OpenPort", CharSet = CharSet.Ansi)] public static extern int Syn_OpenPort(int iPort);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ClosePort", CharSet = CharSet.Ansi)] public static extern int Syn_ClosePort(int iPort);/**************************SAM类函数 **************************/[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ResetSAM", CharSet = CharSet.Ansi)] public static extern int Syn_ResetSAM(int iPort, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMStatus", CharSet =CharSet.Ansi)]public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMID", CharSet = CharSet.Ansi)] public static extern int Syn_GetSAMID(int iPort, ref byte pucSAMID, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMIDToStr", CharSet = CharSet.Ansi)]public static extern int Syn_GetSAMIDToStr(int iPort, ref byte pcSAMID, int iIfOpen);/*************************身份证卡类函数 ***************************/[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_StartFindIDCard", CharSet = CharSet.Ansi)]public static extern int Syn_StartFindIDCard(int iPort, ref byte pucIIN, int iIfOpen); [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SelectIDCard", CharSet =CharSet.Ansi)]public static extern int Syn_SelectIDCard(int iPort, ref byte pucSN, int iIfOpen); [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)] public static extern int Syn_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref uint puiCHMsgLen, ref byte pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDN", CharSet = CharSet.Ansi)] public static extern int Syn_ReadIINSNDN(int iPort, ref byte pucIINSNDN, int iIfOpen); [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsgToFile", CharSet = CharSet.Ansi)]public static extern int Syn_ReadBaseMsgToFile(int iPort, ref byte pcCHMsgFileName, ref uint puiCHMsgFileLen, ref byte pcPHMsgFileName, ref uint puiPHMsgFileLen, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDNToASCII", CharSet = CharSet.Ansi)]public static extern int Syn_ReadIINSNDNToASCII(int iPort, ref byte pucIINSNDN, int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadNewAppMsg", CharSet = CharSet.Ansi)]public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg ,ref uint puiAppMsgLen , int iIfOpen);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_GetBmp", CharSet = CharSet.Ansi)] public static extern int Syn_GetBmp(int iPort, ref byte Wlt_File);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)] public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_FindReader", CharSet = CharSet.Ansi)] public static extern int Syn_FindReader();/***********************设置附加功能函数 ************************/[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoPath", CharSet =CharSet.Ansi)]public static extern int Syn_SetPhotoPath(int iOption, ref byte cPhotoPath);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoType", CharSet =CharSet.Ansi)]public static extern int Syn_SetPhotoType(int iType);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoName", CharSet =CharSet.Ansi)]public static extern int Syn_SetPhotoName(int iType);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetSexType", CharSet = CharSet.Ansi)] public static extern int Syn_SetSexType(int iType);[DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_SetNationType", CharSet =四、调用” Syn_FindReader()”获得读卡器端口号五、如需保存照片调用”Syn_SetPhotoPath”设置照片保存位置,调用”Syn_SetPhotoType()”设置保存格式,调用” Syn_SetPhotoName()”设置文件名规范.六、读取信息:步骤: 打开端口->设置通讯字节数->读取卡信息->指向读到的第一张卡信息->将卡信息填入结构体-> 读取结构体信息参考示例代码:private void button17_Click(object sender, EventArgs e){IDCardData CardMsg = new IDCardData();int nRet,nPort;string stmp;byte[] pucIIN = new byte[4];byte[] pucSN = new byte[8];nPort = Convert.ToInt32(textBox1.Text);if (Syn_OpenPort(nPort) == 0){if (Syn_SetMaxRFByte(nPort,80,0)==0){nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);nRet = Syn_SelectIDCard(nPort,ref pucSN[0], 0);nRet = Syn_ReadMsg(nPort, 0, ref CardMsg);if (nRet == 0){stmp = Convert.ToString(System.DateTime.Now) + " 姓名:" +;listBox1.Items.Add(stmp);stmp = Convert.ToString(System.DateTime.Now) + " 性别:" +CardMsg.Sex;listBox1.Items.Add(stmp);stmp = Convert.ToString(System.DateTime.Now) + " 民族:" +CardMsg.Nation;listBox1.Items.Add(stmp);stmp = Convert.ToString(System.DateTime.Now) + " 出生日期:" + CardMsg.Born;listBox1.Items.Add(stmp);stmp = Convert.ToString(System.DateTime.Now) + " 地址:" + CardMsg.Address;listBox1.Items.Add(stmp);stmp = Convert.ToString(System.DateTime.Now) + " 身份证号:" + CardMsg.IDCardNo;listBox1.Items.Add(stmp);stmp = Convert.ToString(System.DateTime.Now) + " 发证机关:" + CardMsg.GrantDept;listBox1.Items.Add(stmp);stmp = Convert.ToString(System.DateTime.Now) + " 有效期开始:" + erLifeBegin;listBox1.Items.Add(stmp);stmp = Convert.ToString(System.DateTime.Now) + " 有效期结束:" + erLifeEnd;listBox1.Items.Add(stmp);stmp = Convert.ToString(System.DateTime.Now) + " 照片文件名:" + CardMsg.PhotoFileName;listBox1.Items.Add(stmp);}else{stmp = Convert.ToString(System.DateTime.Now) + " 读取身份证信息错误";listBox1.Items.Add(stmp);}}}else{stmp = Convert.ToString(System.DateTime.Now) + " 打开端口失败";listBox1.Items.Add(stmp);}}。
⼆次开发接⼝说明V3.01.概述精伦电⼦开发的⼆代⾝份证读卡系列机具适⽤于相关⾏业的联机型应⽤。
产品提供了完善的⼆次软件开发接⼝(API)。
本⼿册对开发接⼝的⽂件组成、函数定义格式、调⽤⽅法及返回值等进⾏详细的说明。
本通⽤开发包⽀持的设备型号如下:1、iDR200(串⼝和USB⼝)。
2、iDR320(必须进⼊“同步应⽤”模式)。
3、iDR400-1(必须进⼊“同步”模式)。
4、iDR210(USB-HID免驱动接⼝)。
5、iDR210(串⼝)。
注意:完全兼容原2.0版本开发接⼝,⽀持USB-HID接⼝和串⼝的iDR210。
1、如果使⽤原开发包采⽤动态调⽤dll⽅式,只需直接替换原dll即可。
2、如果使⽤原开发包采⽤的静态调⽤⽅式,则在不改变代码的情况下,对原程序重新编译链接即可。
2.系统要求使⽤本API的PC机,必须满⾜下列条件:●Windows 98、Windows 2000 Pro、Windows 2000 Server、Windows XP。
●⾄少32兆内存(32M RAM or Larger)。
●⾄少10兆空闲硬盘空间(10M Free Hard Disk Space or Larger)。
●⾄少⼀个空闲普通串⼝或USB⼝(视⽤户需求⽽定)。
3.接⼝⽂件说明接⼝⽂件包括:Dewlt.dll 相关动态联接库sdtapi.dll 相关动态联接库JpgDll.dll 相关动态联接库SavePhoto.dll 相关动态联接库sdtapi.h 相关动态联接库头⽂件适⽤开发语⾔:Visual C++ 5.0 及以后版本C++ Builder 5.0 及以后版本Visual Basic 5.0 及以后版本Delphi 3.0 及以后版本PowerBuilder 5.0 及以后版本4.接⼝函数说明4.1.端⼝函数4.1.1.端⼝初始化函数原型:int InitComm (int iPort)说明:本函数⽤于打开串⼝或USB并检测读卡设备是否就绪。
神盾第二代身份证阅读器使用手册1.1产品概述深圳研腾科技有限公司销售的神盾ICR-100M(B)智能接口身份证阅读器是联机使用的身份证专用阅读设备,采用拥有国家专利(实用新型专利号ZL 200620000992.9,发明专利号2006100010348)的智能识别技术,能自动识别计算机通讯端口、自动设置通讯参数、自动读卡。
该设备采用国际上先进的TypeB非接触IC卡阅读技术,以无线传输方式与第二代居民身份证内的专用芯片进行数据交换,可以将芯片内的个人信息资料读出,再通过计算机通讯接口,将此信息上传至计算机。
随机提供的安装软件通过ICR-100M(B)可以完成读取身份证芯片内个人信息资料操作,并且该随机软件还可以将这些信息解码成文字和相片进行显示和存储,进行“人证同一性”认定。
该设备兼容ISO14443(TypeB)标准,可根据用户需要读取其他符合ISO14443(TypeB)标准的非接触IC卡。
同时,该产品还可提供开放的应用程序接口(API)函数,供系统集成商进行二次开发。
该设备可采用计算机端口取电,体积小巧,既支持RS-232C通讯又支持USB 通讯,操作灵活简便,可应用于公安、民政、银行、宾馆、邮局、证券等场所进行身份核验。
1.2智能接口技术智能接口技术是集USB/RS-232C两种通讯方式和多种取电方式于一体,能自动识别计算机通讯端口、自动设置通讯参数、自动读卡的新技术。
采用智能接口技术的ICR-100M(B)身份证阅读器阅读器包括智能接口控制板、阅读器控制板、安全控制模块、阅读器天线、信号传输电缆、电源管理模块、专用通讯电缆及运行在阅读器控制板上的阅读器硬件程序和运行在计算机上的阅读程序。
该阅读器可同时支持USB和RS-232C两种通讯方式,并可以在不作任何硬件更改的情况下智能查找通讯方式和通讯端口。
本设备支持USB计算机端口、PS/2计算机端口以及外接直流电源多种供电方式,大大增强了设备使用的灵活性,方便用户根据自身情况做出选择,满足了用户的多样化需求。
身份证阅读器SDK使用说明(V1.3)深圳华视电子读写设备有限公司目录版本变更记录 (1)1身份证阅读器SDK简介 (1)2系统需求 (1)3函数说明 (1)3.1 核心相关函数 (1)3.2 获取身份证具体信息函数 (2)3.3 人证比对相关函数 (3)3.4 函数调用流程 (3)4身份证阅读器SDK (4)4.1 文件夹组成 (4)4.2 身份阅读器SDK的使用 (5)4.2.1 SDK使用方法 (5)4.2.2 SDK使用限制 (5)4.3 身份证阅读器SDK测试程序 (5)版本变更记录1身份证阅读器SDK简介本文档描述了深圳华视身份证阅读器SDK(Windows版)的调用方法、函数定义、参数和返回值说明,供开发商进行二次开发使用。
2系统需求(1)操作系统:Windows XP(2)开发环境:本SDK采用ANSI C语言编写,假定用户采用C/C++语言作为开发工具。
3函数说明3.1核心相关函数●●●●●3.2获取身份证具体信息函数下面是一组获取身份证具体信息的函数:3.3人证比对相关函数人证比对:3.4函数调用流程身份证阅读器SDK库应用函数的调用流程如下图所示:4身份证阅读器SDK4.1文件夹组成身份证阅读器SDK,由下述文件夹组成:·Include包含身份证阅读器SDK库头文件(termb.h);·lib包含身份证阅读器SDK库文件(静态库:termb.lib,动态库:termb.dll,CVRApi.dll,sdtapi.dll,WLTLib.dll)等;·license包含文件:license.lic, base.dat·example包含身份证阅读器SDK库测试程序;·doc包含身份证阅读器相关文档说明(身份证阅读器SDK使用说明.doc)。
4.2身份阅读器SDK的使用4.2.1SDK使用方法(1)静态库的适用方法:在VC环境下添加termb.lib附加依赖项,在调用它的应用程序里包含相应的termb.h头文件。
第二代身份证阅读器ICR-100系列身份证阅读器产品简介ICR-100系列身份证阅读器是联机使用的身份证专用阅读设备,它采用国际上先进的TypeB非接触IC卡阅读技术,通过内嵌的专用身份证安全控制模块(SAM),以无线传输方式与第二代居民身份证内的专用芯片进行安全认证后,将芯片内的个人信息资料读出,再通过计算机通讯接口,将此信息上传至计算机。
安装在计算机中的阅读软件,将这些信息解码成文字和相片进行显示和存储。
(图片仅供参考,实际大小以实物为主)产品特点通用性强:采用标准计算机通讯接口,支持WINDOWS/LINUX/UNIX等操作系统。
开放性好:提供SDK供系统集成商进行二次开发。
操作简便:随机阅读软件自动设置通讯口和通讯参数,自动找卡和阅读。
体积小巧:内置式天线。
外形美观:专业的造型设计和模具制作技术打造。
主要技术指标(ICR-100)符合公安部《GA450-2003台式居民身份证阅读器通用技术要求》和《1GA450-2003台式居民身份证阅读器通用技术要求第1号修改单》标准以及ISO14443(TypeB)国际标准通讯接口:自动识别RS-232C和USB阅读距离:0-5cm操作系统:WINDOWS/LINUX/UNIX供电方式:计算机端口取电或外接直流电源适配器使用环境:工作温度:0oC~50oC相对湿度:20%~90%重量:〈0.5Kg外型尺寸:185(L)X130(W)X40(H) mm连接示意图北京中盾安全技术开发公司简介北京中盾安全技术开发公司成立于1992年,是公安部第一研究所出资设立的国有独资企业,注册资本1.8亿元人民币,主要从事投资管理、技术开发、对外贸易、安全专用器材营销等经营管理活动。
目前,已投资设立了十几家公司,涉及公安和社会公共安全行业内的安全检查、安全防范、证件证卡、警用器械、警用通讯等领域,年营业额过亿元。
北京中盾安全技术开发公司通过了ISO9001∶2000国际质量管理体系认证;并在由商务部授权的中国企业信用体系建设活动中,被评为“中国商务信用AAA企业”;公司致力于为公安和社会公共安全服务,具有一级安全技术防范工程资质证书,是中国安全防范产品行业协会理事单位,北京安全防范行业协会副理事长单位;公司还是我国第二代居民身份证阅读(验证)机具定点生产单位,商用密码产品生产定点单位,北京市海淀区的高新技术企业。
类(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);//初始化。
java实现二代身份证信息查询程序(共五则)第一篇:java实现二代身份证信息查询程序本文是在java平台上编写的二代身份证信息查询程序,可以查询二代身份证的基本信息,包括文字信息和图像信息。
用到的Jar包是JNative.jar,这个很容易就能下载到,下载后添加到工程的外部jar库中。
另外,程序装载了sdtapi.DLL和WltRS.DLL文件,这两个文件必须放到C:WindowsSystem32目录下。
只有一个java文件,需要说明的是:用到的测试设备接口是RS232串口,USB的接口程序可自行修改。
资料是在网上用积分买的,现免费共享给手上没有积分的朋友下载。
package com.a;import javax.swing.*;import org.xvolks.jnative.JNative;import org.xvolks.jnative.Type;importorg.xvolks.jnative.exceptions.NativeException;importorg.xvolks.jnative.pointers.Pointer;importorg.xvolks.jnative.pointers.memory.MemoryBlockFactory;import java.awt.*;import javax.imageio.ImageIO;import java.io.*;import java.util.StringT okenizer;import java.awt.event.*;public class IdentityInfoReader extends JFrame implements ActionListener { private static final long serialVersionUID =-***8441L;JLabel[] label = new JLabel[10];JButton showBmp;JTextField[] text = new JTextField[9];String[] labelItem = {“姓名:”, “性别:”, “民族:”, “出生年月:”, “地址:”, “身份证号:”, “签发机构:”, “期限起始:”, “期限终止:”};JNative openJN = null, findJN = null, selectJN = null, readJN = null, MngJN = null, BmpJN = null, closeJN = null;JButton readJB, exitJB;int iPort = 1;int iIfOpen = 1;public InformationReader(String str){super(str);Sys tem.loadLibrary(“sdtapi”);try {try {init();} catch(NativeException e){} catch(UnsupportedEncodingException e){e.printStackTrace();}} catch(IllegalAccessException e){}label[0] = new JLabel(“二代身份证信息”);label[0].setBounds(200, 20, 95, 25);getContentPane().add(label[0]);for(int j = 1;j < labelItem.length + 1;j++){label[j] = new JLabel(labelItem[j1]);} text[0].setText(Info[0]);if(Info[1].charAt(0)=='1'){ text[1].setText(“男”);} else if(Info[1].charAt(0)== '2')text[1].setText(“女”);char[] nat ionChar = new char[2];Info[1].getChars(1, 3, nationChar, 0);String nationStr = “";nationStr = String.valueOf(nationChar);if(nationStr.equals(”01“))text[2].set Text(”汉“);else if(nationStr.equals(”02“))text[2].setText(”蒙古族“);else if(nationStr.equals(”03“))text[2].setText(”回族“);else if(nationStr.equals(”04“))text[2].setText(”藏族“);else if(nationStr.equals(”05“))text[2].setT ext(”维吾尔族“);else if(nationStr.equals(”06“))text[2].setT ext(”苗族“);else if(nationStr.equals(”07“))text[2].setT ext(”彝族“);else if(nationStr.equal s(”08“))text[2].setT ext(”壮族“);else if(nationStr.equals(”09“))text[2].setT ext(”布依族“);else if(nationStr.equals(”10“))text[2].setT ext(”朝鲜族“);elseif(nationStr.equals(”12“))text[2].setT ext(”侗族“);else if(nati onStr.equals(”13“))text[2].setT ext(”瑶族“);else if(nationStr.equals(”14“))text[2].setT ext(”白族“);else if(nationStr.equals(”15“))text[2].setT ext(”土家族“);else if(nationStr.equals(”16“))text[2].setT ext(”哈尼族“);else if(nationStr.equals(”17“))text[2].setT ext(”哈萨克族“);else if(nationStr.equals(”18“))text[2].setT ext(”傣族“);else if(nationStr.equals(”19“))text[2].setT ext(”黎族“);else if(nationStr.equals(”20“))text[2].setText(”傈僳族“);else if(nationStr.equals(”21“))text[2].setText(”佤族“);else if(nationStr.equals(”22“))text[2].setT ext(”畲族“);else if(nationStr.equals(”23“))text[2].setT ext(”高山族“);else if(nationStr.equals(”24“))text[2].setT ext(”拉祜族“);else if(nationStr.equals(”25“))text[2].setT ext(”水族“);else if(nationStr.equals(”26“))text[2].setT ext(”东乡族“);else if(nationStr.equals(”27“))text[2].setT ext(”纳西族“);else if(nationStr.equals(”28“))text[2].setT ext(”景颇族“);else if(nationStr.equals(”29“))text[2].setT ext(”柯尔克孜族“);else if(nationStr.equals(”30“))text[2].setT ext(”土族“);else if(nationStr.equals(”31“))text[2].setT ext(”达翰尔族“);else if(natio nStr.equals(”32“))text[2].setT ext(”仫佬族“);else if(nationStr.equals(”33“))text[2].setT ext(”羌族“);else if(nationStr.equals(”34“))text[2].setT ext(”布朗族“);else if(nationStr.equals(”35“))text[2].setT ext(”撒拉族“);else if(nationStr.equals(”36“))text[2].setT ext(”毛南族“);else if(nationStr.equals(”37“))text[2].setT ext(”仡佬族“);else if(nationStr.equals(”38“))text[2].setT ext(”锡伯族“);else if(nationStr.equals(”39“))text[2].setT ext(”阿昌族“);else if(nationStr.equals(”40“))text[2].setT ext(”普米族“);elseif(nationStr.equals(”42“))text[2].setT ext(”怒族“);else if(nationStr.equals(”43“))text[2].setT ext(”乌孜别克族“);else if(nationStr.equals(”44“))text[2].setT ext(”俄罗斯族“);else if(nationStr.equals(”45“))text[2].setT ext(”鄂温克族“);else if(nationStr.equa ls(”46“))text[2].setText(”德昂族“);else if(nationStr.equals(”47“))text[2].setText(”保安族“);else if(nationStr.equals(”48“))text[2].setText(”裕固族“);else if(nationStr.equals(”49“))text[2].setText(”京族“);else if(nationStr.equals(”50“))text[2].setText(”塔塔尔族“);else if(nationStr.equals(”51“))text[2].setText(”独龙族“);else if(nationStr.equals(”52“))text[2].setText(”鄂伦春族“);else if(nationStr.equals(”53“))text[2].setText(”赫哲族“);else if(nationStr.equals(”54“))text[2].setText(”门巴族“);else if(nationStr.equals(”55“))text[2].setText(”珞巴族“);else if(nationStr.equals(”56“))text[2].setText(”基诺族“);else if(nationStr.equals(”57“))text[2].setText(”其它“);else if(nationStr.equals(”98“))text[2].setText(”外国人入籍“);String BirthyearStr = ”“;char[] BirthyearChar = new char[4];Info[1].getChars(3, 7, BirthyearChar, 0);BirthyearStr = String.valueOf(BirthyearChar);String BirthmonthStr = ”“;char[] BirthmonthChar = new char[2];Info[1].getChars(7, 9, BirthmonthChar, 0);BirthmonthStr = String.valueOf(BirthmonthChar);Stri ng BirthdateStr = ”“;char[] BirthdateChar = new char[2];Info[1].getChars(9, 11, BirthdateChar, 0);BirthdateStr = String.valueOf(BirthdateChar);text[3].setText(BirthyearStr + ”年“ + BirthmonthStr + ”月“ + BirthdateStr + ”日“);char[] addressChar = new char[Info[1].length()18];Info[2].getChars(18, Info[2].length(), issueChar, 0);String issueStr = ”“;issueStr = String.valueOf(issueChar);text[6].setText(issueStr);char[] startyearChar = new char[4];Info[3].getChars(0, 4, startyearChar, 0);String startyea rStr = ”“;startyearStr = String.valueOf(startyearChar);char[] startmonthChar = new char[2];Info[3].getChars(4, 6, startmonthChar, 0);String startmonthStr = ”“;startmonthStr = String.valueOf(startmonthChar);char[] startdateChar = new char[2];Info[3].getChars(6, 8, startdateChar, 0);String startdateStr = ”“;startdateStr = String.valueOf(startdateChar);text[7].setText(startyearStr + ”年“ + startmonthStr + ”月“ + startdateStr + ”日“);char[] endyearChar = new char[4];Info[3].getChars(8, 12, endyearChar, 0);String endyearStr = ”“;endyearStr = String.valueOf(endyearChar);char[] endmonthChar = new char[2];Info[3].getChars(12, 14, endmonthChar, 0);String endmonthStr = ”“;endmonthStr = String.valueOf(endmonthChar);char[] enddateChar = new char[2];Info[3].getChars(14, 16, enddateChar, 0);String enddateStr = ”“;enddateStr = String.valueOf(enddateChar);text[8].setText(endyearStr + ”年“ + endmonthStr + ”月“ + enddateStr + ”日“);int count1 = d.getSize();byte[] byteArray1 = new byte[count1];for(i = 0;i < count1;i++)byteArray1[i] = c.getAsByte(i);try {File myFile = new File(”zp.wlt“);FileOutputStream out = new FileOutputStream(myFile);out.write(byteArray1, 0, count1-1);} catch(IOException t){}closeJN.invoke();// System.out.println(closeJN.getRetVal());int l = 0;System.loadLibrary(”WltRS“);BmpJN = new JNative(”WltRS“, ”GetBmp“); BmpJN.setRetVal(Type.INT);BmpJN.setParameter(l++, ”zp.wlt“); BmpJN.setParameter(l++, 1);BmpJN.invoke();if(readJN.getRetVal().equals(”144“)) System.out.println(”相片解码成功!“);elseSystem.out.println(”相片解码不成功!“); Image image = null;try {image = ImageIO.read(new File(”zp.bmp“)); } catch(IOException ex){}ImageIcon icon = new ImageIcon(image); showBmp.setIcon(icon);getContentPane().add(showBmp); setVisible(true);a.dispose();b.dispose();c.dispose();d.dispose();e.dispose();} catch(NativeException e){} catch(UnsupportedEncodingException e){ e.printStackTrace();}} catch(IllegalAccessException e){} }public static void main(String agrs[]){InformationReader informationReader = new InformationReader(”二代身份证信息读取");informationReader.setSize(500, 500);} }第二篇:简单的员工信息查询java程序import java.awt.event.ActionListener;import javax.swing.*;import java.awt.event.*;import java.awt.*;import java.sql.*;public class Employee extends JFrame implements ActionListener{String titles[]={“工号:”,“姓名:”,“性别:”,“出生日期:”,“联系电话:”,“家庭住址:”,“个人情况:”};JTextField employeeID=new JTextField(8);JTextField employeeName=new JTextField(8);JTextField employeeSex=new JTextField(2);JTextField employeeBirthday=new JTextField(6);JTextField employeePhone=new JTextField(11);JTextField employeeAddress=new JTextField(20);JTextArea employeeResume=new JTextArea();JButton first=new JButton(“首页”);JButton next=new JButton(“下一条”);JButton previous=new JButton(“上一条”);JButton last=new JButton(“尾页”);Statement stmt;ResultSet rs;Employee(){super(“员工信息查询”);setSize(350,330);try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Connectionconn=DriverManager.getConnection(“jdbc:odbc:mydb”,“sa”,“123”);stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSIT IVE,ResultSet.CONCUR_READ_ONLY);rs=stmt.executeQuery(“select * from mdb”);getContentPane().setLayout(new BorderLayout(0,8));JPanel p[]=new JPanel[6];for(int i=0;i<6;i++){p[i]=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0));p[i].add(new JLabel(titles[i]));}p[0].add(employeeID);p[1].add(employeeName);p[2].add(employeeSex);p[3].add(employeeBirthday);p[4].add(employeePhone);p[5].add(employeeAddress);JPanel p1=new JPanel(new GridLayout(6,1,0,8));JScrollPane jsp=new JScrollPane(employeeResume,JScrollPane.VERTICAL_SCROLLBAR _ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);jsp.setPreferredSize(new Dimension(250,80));for(int i=0;i<6;i++)p1.add(p[i]);JPanel p2=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0));p2.add(new JLabel(titles[6]));p2.add(jsp);JPanel p3=new JPanel();p3.add(first);p3.add(previous);p3.add(next);p3.add(last);getContentPane().add(p1,“North”); getContentPane().add(p2,“Center”); getContentPane().add(p3,“South”); next.addActionListener(this);previous.addActionListener(this);first.addActionListener(this);last.addActionListener(this);rs.first();display();}catch(Exception e){e.printStackTrace();} setVisible(true);}public void actionPerformed(ActionEvent e){ try{if(e.getSource()==next)rs.next();else if(e.getSource()==previous)rs.previous(); else if(e.getSource()==first)rs.first();else if(e.getSource()==last)st();display();}catch(Exception ee){ee.printStackTrace();}}boolean display(){try{employeeID.setText(rs.getString(“employeeID”));employeeName.setText(rs.getString(“employeeName”));employeeSex.setText(rs.getString(“employeeSex”));employeeBirthday.setText(rs.getString(“employeeBirthday ”));employeePhone.setText(r s.getString(“employeePhone”));employeeAddress.setText(rs.getString(“employeeAddress”));}employeeResume.setText(rs.getString(“employeeResume ”));}catch(SQLException e){e.printStackTrace();return false;}return true;}public static void main(String[] args){JFrame.setDefaultLookAndFeelDecorated(true);Employee em=new Employee();}第三篇:身份证信息查询接口查询身份证具体信息身份证信息查询接口查询身份证具体信息身份证信息查询接口可以查询身份证上具体信息,包括地区、性别、出生日期等情况。
本文由synjones2008贡献doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
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); [DllImport('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, intiIfOpen); [DllImport('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(' 未放卡或者卡未放好,请重新放卡! ', ' 提示 ', 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; } } //注意,在这里,用户必须有应用程序当前目录的读写权限//检测串口的机具连接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(' 未放卡或者卡未放好,请重新放卡! ', ' 提示 ', 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 FileInfo('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); else rtnTemp = GetBmp('zp.wlt', 1); switch (rtnTemp){ case 0: MessageBox.Show('调用sdtapi.dll 错误!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);break; case 1: //正常break; case -1: MessageBox.Show('相片解码错误!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);break; case -2: MessageBox.Show('wlt 文件后缀错误!', '提示', MessageBoxButtons.OK, MessageBoxIcon.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('01', '汉族'); lstMZ.Add('02', '蒙古族'); lstMZ.Add('03', '回族'); lstMZ.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', '侗族'); lstMZ.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('23', '高山族'); 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('45', '鄂温克族'); 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; } } }。
关于二代身份证读卡器地二次开发关于二代身份证读卡器地二次开发客户提供一台读卡器、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;}。
普天⾝份证阅读器⼆次开发⼿册1.前⾔本ActiveX控件⽤于⼆代证验证系统的验证终端应⽤系统的开发。
2.系统要求使⽤本控件的PC机,必须满⾜下列条件:●Windows 98,Windows 2000, Windows XP●⾄少32兆内存(32M RAM or Larger)●⾄少10兆空闲硬盘空间(10M Free Hard Disk Space or Larger)●⾄少⼀个空闲普通串⼝或USB⼝(视⽤户需求⽽定)。
3.⽂件列表FirstActivex.ocx ActiveX控件stdapi.dll 控件依赖的动态联接库WltRS.dll 控件依赖的动态联接库license.dat 授权⽂件4.注意事项1.Web开发⼀般不要解开cab包,直接将其放在服务器上,以便使⽤⾃动安装及⾃动更新功能。
2.VB开发将cab包解开,将⽂件列表中的⽂件放在⼀起,注册FirstActivex.ocx,⽅法是执⾏regsvr32 “[Path]FirstActivex.ocx”打开VB环境,右击⼯具栏,点击“部件”。
在控件列表中找到“FirstActivex Activex Control module”,将其打钩,点“确定”。
控件将出现在⼯具栏中。
5.属性和⽅法的列表6.属性和⽅法的详细说明属性:●BSTR PhotoPath设置照⽚的保存路径,该路径必须存在,如果未设置则不保存照⽚。
●BSTR ActivityLFrom有效期始,格式:yyyymmdd。
●BSTR ActivityLTo有效期⾄,格式:yyyymmdd。
●long Flag将此属性置1,禁⽤重复读卡功能,即卡放在机器上只能读⼀次。
置0打开重复读卡功能,即卡放在机器上可以多次读取。
⽅法:●long setPortNum(long iPort)设置端⼝号。
参数iPort:端⼝号,1表⽰串⼝1,2表⽰串⼝2,1001表⽰USB1,1002表⽰USB2,依次类推。
A300二代身份证代码开发手册此文档适用于南京蓝尼信通讯技术有限公司A300一体机,基于win mobile平台的二代身份证应用程序代码开发。
二代身份证应用程序整体框架二代身份证应有程序,按照功能划分,可分为两个部分:电源管理和刷卡。
电源管理电源管理的功能主要是管理集成在A300一体机上的二代身份证模块的电源,包括给模块打开电源和关闭电源两项功能。
电源管理使用A300一体机中已内置的驱动所提供的接口进行管理,与内置驱动进行通信采用windows流驱动通用接口。
步骤如下1、使用windows通用接口函数CreateFile获得驱动对应句柄:hHandle = CreateFile(TEXT("LMD1:"),GENERIC_READ|GENERIC_WRITE, // desired accessFILE_SHARE_READ|FILE_SHARE_WRITE, // sharing modeNULL, // security attributes (ignored)OPEN_EXISTING, // creation dispositionFILE_FLAG_RANDOM_ACCESS, // flags/attributesNULL);2、使用windows通用设备接口函数DeviceIoControl设置电源状态:a)给设备上电:DeviceIoControl(hHandle,IOCTL_GSR_ON_FLASH,NULL,0,NULL,0,NULL,NULL)b)关闭电源:DeviceIoControl(hHandle,IOCTL_GSR_OFF_FLASH,NULL,0,NULL,0,NULL,NULL)其中IO码应该按照如下定义设置:#define GSR_OFF_FLASH 3610#define GSR_ON_FLASH 3609#define IOCTL_GSR_OFF_FLASH CTL_CODE( FILE_DEVICE_HAL, GSR_OFF_FLASH, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_GSR_ON_FLASH CTL_CODE( FILE_DEVICE_HAL, GSR_ON_FLASH, METHOD_BUFFERED, FILE_ANY_ACCESS)3、使用windows通用接口函数CloseHandle释放已获得的驱动句柄:CloseHandle(hGSensor);刷卡刷卡必须在电源管理给模块上电以后方能执行。
零售网点低柜销售门户系统二代身份证鉴别仪厂商接口规范(V 1.0)成都开发中心2010年01月目录1外设驱动实现要求 (3)1.1支持全行的图形终端型号 (3)1.2支持多种外设连接方式 (3)1.3支持不同的端口类型 (3)1.4二代证驱动实现要求 (3)2参与外设驱动各方任务 (4)2.1PBCS项目组 (4)2.2外设厂商 (4)2.3分行 (4)3外设驱动模式 (5)3.1PBCS外设驱动流程图 (5)3.2客户端 (5)3.3系统登录页面 (6)3.4D EVICE C ONFIG.CFG配置文件 (6)3.5A PPLET小程序 (6)3.6厂商驱动 (6)4外设驱动接口 (7)4.1外设厂商需支持的终端型号范围 (7)4.2外设厂商需支持的转接设备范围 (7)4.3外设驱动数据交换格式标准 (8)4.3.1二代证鉴别仪驱动接口 (8)5需明确的问题 (12)6附件 (13)1外设驱动实现要求1.1支持全行的图形终端型号外设厂商在实现具体外设驱动时,必须支持全行现有的终端型号,对于后期新增的终端类型,必须提供相应的扩展机制。
1.2支持多种外设连接方式外设厂商在实现具体外设驱动时,必须支持全行现有的外设直连方式和外设间连方式;必须支持现有的转接设备型号,对于后期新增的转接设备型号,提供相应的扩展机制。
1.3支持不同的端口类型外设厂商在实现具体外设驱动时,根据外设特性应能支持在辅口、USB 口等多种端口类型上正常使用。
1.4二代证驱动实现要求※照片为JPG格式,大小不超过128K※要求鉴别仪为主动读卡,即身份证一进入读卡范围就立刻读卡,而不是由驱动函数触发读卡。
※必须使用java语言实现2参与外设驱动各方任务2.1PBCS项目组⏹定义外设驱动的访问接口⏹定义物理设备的特性需求⏹组织外设驱动程序测试⏹对PBCS应用程序进行相关改造⏹下发外设驱动及相关操作文档2.2外设厂商⏹根据要求实现外设驱动程序⏹提供测试过程中需要使用的物理设备⏹参与外设驱动程序测试⏹配合外设在分行的接入推广工作2.3分行⏹对前端进行外设驱动程序的安装⏹对下发驱动程序版本进行测试3外设驱动模式3.1PBCS外设驱动流程图系统登录页面客户端如图所示,PBCS系统使用Applet小程序进行调用厂商提供驱动程序驱动外设。