using System; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows; using Newtonsoft.Json.Linq; namespace ZZJIDCard { public class ZZJIDReadCard { private bool mbOpened = false; private Thread mthWorkThread = null; bool mbStopThread = true; bool mbSuspendReadCard = false; JObject resultObj = new JObject(); int icdev = -1; public JObject dcinit() { JObject output = new JObject(); String errorCode = "0"; String errorMessage = "成功"; icdev = T10TermbApi.dc_init(100, 115200);//打开usb端口设备,波特率设置无效 if ((int)icdev <= 0) { //MessageBox.Show("初始化失败 打开usb端口设备失败!!!"); errorCode = "-1"; errorMessage = "初始化失败 打开身份证usb端口设备失败!!!"; output.Add("errorCode", errorCode); output.Add("errorMessage", errorMessage); return output; } output.Add("errorCode", errorCode); output.Add("errorMessage", errorMessage); return output; } public string IDReadCard(string inParams) { // System.Diagnostics.Debugger.Launch(); string errorCode = "0"; string errorMessage = ""; JObject output = new JObject(); int olyIDCardFlag = 0; resultObj = new JObject(); try { JObject inParamsobj = JObject.Parse(inParams); string port = inParamsobj["iport"].ToString(); if (port != "") { //单独身份证读取 int iPort = 0; int.TryParse(port, out iPort); if (iPort > 0) { int ret = TermbApi.InitComm(iPort); if (ret > 0) { olyIDCardFlag = 1; byte[] value = new byte[64]; TermbApi.GetSAMID(value); String strSamId = Encoding.GetEncoding("GBK").GetString(value); strSamId = strSamId.Replace("\0", ""); mbOpened = true; mbStopThread = false; mthWorkThread = new Thread(new ThreadStart(readCard)); mthWorkThread.IsBackground = true; mthWorkThread.Start(); } } } } catch (Exception ex2) { } try { if (olyIDCardFlag == 1) { mbStopThread = true; mthWorkThread.Join(); TermbApi.CloseComm(); ////"设备连接断开!"; mbOpened = false; } } catch (Exception ex2) { errorCode = "-1"; errorMessage = ex2.Message; } if (olyIDCardFlag == 1) { output.Add("errorCode", errorCode); output.Add("errorMessage", errorMessage); output.Add("result", resultObj); return output.ToString(); } ///////////////以下为非单独身份证读取//////////////////////////////////// int st = -1; try { if (olyIDCardFlag == 0) { //非单独身份证读取 if ((int)icdev <= 0) { JObject dcinitoutobj = dcinit(); if (dcinitoutobj["errorCode"].ToString() != "0") { return output.ToString(); } } //MessageBox.Show("2:"+icdev.ToString()); if ((int)icdev <= 0) { errorCode = "-1"; errorMessage = "初始化失败 打开身份证usb端口设备失败!!!"; output.Add("errorCode", errorCode); output.Add("errorMessage", errorMessage); return output.ToString(); } int result = -1; int text_len = 0; byte[] text = new byte[256]; int photo_len = 204800; byte[] photo = new byte[204800]; int fingerprint_len = 0; byte[] fingerprint = new byte[1024]; int extra_len = 0; byte[] extra = new byte[70]; int type = 0; string tempbuffer; byte[] name = new byte[64]; byte[] sex = new byte[8]; byte[] nation = new byte[12]; byte[] birth_day = new byte[30]; byte[] address = new byte[125]; byte[] id_number = new byte[60]; byte[] department = new byte[64]; byte[] expire_start_day = new byte[36]; byte[] expire_end_day = new byte[36]; byte[] reserved = new byte[76]; byte[] info_buffer = new byte[64]; result = T10TermbApi.dc_SamAReadCardInfo(icdev, 3, ref text_len, text, ref photo_len, photo, ref fingerprint_len, fingerprint, ref extra_len, extra); //MessageBox.Show(result.ToString()); if (result != 0) { //st = T10TermbApi.dc_exit(icdev); //MessageBox.Show("3:" + st.ToString()); errorCode = "-1"; errorMessage = "读取失败!!!!!"; output.Add("errorCode", errorCode); output.Add("errorMessage", errorMessage); return output.ToString(); } if ((text[0] >= 'A') && (text[0] <= 'Z') && (text[1] == 0)) { type = 1; } if (type == 0) { result = T10TermbApi.dc_ParseTextInfo(icdev, 0, text_len, text, name, sex, nation, birth_day, address, id_number, department, expire_start_day, expire_end_day, reserved); if (result != 0) { //st = T10TermbApi.dc_exit(icdev); errorCode = "-1"; errorMessage = "读取失败!!!!!"; output.Add("errorCode", errorCode); output.Add("errorMessage", errorMessage); return output.ToString(); } resultObj.Add("name", Regex.Replace(System.Text.Encoding.Default.GetString(name), "\u0000", "")); T10TermbApi.dc_ParseOtherInfo(icdev, 0, sex, info_buffer); resultObj.Add("sex", Regex.Replace(System.Text.Encoding.Default.GetString(info_buffer), "\u0000", "")); T10TermbApi.dc_ParseOtherInfo(icdev, 1, nation, info_buffer); resultObj.Add("nation", Regex.Replace(System.Text.Encoding.Default.GetString(info_buffer), "\u0000", "")); resultObj.Add("birth_day", Regex.Replace(System.Text.Encoding.Default.GetString(birth_day), "\u0000", "")); resultObj.Add("address", Regex.Replace(System.Text.Encoding.Default.GetString(address), "\u0000", "")); resultObj.Add("id_number", Regex.Replace(System.Text.Encoding.Default.GetString(id_number), "\u0000", "")); resultObj.Add("department", Regex.Replace(System.Text.Encoding.Default.GetString(department), "\u0000", "")); resultObj.Add("expire_start_day", Regex.Replace(System.Text.Encoding.Default.GetString(expire_start_day), "\u0000", "")); resultObj.Add("expire_end_day", Regex.Replace(System.Text.Encoding.Default.GetString(expire_end_day), "\u0000", "")); } else if (type == 1) { byte[] english_name = new byte[244]; byte[] citizenship = new byte[16]; byte[] chinese_name = new byte[64]; byte[] version_number = new byte[12]; byte[] department_code = new byte[20]; byte[] type_sign = new byte[8]; result = T10TermbApi.dc_ParseTextInfoForForeigner(icdev, 0, text_len, text, english_name, sex, id_number, citizenship, chinese_name, expire_start_day, expire_end_day, birth_day, version_number, department_code, type_sign, reserved); if (result != 0) { //st = T10TermbApi.dc_exit(icdev); errorCode = "-1"; errorMessage = "读取失败!!!!!"; output.Add("errorCode", errorCode); output.Add("errorMessage", errorMessage); return output.ToString(); } tempbuffer = string.Format("name: {0}", System.Text.Encoding.Default.GetString(english_name)); string strEnName = Regex.Replace(System.Text.Encoding.Default.GetString(english_name), "\u0000", ""); resultObj.Add("enName", strEnName); T10TermbApi.dc_ParseOtherInfo(icdev, 0, sex, info_buffer); resultObj.Add("sex", Regex.Replace(System.Text.Encoding.Default.GetString(sex), "\u0000", "")); tempbuffer = string.Format("id_number: {0}", System.Text.Encoding.Default.GetString(id_number)); resultObj.Add("id_number", Regex.Replace(System.Text.Encoding.Default.GetString(id_number), "\u0000", "")); T10TermbApi.dc_ParseOtherInfo(icdev, 2, citizenship, info_buffer); resultObj.Add("citizenship", Regex.Replace(System.Text.Encoding.Default.GetString(info_buffer), "\u0000", "")); resultObj.Add("citizenship2", Regex.Replace(System.Text.Encoding.Default.GetString(citizenship), "\u0000", "")); string strCnName = Regex.Replace(System.Text.Encoding.Default.GetString(chinese_name), "\u0000", ""); if (strCnName != "") { resultObj.Add("name", strCnName); } else { resultObj.Add("name", strEnName); } resultObj.Add("expire_start_day", Regex.Replace(System.Text.Encoding.Default.GetString(expire_start_day), "\u0000", "")); resultObj.Add("expire_end_day", Regex.Replace(System.Text.Encoding.Default.GetString(expire_end_day), "\u0000", "")); resultObj.Add("birth_day", Regex.Replace(System.Text.Encoding.Default.GetString(birth_day), "\u0000", "")); resultObj.Add("visatimes", Regex.Replace(System.Text.Encoding.Default.GetString(version_number), "\u0000", "")); resultObj.Add("department_code", Regex.Replace(System.Text.Encoding.Default.GetString(department_code), "\u0000", "")); resultObj.Add("department", Regex.Replace(System.Text.Encoding.Default.GetString(department_code), "\u0000", "")); resultObj.Add("type_sign", Regex.Replace(System.Text.Encoding.Default.GetString(type_sign), "\u0000", "")); } } } catch (Exception ex2) { errorCode = "-1"; errorMessage = ex2.Message; } //st = T10TermbApi.dc_exit(icdev); output.Add("errorCode", errorCode); output.Add("errorMessage", errorMessage); output.Add("result", resultObj); return output.ToString(); } private void readCard() { Thread.Sleep(200); int ret = TermbApi.Authenticate(); if (1 == ret) { ret = TermbApi.Read_Content(1); if (1 == ret) { resultObj.Add("IDType", "居民身份证"); // 姓名,性别,民族,出生日期,常住地址,身份号码,签发机关,有效期限,照片,指纹 byte[] value = new byte[256]; TermbApi.getName(value, 256); String strName = Encoding.GetEncoding("GBK").GetString(value); strName = strName.Replace("\0", ""); resultObj.Add("name", strName); Array.Clear(value,0, value.Length); TermbApi.getSex(value, 256); String strSex = Encoding.GetEncoding("GBK").GetString(value); strSex = strSex.Replace("\0", ""); resultObj.Add("sex", strSex); Array.Clear(value, 0, value.Length); TermbApi.getNation(value, 256); String strNation = Encoding.GetEncoding("GBK").GetString(value); strNation = strNation.Replace("\0", ""); resultObj.Add("nation", strNation); Array.Clear(value, 0, value.Length); TermbApi.getBirthdate(value, 256); String strBorn = Encoding.GetEncoding("GBK").GetString(value); strBorn = strBorn.Replace("\0", ""); resultObj.Add("birth_day", strBorn); Array.Clear(value, 0, value.Length); TermbApi.getAddress(value, 256); String strAddress = Encoding.GetEncoding("GBK").GetString(value); strAddress = strAddress.Replace("\0", ""); resultObj.Add("address", strAddress); Array.Clear(value, 0, value.Length); TermbApi.getIDNum(value, 256); String strLicId = Encoding.GetEncoding("GBK").GetString(value); strLicId = strLicId.Replace("\0", ""); resultObj.Add("id_number", strLicId); Array.Clear(value, 0, value.Length); TermbApi.getIssue(value, 256); String strIssue = Encoding.GetEncoding("GBK").GetString(value); strIssue = strIssue.Replace("\0", ""); //strResult += "\r\n签发机关:" + strIssue; resultObj.Add("department", strIssue); Array.Clear(value, 0, value.Length); TermbApi.getEffectedDate(value, 256); String strEffextedDate = Encoding.GetEncoding("GBK").GetString(value); strEffextedDate = strEffextedDate.Replace("\0", ""); resultObj.Add("expire_start_day", strEffextedDate); Array.Clear(value, 0, value.Length); TermbApi.getExpiredDate(value, 256); String strexpireDate = Encoding.GetEncoding("GBK").GetString(value); strexpireDate = strexpireDate.Replace("\0", ""); resultObj.Add("expire_end_day", strexpireDate); ret = TermbApi.GetBmpPhotoExt(); if (1 == ret) { Array.Clear(value, 0, value.Length); value = new byte[128 * 1024]; TermbApi.getJPGPhotoBase64(value, 128 * 1024); String strJpegBase64 = Encoding.GetEncoding("GBK").GetString(value); strJpegBase64 = strJpegBase64.Replace("\0", ""); resultObj.Add("picture", strJpegBase64); } Array.Clear(value, 0, value.Length); } else if (2 == ret) { // 中文名,英文名,性别,国家,出生日期,身份号码,签发机关代码,有效期限,照片,指纹 resultObj.Add("IDType", "2017版永居证"); byte[] value = new byte[256]; TermbApi.getCnName(value, 256); String strCnName = Encoding.GetEncoding("GBK").GetString(value); strCnName = strCnName.Replace("\0", ""); Array.Clear(value, 0, value.Length); TermbApi.getEnName(value, 256); String strEnName = Encoding.GetEncoding("GBK").GetString(value); strEnName = strEnName.Replace("\0", ""); //strResult += "\r\n英文名:" + strEnName; if (strCnName != "") { resultObj.Add("name", strCnName); } else { resultObj.Add("name", strEnName); } resultObj.Add("enName", strEnName); Array.Clear(value, 0, value.Length); TermbApi.getSex(value, 256); String strSex = Encoding.GetEncoding("GBK").GetString(value); strSex = strSex.Replace("\0", ""); resultObj.Add("sex", strSex); Array.Clear(value, 0, value.Length); TermbApi.getNation(value, 256); String strCountry = Encoding.GetEncoding("GBK").GetString(value); strCountry = strCountry.Replace("\0", ""); //strResult += "\r\n国家/地区:" + strCountry; resultObj.Add("address", strCountry); Array.Clear(value, 0, value.Length); TermbApi.getBirthdate(value, 256); String strBorn = Encoding.GetEncoding("GBK").GetString(value); strBorn = strBorn.Replace("\0", ""); //strResult += "\r\n出生日期:" + strBorn; resultObj.Add("birth_day", strBorn); Array.Clear(value, 0, value.Length); TermbApi.getIDNum(value, 256); String strLicId = Encoding.GetEncoding("GBK").GetString(value); strLicId = strLicId.Replace("\0", ""); //strResult += "\r\n身份号码:" + strLicId; resultObj.Add("id_number", strLicId); Array.Clear(value, 0, value.Length); TermbApi.getIssue(value, 256); String strIssue = Encoding.GetEncoding("GBK").GetString(value); strIssue = strIssue.Replace("\0", ""); //strResult += "\r\n签发机关代码:" + strIssue; resultObj.Add("department", strIssue); Array.Clear(value, 0, value.Length); TermbApi.getEffectedDate(value, 256); String strEffectedData = Encoding.GetEncoding("GBK").GetString(value); strEffectedData = strEffectedData.Replace("\0", ""); resultObj.Add("expire_start_day", strEffectedData); Array.Clear(value, 0, value.Length); TermbApi.getExpiredDate(value, 256); String strExpireDate = Encoding.GetEncoding("GBK").GetString(value); strExpireDate = strExpireDate.Replace("\0", ""); resultObj.Add("expire_end_day", strExpireDate); //strResult += "\r\n有效期限:" + strEffectedData + "-" + strExpireDate; value = new byte[128 * 1024]; ret = TermbApi.GetBmpPhotoExt(); if (1 == ret) { Array.Clear(value, 0, value.Length); value = new byte[128 * 1024]; TermbApi.getJPGPhotoBase64(value, 128 * 1024); String strJpegBase64 = Encoding.GetEncoding("GBK").GetString(value); strJpegBase64 = strJpegBase64.Replace("\0", ""); resultObj.Add("picture", strJpegBase64); } } else if (3 == ret) { // 姓名,性别,出生日期,常住地址,身份号码,签发机关,有效期限,照片,指纹 resultObj.Add("IDType", "港澳台居住证"); byte[] value = new byte[256]; TermbApi.getName(value, 256); String strName = Encoding.GetEncoding("GBK").GetString(value); strName = strName.Replace("\0", ""); resultObj.Add("name", strName); Array.Clear(value, 0, value.Length); TermbApi.getSex(value, 256); String strSex = Encoding.GetEncoding("GBK").GetString(value); strSex = strSex.Replace("\0", ""); resultObj.Add("sex", strSex); Array.Clear(value, 0, value.Length); TermbApi.getBirthdate(value, 256); String strBorn = Encoding.GetEncoding("GBK").GetString(value); strBorn = strBorn.Replace("\0", ""); resultObj.Add("birth_day", strBorn); Array.Clear(value, 0, value.Length); TermbApi.getAddress(value, 256); String strAddress = Encoding.GetEncoding("GBK").GetString(value); strAddress = strAddress.Replace("\0", ""); //strResult += "\r\n常住地址:" + strAddress; resultObj.Add("address", strAddress); Array.Clear(value, 0, value.Length); TermbApi.getIDNum(value, 256); String strLicId = Encoding.GetEncoding("GBK").GetString(value); strLicId = strLicId.Replace("\0", ""); //strResult += "\r\n身份号码:" + strLicId; resultObj.Add("id_number", strLicId); Array.Clear(value, 0, value.Length); TermbApi.getIssue(value, 256); String strIssue = Encoding.GetEncoding("GBK").GetString(value); strIssue = strIssue.Replace("\0", ""); //strResult += "\r\n签发机关:" + strIssue; resultObj.Add("department", strIssue); Array.Clear(value, 0, value.Length); TermbApi.getEffectedDate(value, 256); String strEffextedDate = Encoding.GetEncoding("GBK").GetString(value); strEffextedDate = strEffextedDate.Replace("\0", ""); resultObj.Add("expire_start_day", strEffextedDate); Array.Clear(value, 0, value.Length); TermbApi.getExpiredDate(value, 256); String strexpireDate = Encoding.GetEncoding("GBK").GetString(value); strexpireDate = strexpireDate.Replace("\0", ""); //strResult += "\r\n有效期限:" + strEffextedDate + "-" + strexpireDate; resultObj.Add("expire_end_day", strexpireDate); Array.Clear(value, 0, value.Length); TermbApi.getPassNum(value, 256); String strPassNum = Encoding.GetEncoding("GBK").GetString(value); strPassNum = strPassNum.Replace("\0", ""); //strResult += "\r\n通行证号码:" + strPassNum; resultObj.Add("passNum", strPassNum); int visatimes = TermbApi.getVisaTimes(); resultObj.Add("visatimes", visatimes); //strResult += "\r\n签证次数:" + visatimes; ret = TermbApi.GetBmpPhotoExt(); if (1 == ret) { Array.Clear(value, 0, value.Length); value = new byte[128 * 1024]; TermbApi.getJPGPhotoBase64(value, 128 * 1024); String strJpegBase64 = Encoding.GetEncoding("GBK").GetString(value); strJpegBase64 = strJpegBase64.Replace("\0", ""); resultObj.Add("picture", strJpegBase64); } } else if (4 == ret) { // 中文名,英文名,性别,国家,出生日期,身份号码,签发机关代码,有效期限,照片,指纹 //String strResult = "证件类型:2023版永居证\r\n"; resultObj.Add("IDType", "2023版永居证"); byte[] value = new byte[256]; TermbApi.getCnName(value, 256); String strCnName = Encoding.GetEncoding("GBK").GetString(value); strCnName = strCnName.Replace("\0", ""); //strResult += "中文名:" + strCnName; Array.Clear(value, 0, value.Length); TermbApi.getEnName(value, 256); String strEnName = Encoding.GetEncoding("GBK").GetString(value); strEnName = strEnName.Replace("\0", ""); //strResult += "\r\n英文名:" + strEnName; if (strCnName != "") { resultObj.Add("name", strCnName); } else { resultObj.Add("name", strEnName); } resultObj.Add("enName", strEnName); Array.Clear(value, 0, value.Length); TermbApi.getSex(value, 256); String strSex = Encoding.GetEncoding("GBK").GetString(value); strSex = strSex.Replace("\0", ""); resultObj.Add("sex", strSex); Array.Clear(value, 0, value.Length); TermbApi.getNation(value, 256); String strCountry = Encoding.GetEncoding("GBK").GetString(value); strCountry = strCountry.Replace("\0", ""); //strResult += "\r\n国家/地区:" + strCountry; resultObj.Add("address", strCountry); Array.Clear(value, 0, value.Length); TermbApi.getBirthdate(value, 256); String strBorn = Encoding.GetEncoding("GBK").GetString(value); strBorn = strBorn.Replace("\0", ""); //strResult += "\r\n出生日期:" + strBorn; resultObj.Add("birth_day", strBorn); Array.Clear(value, 0, value.Length); TermbApi.getIDNum(value, 256); String strLicId = Encoding.GetEncoding("GBK").GetString(value); strLicId = strLicId.Replace("\0", ""); //strResult += "\r\n身份号码:" + strLicId; resultObj.Add("id_number", strLicId); Array.Clear(value, 0, value.Length); TermbApi.getEffectedDate(value, 256); String strEffectedData = Encoding.GetEncoding("GBK").GetString(value); strEffectedData = strEffectedData.Replace("\0", ""); resultObj.Add("expire_start_day", strEffectedData); Array.Clear(value, 0, value.Length); TermbApi.getExpiredDate(value, 256); String strExpireDate = Encoding.GetEncoding("GBK").GetString(value); strExpireDate = strExpireDate.Replace("\0", ""); //strResult += "\r\n有效期限:" + strEffectedData + "-" + strExpireDate; resultObj.Add("expire_end_day", strExpireDate); Array.Clear(value, 0, value.Length); int visaTimes = TermbApi.getVisaTimes(); resultObj.Add("visatimes", visaTimes); //strResult += "\r\n换证次数:" + visaTimes; Array.Clear(value, 0, value.Length); TermbApi.getRelateIDNum(value, 256); String strRelateIdNum = Encoding.GetEncoding("GBK").GetString(value); strRelateIdNum = strRelateIdNum.Replace("\0", ""); //strResult += "\r\n既往证件号码关联项:" + strRelateIdNum; resultObj.Add("relateIdNum", strRelateIdNum); if (strRelateIdNum.Length > 0) { Array.Clear(value, 0, value.Length); TermbApi.getOldIDNum(value, 256); String strOldId = Encoding.GetEncoding("GBK").GetString(value); strOldId = strOldId.Replace("\0", ""); //strResult += "\r\n既往证件号码:" + strOldId; resultObj.Add("relateIdNumOldId", strOldId); } value = new byte[128 * 1024]; ret = TermbApi.GetBmpPhotoExt(); if (1 == ret) { Array.Clear(value, 0, value.Length); value = new byte[128 * 1024]; TermbApi.getJPGPhotoBase64(value, 128 * 1024); String strJpegBase64 = Encoding.GetEncoding("GBK").GetString(value); strJpegBase64 = strJpegBase64.Replace("\0", ""); resultObj.Add("picture", strJpegBase64); } } } } } }