public void CloseComPort() { if (_isAutoOpenComPort) { StaticClassReaderA.CloseComPort(); } else { StaticClassReaderA.CloseSpecComPort(_portIndex); } }
/// <summary> /// 设置读写器为ISO14443A模式。 /// </summary> public bool Change14443() { int ret = 0x30; ret = StaticClassReaderA.ChangeToISO14443A(ref _readerAddr, _portIndex); if (ret == 0) { return(true); } else { Logger.Error(GetReturnCodeMessage(ret)); return(false); } }
/// <summary> /// 打开串口 /// </summary> public bool OpenComPort() { int ret = 0x30; byte fbaud = 0; //用该值设置或更改串口通讯控件的波特率 if (_isAutoOpenComPort) { ret = StaticClassReaderA.AutoOpenComPort(ref _comPort, ref _readerAddr, fbaud, ref _portIndex); //自动连接串口 } else { for (int i = 0; i <= 3; i++) { fbaud = Convert.ToByte(i); ret = StaticClassReaderA.OpenComPort(_comPort, ref _readerAddr, fbaud, ref _portIndex); } } if (ret == 0x30 || ret == 0x35)//端口已经打开 { CloseComPort(); ret = 0x30; if (_isAutoOpenComPort) { ret = StaticClassReaderA.AutoOpenComPort(ref _comPort, ref _readerAddr, fbaud, ref _portIndex); //自动连接串口 } else { for (int i = 0; i <= 3; i++) { fbaud = Convert.ToByte(i); ret = StaticClassReaderA.OpenComPort(_comPort, ref _readerAddr, fbaud, ref _portIndex); if (ret == 0) { break; } } } } if (ret == 0) { return(true); } else { Logger.Error(GetReturnCodeMessage(ret)); return(false); } }
/// <summary> /// 读取有效范围内14443A卡的序列号。 /// </summary> /// <param name="hid">14443A卡的序列号。</param> /// public bool GetHid(ref string hid) { int ret = 0x30; byte[] sn = new byte[4]; ret = StaticClassReaderA.GetUIDofHID(ref _readerAddr, sn, _portIndex); if (ret == 0) { hid = ByteArrayToHexString(sn); return(true); } else { Logger.Error(GetReturnCodeMessage(ret)); return(false); } }
/// <summary> /// 检查有效范围内是否有符合协议的电子标签存在。 /// </summary> /// <param name="uidList">符合协议的电子标签序列号集合</param> public bool GetUidList(out IEnumerable <string> uidList) { int ret = 0x30; byte state = 6; //默认不带AFI的InventoryScan byte afi = 0; //当查询命令为Selected模式时,需要输入电子标签的AFI数值。 byte[] dsfidAndUid = new byte[2300]; //指向输出数组变量,每个数组单元为9个字节,包括8个字节的UID和1个字节的DSFID信息。数组中的有效数据总量为CardNum*9个字节。 byte cardNumber = 0; //电子标签的张数。 ret = StaticClassReaderA.Inventory(ref _readerAddr, ref state, ref afi, dsfidAndUid, ref cardNumber, _portIndex); switch (ret) { case 0x0A: case 0x0B: case 0x0E: { Array.Resize(ref dsfidAndUid, cardNumber * 9); string str = ByteArrayToHexString(dsfidAndUid); if (ret == 0x0E || ret == 0x0B) { uidList = Enumerable.Range(0, cardNumber).Select(i => str.Substring(18 * i, 18).Substring(2, 16)); return(true); } } break; default: { Logger.Error(GetReturnCodeMessage(ret)); } break; } uidList = Enumerable.Empty <string>(); return(false); }
public HttpResponseMessage GetRFIDAPIReturn(string JsonRequest) { string returnValue = String.Empty; IDictionary <int, string> dict = new Dictionary <int, string>(); //解析方法名 JObject Parameters = JObject.Parse(JsonRequest); string functionName = Parameters["functionName"].ToString(); try { string RFID = ""; switch (functionName) { case "reader_load": status = RDR_LoadReaderDrivers(""); returnValue = JsonConvert.SerializeObject(new { status = status.ToString(), error = errorMsg }); break; //这里也不需要先新建一个connection?? case "rf_init_com": //status = ReaderA.StaticClassReaderA.CloseComPort(); status = ReaderA.RWDev.CloseComPort(); //int port = Int32.Parse(Parameters["port"].ToString()); int port = 0; StringBuilder portString = new StringBuilder(2); int baud = Int32.Parse(Parameters["baud"].ToString()); //string configFilePath = System.Environment.CurrentDirectory + @"\resources\app.asar.unpacked\dist\electron\static\IVFMatchAPIs\config.ini"; //string configFilePath = Path.Combine(System.Environment.CurrentDirectory, "config.ini"); string configFilePath = @"C:\LabTrustConfig\config.ini"; GetPrivateProfileString("读卡器", "port", "", portString, 500, configFilePath); port = Int32.Parse(portString.ToString()); if (port == 0) { fbaud = Convert.ToByte(baud / 19200 - 1); for (port = 0; port < 18; port++) { //status = ReaderA.StaticClassReaderA.OpenComPort(port, ref readerAddr, fbaud, ref portIndex); status = OpenComPort(port, ref readerAddr, fbaud, ref portIndex); if (status == 0) { dict.Add(portIndex, "rongrui"); WritePrivateProfileString("读卡器", "port", port.ToString(), configFilePath); break; } //添加安的读卡器的初始化 // } } else if (port != -1) { status = OpenComPort(port, ref readerAddr, fbaud, ref portIndex); if (status == 0) { dict.Add(portIndex, "rongrui"); //成功打开端口 } else { WritePrivateProfileString("读卡器", "port", "0", configFilePath); //打开失败则在配置文件中重置端口号为0,下次读取时,从0开始遍历端口号 } } status = RDR_LoadReaderDrivers(""); UInt32 nCount = HID_Enum("RL8000"); connStr = "RDType=RL8000;CommType=USB;AddrMode=1;SerNum="; for (int i = 0; i < nCount; i++) { StringBuilder sernum = new StringBuilder(); sernum.Append('\0', 64); UInt32 nSize; nSize = (UInt32)sernum.Capacity; int iret = HID_GetEnumItem((UInt32)i, 1, sernum, ref nSize); if (iret == 0) { connStr = connStr + sernum.ToString(); status = RDR_Open(connStr, ref hreader); if (status == 0) { dict.Add((int)hreader, "andi"); } } } UInt32 nnCount = HID_Enum("RD242"); connStr = "RDType=RD242;CommType=USB;AddrMode=1;SerNum="; for (int i = 0; i < nnCount; i++) { StringBuilder sernum = new StringBuilder(); sernum.Append('\0', 64); UInt32 nSize; nSize = (UInt32)sernum.Capacity; int iret = HID_GetEnumItem((UInt32)i, 1, sernum, ref nSize); if (iret == 0) { connStr = connStr + sernum.ToString(); status = RDR_Open(connStr, ref hreader); if (status == 0) { dict.Add((int)hreader, "andi"); } } } byte power = Convert.ToByte(7); //status = ReaderA.RWDev.GetPwr(ref readerAddr, ref _Pwr, ref _PwrVal, portIndex); status = ReaderA.RWDev.SetPwr(ref readerAddr, ref power, portIndex); Common.dict = dict; if (dict.Count() == 0) { status = -1; errorMsg = "设备未连接"; Common.dict = null; } else { status = 0; } returnValue = JsonConvert.SerializeObject(new { status = status.ToString(), error = errorMsg }); break; case "rf_light": byte color = Convert.ToByte(Parameters["color"].ToString()); returnValue = JsonConvert.SerializeObject(new { status = status.ToString() }); break; case "rf_beep": byte msec = Byte.Parse(Parameters["msec"].ToString()); returnValue = JsonConvert.SerializeObject(new { status = status.ToString() }); break; case "RF_Refresh_Cache": Common.rfidDT.Clear(); break; case "ISO15693_Inventories": var rows = Common.rfidDT.Select("TimeStamp < " + (MillisecNowCompute() - 2500).ToString()); bool foundNewRFID = false; foreach (var row in rows) { row.Delete(); } List <String> list = new List <String>(); List <String> newFoundRFIDList = new List <String>(); dict = Common.dict; try { foreach (KeyValuePair <int, string> item in dict) { if (item.Value == "rongrui") { portIndex = item.Key; status = Inventory(ref readerAddr, ref state, ref AFI, DSFIDAndUID, ref cardNumber, portIndex); Array.Resize(ref DSFIDAndUID, cardNumber * 9); strDSFIDAndUID = ByteArrayToHexString(DSFIDAndUID).Replace(" ", ""); for (int i = 0; i < cardNumber; i++) { s = strDSFIDAndUID.Substring(18 * i, 18); RFID = s.Substring(2, 16); list.Add(RFID); } status = (status == 14) ? 0 : status; if (status != 0) { status_rongrui = status; break; } } else if (item.Value == "andi") { portIndex = item.Key; UIntPtr hreader = (UIntPtr)portIndex; UIntPtr InvenParamSpecList = UIntPtr.Zero; ISO15693_CreateInvenParam(InvenParamSpecList, 0, 0, 0, 0); Byte[] antenna = new Byte[] { 1, 2, 3, 4 }; status = RDR_TagInventory(hreader, 1, 4, antenna, InvenParamSpecList); UIntPtr TagDataReport; TagDataReport = (UIntPtr)0; TagDataReport = RDR_GetTagDataReport(hreader, 1); while (TagDataReport.ToUInt64() > 0) { UInt32 aip_id = 0; UInt32 tag_id = 0; UInt32 ant_id = 0; Byte dsfid = 0; Byte uidlen = 0; Byte[] uid = new Byte[16]; int iret = ISO15693_ParseTagDataReport(TagDataReport, ref aip_id, ref tag_id, ref ant_id, ref dsfid, uid); uid = uid.Take(8).ToArray(); Array.Reverse(uid); RFID = ByteArrayToHexString(uid).Replace(" ", ""); list.Add(RFID); TagDataReport = RDR_GetTagDataReport(hreader, 2); } if (status != 0) { status_andi = status; break; } } } } catch (Exception e) { status_andi = -1; status_rongrui = -1; } status = (status_rongrui != 0) ? status_rongrui : status_andi; if (status == 17) { errorMsg = "天线位置异常或未被感应"; } if (status != 0 && status != 17) { var data = new { functionName = "rf_init_com", baud = "19200", }; var dataString = JsonConvert.SerializeObject(data); GetRFIDAPIReturn(dataString).Content.ToString(); } Console.WriteLine(Common.rfidDT.Rows.Count); foreach (var rfid in list) { if (Common.rfidDT.Select("RFID = '" + rfid + "'").Count() == 0) { foundNewRFID = true; } DataRow row = Common.rfidDT.NewRow(); row["RFID"] = rfid; row["TimeStamp"] = MillisecNowCompute(); Common.rfidDT.Rows.Add(row); } if (foundNewRFID) { newFoundRFIDList = Common.rfidDT.AsEnumerable().Select(r => r.Field <string>("RFID")).Distinct().ToList(); //当发现新的标签时,跳出循环,将2500ms内所有扫描到的值赋给newFoundRFIDList } returnValue = JsonConvert.SerializeObject(new { list = newFoundRFIDList, existRFIDList = list, status = status.ToString(), error = errorMsg }); break; case "rf_closeport": try { status = StaticClassReaderA.CloseComPort(); dict = Common.dict; foreach (KeyValuePair <int, string> item in dict) { if (item.Value == "andi") { portIndex = item.Key; UIntPtr chreader = (UIntPtr)portIndex; status = RDR_Close(chreader); } } Common.dict = null; } catch (Exception e) { } returnValue = JsonConvert.SerializeObject(new { status = status.ToString() }); break; } } catch (Exception e) { status = INTERNALERROR; errorMsg = e.ToString(); returnValue = JsonConvert.SerializeObject(new { status = INTERNALERROR.ToString(), error = e.ToString() }); } return(ResultToJson.toJson(returnValue)); }