private void SetReadPlan() { TagFilter filter = null; if (selectMemBank == Gen2.Bank.EPC) { if (txtEpc.Text != "") { filter = new TagData(txtEpc.Text); } } else { byte[] data = ByteFormat.FromHex(txtData.Text); if (null == data) { dataLength = 0; } else { dataLength = data.Length; } filter = new Gen2.Select(false, selectMemBank, Convert.ToUInt16(startAddress * 16), Convert.ToUInt16(dataLength * 8), data); } SimpleReadPlan srp = new SimpleReadPlan(new int[] { antenna }, TagProtocol.GEN2, filter, 1000); objReader.ParamSet("/reader/read/plan", srp); }
static void Main(string[] args) { //Connecting the reader and setting base parameters Reader r = Reader.Create("tmr:///COM3"); r.Connect(); r.ParamSet("/reader/region/id", Reader.Region.NA); //Region r.ParamSet("/reader/radio/readPower", 2000); //Read power r.ParamSet("/reader/gen2/t4", 3000); //3ms continuous wave //Defining the Select command to the tag Gen2.Select tempSelect = new Gen2.Select(false, Gen2.Bank.USER, 0xE0, 0, new byte[0]); //Storing Temperature data in reserved memory bank pointed at 0xE TagOp tempRead = new Gen2.ReadData(Gen2.Bank.RESERVED, 0xE, 1); SimpleReadPlan readPlan = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, tempSelect, tempRead, 100); r.ParamSet("/reader/read/plan", readPlan); TagReadData[] tempReadResults = r.Read(75); //Read for 75ms foreach (TagReadData result in tempReadResults) { string EPC = result.EpcString; string frequency = result.Frequency.ToString(); string tempCodeHex = ByteFormat.ToHex(result.Data, ", "); int tempCode = Convert.ToInt32(tempCodeHex, 16); if (tempCode > 1000 && tempCode < 3500) { Console.WriteLine("EPC: " + EPC + "Frequency(kHz): " + frequency + "Temperature Code: " + tempCode); } } }
private void btnWrite_Click(object sender, RoutedEventArgs e) { try { Mouse.SetCursor(Cursors.Wait); Window mainWindow = App.Current.MainWindow; ComboBox CheckRegionCombobx = (ComboBox)mainWindow.FindName("regioncombo"); if (CheckRegionCombobx.SelectedValue.ToString() == "Select") { MessageBox.Show("Please select region", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } if ((bool)rbFirstTag.IsChecked) { antenna = ((null != GetSelectedAntennaList()) ? (GetSelectedAntennaList()[0]) : antenna); } objReader.ParamSet("/reader/tagop/antenna", antenna); if ((bool)rbSelectedTag.IsChecked) { TagFilter searchSelect = null; if (lblSelectFilter.Content.ToString().Contains("EPC ID")) { searchSelect = new TagData(txtEpc.Text); } else { byte[] SearchSelectData = ByteFormat.FromHex(txtData.Text); if (null == SearchSelectData) { dataLength = 0; } else { dataLength = SearchSelectData.Length; } searchSelect = new Gen2.Select(false, selectMemBank, Convert.ToUInt16(startAddress * 16), Convert.ToUInt16(dataLength * 8), SearchSelectData); } WriteEPC(searchSelect, txtWriteEPC.Text); } else { WriteEPC(null, txtWriteEPC.Text); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } finally { Mouse.SetCursor(Cursors.Arrow); } }
public static string SaveSimpleReadPlan(Object value) { string readPlan = string.Empty; ReadPlan rp = (ReadPlan)value; readPlan += "SimpleReadPlan:["; SimpleReadPlan srp = (SimpleReadPlan)rp; readPlan += "Antennas=" + ArrayToString(srp.Antennas); readPlan += "," + "Protocol=" + srp.Protocol.ToString(); if (srp.Filter != null) { if (srp.Filter is Gen2.Select) { Gen2.Select sf = (Gen2.Select)srp.Filter; readPlan += "," + string.Format("Filter=Gen2.Select:[Invert={0},Bank={1},BitPointer={2},BitLength={3},Mask={4}]", (sf.Invert?"true" : "false"), sf.Bank, sf.BitPointer, sf.BitLength, ByteFormat.ToHex(sf.Mask)); } else { Gen2.TagData td = (Gen2.TagData)srp.Filter; readPlan += "," + string.Format("Filter=TagData:[EPC={0}]", td.EpcString); } } else { readPlan += ",Filter=null"; } if (srp.Op != null) { if (srp.Op is Gen2.ReadData) { Gen2.ReadData rd = (Gen2.ReadData)srp.Op; readPlan += "," + string.Format("Op=ReadData:[Bank={0},WordAddress={1},Len={2}]", rd.Bank, rd.WordAddress, rd.Len); } else { readPlan += ",Op=null"; } } else { readPlan += ",Op=null"; } readPlan += "," + "UseFastSearch=" + srp.UseFastSearch.ToString(); readPlan += "," + "Weight=" + srp.Weight.ToString() + "]"; return(readPlan); }
// read multiple registers from one tag singulated by its EPC public static short[] ReadMemBlockByEpc(Reader reader, TagReadData tag, Gen2.Bank bank, int address, int length, int attempts) { Gen2.Select resetFilter = CreateGen2Select(4, 4, Gen2.Bank.TID, 0x00, 16, new byte[] { 0xE2, 0x82 }); Gen2.Select epcFilter = CreateGen2Select(4, 0, Gen2.Bank.EPC, 0x20, tag.Epc.Length * 8, tag.Epc); MultiFilter selects = new MultiFilter(new Gen2.Select[] { resetFilter, epcFilter }); Gen2.ReadData operation = new Gen2.ReadData(bank, (uint)address, (byte)length); SimpleReadPlan config = new SimpleReadPlan(new int[] { tag.Antenna }, TagProtocol.GEN2, selects, operation, 1000); short[] values = null; try { reader.ParamSet("/reader/read/plan", config); for (int i = 0; i < attempts; i++) { if (values != null) { break; } TagReadData[] readResults = reader.Read(readTime); foreach (TagReadData readResult in readResults) { if (tag.EpcString.Equals(readResult.EpcString)) { byte[] dataBytes = readResult.Data; if (dataBytes.Length != 0) { values = ConvertByteArrayToShortArray(dataBytes); break; } } } } } catch (ReaderException e) { Console.WriteLine("Error: " + e.ToString()); Environment.Exit(-1); } if (values == null) { throw new SystemException("Tag not found"); } return(values); }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (r = Reader.Create(args[0])) { //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } string model = (string)r.ParamGet("/reader/version/model").ToString(); if (!model.Equals("M3e")) { if (r.isAntDetectEnabled(antennaList)) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } //Use first antenna for operation if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } } else { if (antennaList != null) { Console.WriteLine("Module doesn't support antenna input"); Usage(); } } // This select filter matches all Gen2 tags where bits 32-48 of the EPC are 0x0123 #if ENABLE_FILTER TagFilter filter = new Gen2.Select(false, Gen2.Bank.EPC, 32, 16, new byte[] { 0x01, 0x23 }); #endif if (!model.Equals("M3e")) { //Gen2.TagData epc = new Gen2.TagData(new byte[] { // 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, // 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, //}); //Gen2.WriteTag tagop = new Gen2.WriteTag(epc); //r.ExecuteTagOp(tagop, null); } // Reads data from a tag memory bank after writing data to the requested memory bank without powering down of tag #if ENABLE_READ_AFTER_WRITE { //create a tagopList with write tagop followed by read tagop TagOpList tagopList = new TagOpList(); byte wordCount; ushort[] readData; //Write one word of data to USER memory and read back 8 words from EPC memory using WriteData and ReadData { ushort[] writeData = { 0x9999 }; wordCount = 8; Gen2.WriteData wData = new Gen2.WriteData(Gen2.Bank.USER, 2, writeData); Gen2.ReadData rData = new Gen2.ReadData(Gen2.Bank.EPC, 0, wordCount); //Gen2.WriteTag wTag = new Gen2.WriteTag(epc); // assemble tagops into list tagopList.list.Add(wData); tagopList.list.Add(rData); Console.WriteLine("###################Embedded Read after write######################"); // uncomment the following for embedded read after write. embeddedRead(TagProtocol.GEN2, null, tagopList); // call executeTagOp with list of tagops //readData = (ushort[])r.ExecuteTagOp(tagopList, null); //Console.WriteLine("ReadData: "); //foreach (ushort word in readData) //{ // Console.Write(" {0:X4}", word); //} //Console.WriteLine("\n"); } //clearing the list for next operation tagopList.list.Clear(); //Write 12 bytes(6 words) of EPC and read back 8 words from EPC memory using WriteTag and ReadData { Gen2.TagData epc1 = new Gen2.TagData(new byte[] { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, }); wordCount = 8; Gen2.WriteTag wtag = new Gen2.WriteTag(epc1); Gen2.ReadData rData = new Gen2.ReadData(Gen2.Bank.EPC, 0, wordCount); // assemble tagops into list tagopList.list.Add(wtag); tagopList.list.Add(rData); // call executeTagOp with list of tagops //readData = (ushort[])r.ExecuteTagOp(tagopList, null); //Console.WriteLine("ReadData: "); //foreach (ushort word in readData) //{ // Console.Write(" {0:X4}", word); //} //Console.WriteLine("\n"); } } #endif // Perform read and print UID and tagtype of tag found SimpleReadPlan plan = new SimpleReadPlan(antennaList, TagProtocol.ISO15693, null, null, 1000); r.ParamSet("/reader/read/plan", plan); TagReadData[] tagReads = r.Read(1000); Console.WriteLine("UID: " + tagReads[0].EpcString); Console.WriteLine("TagType: " + (Iso15693.TagType)(tagReads[0].TagType)); MemoryType type; MultiFilter mulfilter = null; UInt32 address; byte length; #if ENABLE_M3E_FILTER //Initialize filter // Filters the tag based on tagtype TagFilter tagTypeFilter = new Select_TagType((UInt64)((Iso15693.TagType)(tagReads[0].TagType))); // Filters the tag based on UID TagFilter uidFilter = new Select_UID(32, ByteFormat.FromHex(tagReads[0].Tag.EpcString.Substring(0, 8))); // Initialize multi filter mulfilter = new MultiFilter(new TagFilter[] { tagTypeFilter, uidFilter }); #endif #if ENABLE_M3E_BLOCK_READ_WRITE //Initialize all the fields required for Read Data Tag operation type = MemoryType.BLOCK_MEMORY; address = 0; length = 1; // Read memory before write ReadMemory bRead = new ReadMemory(type, address, length); byte[] dataRead = (byte[])r.ExecuteTagOp(bRead, mulfilter); // prints the data read Console.WriteLine("Read Data before performing block write: "); foreach (byte i in dataRead) { Console.Write(" {0:X2}", i); } Console.WriteLine("\n"); // Uncomment this to enable Embedded read memory //embeddedRead(TagProtocol.ISO15693, mulfilter, bRead); // Initialize write memory byte[] data = new byte[] { 0x11, 0x22, 0x33, 0x44 }; WriteMemory writeOp = new WriteMemory(type, address, data); // Execute the tagop r.ExecuteTagOp(writeOp, mulfilter); // Uncomment this to enable Embedded write data //embeddedRead(TagProtocol.ISO15693, mulfilter, writeOp); //Read memory after block write ReadMemory readOp = new ReadMemory(type, address, length); byte[] readData = (byte[])r.ExecuteTagOp(readOp, mulfilter); // prints the data read Console.WriteLine("Read Data after performing block write operation: "); foreach (byte i in readData) { Console.Write(" {0:X2}", i); } Console.WriteLine("\n"); #endif #if ENABLE_M3E_SYSTEM_INFORMATION_MEMORY //Get the system information of tag. Address and length fields have no significance if memory type is BLOCK_SYSTEM_INFORMATION_MEMORY. type = MemoryType.BLOCK_SYSTEM_INFORMATION_MEMORY; address = 0; length = 0; ReadMemory sysInfoOp = new ReadMemory(type, address, length); byte[] systemInfo = (byte[])r.ExecuteTagOp(sysInfoOp, mulfilter); // parsing the system info response if (systemInfo.Length > 0) { parseGetSystemInfoResponse(systemInfo); } #endif #if ENABLE_M3E_SECURE_ID // Read secure id of tag. Address and length fields have no significance if memory type is SECURE_ID. type = MemoryType.SECURE_ID; address = 0; length = 0; ReadMemory secureIdOp = new ReadMemory(type, address, length); byte[] rspData = (byte[])r.ExecuteTagOp(secureIdOp, mulfilter); // parse secure id operation response. if (rspData.Length > 0) { parseSecureIdResponse(rspData); } #endif #if ENABLE_M3E_BLOCK_PROTECTION_STATUS // Get the block protection status of block 0. type = MemoryType.BLOCK_PROTECTION_STATUS_MEMORY; address = 0; length = 1; ReadMemory blkProtectionOp = new ReadMemory(type, address, length); byte[] statusData = (byte[])r.ExecuteTagOp(blkProtectionOp, mulfilter); // parse the block protection status response. if (statusData.Length == length) { parseGetBlockProtectionStatusResponse(statusData, address, length); } #endif } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
/// <summary> /// Populate the User memory editors with user data /// </summary> private void PopulateUserData() { try { ReadTagMemory readUserMemory = new ReadTagMemory(objReader, model); // Disable write buttons in ascii and hex representation grpbx btnWriteAscii.IsEnabled = false; btnWrite.IsEnabled = false; // Clear the cached previous ascii data editedAsciiNewString = string.Empty; originalAsciiNewString = string.Empty; lblErrorAddAsciiEdtr.Content = ""; lblErrorAddHexEdtr.Content = ""; if ((bool)rbFirstTagUserMemTb.IsChecked) { antenna = GetSelectedAntennaList()[0]; } objReader.ParamSet("/reader/tagop/antenna", antenna); TagFilter searchSelect = null; if ((bool)rbSelectedTagUserMemTb.IsChecked) { if (lblSelectFilter.Content.ToString().Contains("EPC ID")) { searchSelect = new TagData(currentEPC); } else { int dataLength = 0; byte[] SearchSelectData = ByteFormat.FromHex(txtData.Text); if (null != SearchSelectData) { dataLength = SearchSelectData.Length; } searchSelect = new Gen2.Select(false, selectMemBank, Convert.ToUInt16(startAddress * 16), Convert.ToUInt16(dataLength * 8), SearchSelectData); } } else { searchSelect = new TagData(currentEPC); } //Read USER bank data ushort[] userMemData = null; readUserMemory.ReadTagMemoryData(Gen2.Bank.USER, searchSelect, ref userMemData); byte[] userByteData = null; if (null != userMemData) { userByteData = ByteConv.ConvertFromUshortArray(userMemData); string asciiData = Utilities.HexStringToAsciiString(ByteFormat.ToHex(userByteData, "", "")); // Cache the original ascii string received from the module for further modifications originalAsciiNewString = asciiData; editedAsciiNewString = asciiData; string replacedAsciiData = ReplaceSpecialCharInAsciiData(asciiData.ToCharArray()); txtASCIIData.Text = replacedAsciiData; // Max characters available to edit in ascii editior txtblkSpMAXSizeCharsAvailable.Text = userByteData.Length.ToString(); AsciiDataChanged(); txtASCIIData.ScrollToVerticalOffset(0); // Max bytes available to edit in hex editior txtblkSpMAXSizeHexByteSp64BytesAvailable.Text = userByteData.Length.ToString(); txtASCIIData.IsEnabled = true; txtASCIIData.Foreground = Brushes.Black; txtASCIIData.MaxLength = userByteData.Length; UpdateHexUserMemoryRepresentation(userByteData); } lblErrorAddAsciiEdtr.Content = ""; lblErrorAddHexEdtr.Content = ""; } catch (Exception ex) { if (ex is FAULT_GEN2_PROTOCOL_MEMORY_OVERRUN_BAD_PC_Exception) { lblErrorAddAsciiEdtr.Content = "Error: Read Error"; lblErrorAddHexEdtr.Content = "Error: Read Error"; } else { lblErrorAddAsciiEdtr.Content = "Error: "+ex.Message; lblErrorAddHexEdtr.Content = "Error: " + ex.Message; } lblUserMemoryError.Content = ""; txtblkSpMAXSizeHexByteSp64BytesAvailable.Text = "00"; txtblkSpMAXSizeCharsAvailable.Text = "00"; txtblkRemainingCharsAvailableCount.Text = "00 characters remaining"; txtASCIIData.IsEnabled = false; RemoveGeneratedControl(); } finally { Mouse.SetCursor(Cursors.Arrow); } }
private void PopulateData() { try { Mouse.SetCursor(Cursors.Wait); // Create the object to read tag memory ReadTagMemory readTagMem = new ReadTagMemory(objReader, model); if ((bool)rbFirstTagIns.IsChecked) { antenna = GetSelectedAntennaList()[0]; } objReader.ParamSet("/reader/tagop/antenna", antenna); TagFilter searchSelect = null; if ((bool)rbSelectedTagIns.IsChecked) { if (lblSelectFilter.Content.ToString().Contains("EPC ID")) { searchSelect = new TagData(currentEPC); } else { int dataLength = 0; byte[] SearchSelectData = ByteFormat.FromHex(txtData.Text); if (null != SearchSelectData) { dataLength = SearchSelectData.Length; } searchSelect = new Gen2.Select(false, selectMemBank, Convert.ToUInt16(startAddress * 16), Convert.ToUInt16(dataLength * 8), SearchSelectData); } } else { searchSelect = new TagData(currentEPC); } #region ReadReservedMemory //Read Reserved memory bank data ushort[] reservedData = null; txtKillPassword.Text = ""; txtAcessPassword.Text = ""; txtReservedMemUnusedValue.Text = ""; // Hide additional memory textboxes lblAdditionalReservedMem.Visibility = System.Windows.Visibility.Collapsed; txtReservedMemUnusedValue.Visibility = System.Windows.Visibility.Collapsed; lblAdditionalReservedMemAdd.Visibility = System.Windows.Visibility.Collapsed; try { readTagMem.ReadTagMemoryData(Gen2.Bank.RESERVED, searchSelect, ref reservedData); // Parse the response to get access pwd, kill pwd and if additional memory exists ParseReservedMemData(reservedData); } catch (Exception ex) { // Hide additional memory textboxes lblAdditionalReservedMem.Visibility = System.Windows.Visibility.Collapsed; txtReservedMemUnusedValue.Visibility = System.Windows.Visibility.Collapsed; lblAdditionalReservedMemAdd.Visibility = System.Windows.Visibility.Collapsed; txtReservedMemUnusedValue.Text = ""; // If either of the memory is locked get in or else throw the exception. if ((ex is FAULT_PROTOCOL_BIT_DECODING_FAILED_Exception) || (ex is FAULT_GEN2_PROTOCOL_MEMORY_LOCKED_Exception)) { try { ReadReservedMemData(Gen2.Bank.RESERVED, searchSelect); } catch (Exception e) { txtKillPassword.Text = e.Message; txtAcessPassword.Text = e.Message; } } else if (ex is FAULT_GEN2_PROTOCOL_MEMORY_OVERRUN_BAD_PC_Exception) { txtKillPassword.Text = "Read Error"; txtAcessPassword.Text = "Read Error"; } else { txtKillPassword.Text = ex.Message; txtAcessPassword.Text = ex.Message; } } #endregion ReadReservedMemory #region ReadEPCMemory //Read EPC bank data ushort[] epcData = null; txtPC.Text = ""; txtCRC.Text = ""; txtEPCData.Text = ""; txtEPCValue.Text = ""; txtEPCUnused.Text = ""; txtEPCUnusedValue.Text = ""; txtadditionalMemValue.Text = ""; // Hide additional memory spUnused.Visibility = System.Windows.Visibility.Collapsed; spXPC.Visibility = System.Windows.Visibility.Collapsed; spXPC2.Visibility = System.Windows.Visibility.Collapsed; spAddMemory.Visibility = System.Windows.Visibility.Collapsed; try { readTagMem.ReadTagMemoryData(Gen2.Bank.EPC, searchSelect, ref epcData); ParseEPCMemData(epcData, searchSelect); } catch (Exception ex) { txtEPCData.Text = ex.Message; rbEPCAscii.IsEnabled = false; rbEPCBase36.IsEnabled = false; } #endregion ReadEPCMemory #region ReadTIDMemory //Read TID bank data ushort[] tidData = null; txtClsID.Text = ""; txtVendorID.Text = ""; txtVendorValue.Text = ""; txtModelID.Text = ""; txtModeldIDValue.Text = ""; txtUniqueIDValue.Text = ""; try { readTagMem.ReadTagMemoryData(Gen2.Bank.TID, searchSelect, ref tidData); ParseTIDMemData(tidData); } catch (Exception ex) { if (ex is FAULT_GEN2_PROTOCOL_MEMORY_OVERRUN_BAD_PC_Exception) { txtUniqueIDValue.Text = "Read Error"; } else { txtUniqueIDValue.Text = ex.Message; } } #endregion ReadTIDMemory #region ReadUserMemory //Read USER bank data ushort[] userMemData = null; txtUserDataValue.Text = ""; txtUserMemData.Text = ""; try { readTagMem.ReadTagMemoryData(Gen2.Bank.USER, searchSelect, ref userMemData); ParseUserMemData(userMemData); } catch (Exception ex) { if (ex is FAULT_GEN2_PROTOCOL_MEMORY_OVERRUN_BAD_PC_Exception) { txtUserMemData.Text = "Read Error"; } else { txtUserMemData.Text = ex.Message; } } #endregion ReadUserMemory } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } finally { Mouse.SetCursor(Cursors.Arrow); } }
static void Main(string[] args) { // Program setup if (1 != args.Length) { Console.WriteLine(String.Join("\r\n", new string[] { "Please provide reader URL, such as:", "tmr:///com4", "tmr://my-reader.example.com", })); Environment.Exit(1); } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (Reader r = Reader.Create(args[0])) { //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } else { r.ParamSet("/reader/region/id", supportedRegions[0]); } } DenatranIAVCustomTagOperations denatranIavCustomTagOp = new DenatranIAVCustomTagOperations(); denatranIavCustomTagOp.reader = r; #region Initialsettings //Initial settings //Set BLF 320KHZ Console.WriteLine(String.Format("Get BLF : {0}", r.ParamGet("/reader/gen2/blf"))); Console.WriteLine("Set BLF to 320KHZ"); r.ParamSet("/reader/gen2/blf", Gen2.LinkFrequency.LINK320KHZ); Console.WriteLine(String.Format("Get BLF : {0}", r.ParamGet("/reader/gen2/blf"))); Console.WriteLine(); //Set session Console.WriteLine(String.Format("Get session : {0}", r.ParamGet("/reader/gen2/session"))); Console.WriteLine("Set session"); r.ParamSet("/reader/gen2/session", Gen2.Session.S0); Console.WriteLine(String.Format("Get session : {0}", r.ParamGet("/reader/gen2/session"))); Console.WriteLine(); //Set target Console.WriteLine(String.Format("Get target : {0}", r.ParamGet("/reader/gen2/target"))); Console.WriteLine("Set target"); r.ParamSet("/reader/gen2/target", Gen2.Target.AB); Console.WriteLine(String.Format("Get target : {0}", r.ParamGet("/reader/gen2/target"))); Console.WriteLine(); //Set tari Console.WriteLine(String.Format("Get tari : {0}", r.ParamGet("/reader/gen2/tari"))); Console.WriteLine("Set tari"); r.ParamSet("/reader/gen2/tari", Gen2.Tari.TARI_6_25US); Console.WriteLine(String.Format("Get tari : {0}", r.ParamGet("/reader/gen2/tari"))); Console.WriteLine(); //Set tagencoding Console.WriteLine(String.Format("Get tagencoding : {0}", r.ParamGet("/reader/gen2/tagEncoding"))); Console.WriteLine("Set tagencoding"); r.ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.FM0); Console.WriteLine(String.Format("Get tagencoding : {0}", r.ParamGet("/reader/gen2/tagEncoding"))); Console.WriteLine(); //Set Q Console.WriteLine(String.Format("Get Q : {0}", r.ParamGet("/reader/gen2/q"))); Console.WriteLine("Set Q"); Gen2.StaticQ staticQ = new Gen2.StaticQ(0); r.ParamSet("/reader/gen2/q", staticQ); Console.WriteLine(String.Format("Get Q : {0}", r.ParamGet("/reader/gen2/q"))); Console.WriteLine(); #endregion Initialsettings TagReadData[] tagReads; // Read tagReads = r.Read(500); if (tagReads.Length == 0) { Console.WriteLine("Error : No tags found"); } else { #region Filter initialization //Gen2Select filter Gen2.Select selectfilter = new Gen2.Select(false, Gen2.Bank.EPC, 32, (ushort)(tagReads[0].Epc.Length * 8), ByteFormat.FromHex(tagReads[0].EpcString)); //TagData filter TagFilter tagdataFilter = new TagData(ByteFormat.FromHex(tagReads[0].EpcString)); #endregion Filter initialization #region Tag Operation Initialization byte payload = 0x80; ushort readptr = 0xFFFF; ushort wordAddress = 0xFFFF; ushort word = 0xFFFF; //Read ptr for readsec tagop ushort readSecReadPtr = 0x0000; //Set the tag Identification and writeCredentials Gen2.DenatranIAVWriteCredential writeCredential = new Gen2.DenatranIAVWriteCredential (new byte [] { 0x80, 0x10, 0x00, 0x12, 0x34, 0xAD, 0xBD, 0xC0 }, new byte [] { 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF }); //Set the data and writeCredentials for WriteSec Gen2.DenatranIAVWriteSecCredential writeSecCredential = new Gen2.DenatranIAVWriteSecCredential (new byte[] { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 }, new byte[] { 0x35, 0x49, 0x87, 0xbd, 0xb2, 0xab, 0xd2, 0x7c, 0x2e, 0x34, 0x78, 0x8b, 0xf2, 0xf7, 0x0b, 0xa2 }); //IAVDenatran secure tag operation - ActivateSecureMode denatranIavCustomTagOp.tagOpActivateSecureMode = new Gen2.Denatran.IAV.ActivateSecureMode(payload); //IAVDenatran secure tag operation - AuthenticateOBU denatranIavCustomTagOp.tagOpAuthenticateOBU = new Gen2.Denatran.IAV.AuthenticateOBU(payload); //IAVDenatran secure tag operation - ActivateSiniavMode denatranIavCustomTagOp.tagOpActivateSiniavMode = new Gen2.Denatran.IAV.ActivateSiniavMode(0x81, new byte[] { 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef }); //IAVDenatran secure tag operation - OBUAuthFullPass1 denatranIavCustomTagOp.tagOpOBUAuthFullPass1 = new Gen2.Denatran.IAV.OBUAuthFullPass1(payload); //IAVDenatran secure tag operation - OBUAuthFullPass2 denatranIavCustomTagOp.tagOpOBUAuthFullPass2 = new Gen2.Denatran.IAV.OBUAuthFullPass2(payload); //IAVDenatran secure tag operation - OBUAuthID denatranIavCustomTagOp.tagOpOBUAuthID = new Gen2.Denatran.IAV.OBUAuthID(payload); //IAVDenatran secure tag operation - OBUReadFromMemMap denatranIavCustomTagOp.tagOpOBUReadFromMemMap = new Gen2.Denatran.IAV.OBUReadFromMemMap (payload, readptr); //IAVDenatran secure tag operation - OBUWriteToMemMap denatranIavCustomTagOp.tagOpOBUWriteToMemMap = new Gen2.Denatran.IAV.OBUWriteToMemMap (payload, wordAddress, word, writeCredential); //IAVDenatran secure tag operation - OBUAuthFullPass denatranIavCustomTagOp.tagOpOBUAuthFullPass = new Gen2.Denatran.IAV.OBUAuthFullPass(payload); //IAVDenatran secure tag operation - GetTokenId denatranIavCustomTagOp.tagOpGetTokenId = new Gen2.Denatran.IAV.GetTokenId(); //IAVDenatran secure tag operation - ReadSec denatranIavCustomTagOp.tagOpReadSec = new Gen2.Denatran.IAV.ReadSec (payload, readSecReadPtr); //IAVDenatran secure tag operation - WriteSec denatranIavCustomTagOp.tagOpWriteSec = new Gen2.Denatran.IAV.WriteSec (payload, writeSecCredential); #endregion Tag Operation Initialization #region Standalonetagoperations //Standalone tagop Console.WriteLine("Standalone tagop without filter : "); Console.WriteLine(); denatranIavCustomTagOp.ExecuteTagOpFilter(null); Console.WriteLine("Standalone tagop with tagdata filter : "); Console.WriteLine(); denatranIavCustomTagOp.ExecuteTagOpFilter(tagdataFilter); Console.WriteLine("Standalone tagop with gen2Select filter : "); Console.WriteLine(); denatranIavCustomTagOp.ExecuteTagOpFilter(selectfilter); #endregion Standalonetagoperations #region Embeddedtagoperations //Embedded tagop Console.WriteLine("Embedded tagop without filter and fastsearch : "); Console.WriteLine(); denatranIavCustomTagOp.EmbeddedTagOpFilter(null, false); Console.WriteLine("Embedded tagop with tagdata filter and fastsearch enabled : "); Console.WriteLine(); denatranIavCustomTagOp.EmbeddedTagOpFilter(tagdataFilter, true); Console.WriteLine("Embedded tagop with gen2select filter and fast search enabled : "); Console.WriteLine(); denatranIavCustomTagOp.EmbeddedTagOpFilter(selectfilter, true); #endregion Embeddedtagoperations } } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
static void Main(string[] args) { try { // connect to and initialize reader Reader reader = Common.EstablishReader(); // setup sensor activation commands and filters ensuring On-Chip RSSI Min Filter is applied Gen2.Select tempsensorEnable = Common.CreateGen2Select(4, 4, Gen2.Bank.TID, 0x00, 16, new byte[] { (byte)0xE2, (byte)0x82 }); Gen2.Select ocrssiMinFilter = Common.CreateGen2Select(4, 0, Gen2.Bank.USER, 0xA0, 8, new byte[] { (byte)(0x20 | ocrssiMin - 1) }); Gen2.Select ocrssiMaxFilter = Common.CreateGen2Select(4, 2, Gen2.Bank.USER, 0xA0, 8, new byte[] { ocrssiMax }); MultiFilter selects = new MultiFilter(new Gen2.Select[] { tempsensorEnable, ocrssiMinFilter, ocrssiMaxFilter }); Gen2.ReadData operation; if (moistureMode) { // read parameters for moisture code operation = new Gen2.ReadData(Gen2.Bank.RESERVED, 0xB, (byte)1); } else { // read parameters for on-chip RSSI code operation = new Gen2.ReadData(Gen2.Bank.RESERVED, 0xD, (byte)1); } // create configuration SimpleReadPlan config = new SimpleReadPlan(Common.antennas, TagProtocol.GEN2, selects, operation, 1000); reader.ParamSet("/reader/read/plan", config); for (int i = 1; i <= readAttempts; i++) { Console.WriteLine("Read Attempt #" + i); // attempt to read sensor tags TagReadData[] results = reader.Read(Common.readTime); if (results.Length != 0) { foreach (TagReadData tag in results) { String epc = tag.EpcString; Console.WriteLine("* EPC: " + epc); byte[] dataBytes = tag.Data; short[] dataWords = Common.ConvertByteArrayToShortArray(dataBytes); if (dataWords.Length != 0) { if (moistureMode) { Console.WriteLine(" - Moisture: " + dataWords[0] + " at " + tag.Frequency + " kHz"); } else { Console.WriteLine(" - On-Chip RSSI: " + dataWords[0]); } } } } else { Console.WriteLine("No tag(s) found"); } Console.WriteLine(); } } catch (Exception e) { Console.WriteLine("Error: " + e.ToString()); Environment.Exit(-1); } }
static void Main(string[] args) { bool enableFilter = false; TagFilter filter = null; // Program setup if (1 > args.Length) { Usage(); } for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (r = Reader.Create(args[0])) { //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } if (r.isAntDetectEnabled(antennaList)) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } //Use first antenna for operation if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } if (enableFilter) { // If select filter is to be enabled byte[] mask = new byte[] { (byte)0x30, (byte)0x28, (byte)0x35, (byte)0x4D, (byte)0x82, (byte)0x02, (byte)0x02, (byte)0x80, (byte)0x00, (byte)0x01, (byte)0x04, (byte)0xAC }; filter = new Gen2.Select(false, Gen2.Bank.EPC, 32, 96, mask); } //Get Sensor Data of EM4325 tag bool sendUid = true; bool sendNewSample = true; Gen2.EMMicro.EM4325.GetSensorData getSensorOp = new Gen2.EMMicro.EM4325.GetSensorData(sendUid, sendNewSample); try { Console.WriteLine("****Executing standalone tag operation of Get sensor Data command of EM4325 tag****"); byte[] response = (byte[])r.ExecuteTagOp(getSensorOp, filter); // Parse the response of GetSensorData Console.WriteLine("****Get sensor Data command is success****"); GetSensorDataResponse rData = new GetSensorDataResponse(response); Console.WriteLine(rData.ToString()); } catch (Exception ex) { Console.WriteLine("Exception from executing get Sensor Data command: " + ex.Message); } //Embedded tag operation of Get sensor data try { Console.WriteLine("****Executing embedded tag operation of Get sensor Data command of EM4325 tag****"); embeddedRead(TagProtocol.GEN2, filter, getSensorOp); } catch (Exception ex) { Console.WriteLine("Exception from embedded get sensor data: " + ex.Message); } //Reset alarms command // Read back the temperature control word at 0xEC address to verify reset enable alarm bit is set before executing reset alarm tag op. Console.WriteLine("Reading Temperature control word 1 before resetting alarms to ensure reset enable bit is set to 1"); byte[] filterMask = new byte[] { (byte)0x04, (byte)0xc2 }; Gen2.Select select = new Gen2.Select(false, Gen2.Bank.EPC, 0x70, 16, filterMask); Gen2.ReadData rdata = new Gen2.ReadData(Gen2.Bank.USER, 0xEC, (byte)0x1); ushort[] resp = (ushort[])r.ExecuteTagOp(rdata, select); Console.WriteLine("Temp control word 1: "); foreach (ushort i in resp) { Console.Write(" {0:X4}", i); } Console.WriteLine("\n"); // If temperature control word is not 0x4000, write the data if (resp[0] != 0x4000) { ushort[] writeData = new ushort[] { 0x4000 }; Gen2.WriteData wData = new Gen2.WriteData(Gen2.Bank.USER, 0xEC, writeData); r.ExecuteTagOp(wData, select); } Gen2.EMMicro.EM4325.ResetAlarms resetAlarmsOp = new Gen2.EMMicro.EM4325.ResetAlarms(); try { Console.WriteLine("****Executing standalone tag operation of Reset alarms command of EM4325 tag****"); r.ExecuteTagOp(resetAlarmsOp, filter); Console.WriteLine("****Reset Alarms command is success****"); } catch (Exception ex) { Console.WriteLine("Exception from executing reset alarms : " + ex.Message); } //Embedded tag operation of reset alarms command try { Console.WriteLine("****Executing embedded tag operation of reset alarms command of EM4325 tag****"); embeddedRead(TagProtocol.GEN2, filter, resetAlarmsOp); } catch (Exception ex) { Console.WriteLine("Exception from embedded reset alarms command: " + ex.Message); } } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); Console.Out.Flush(); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (r = Reader.Create(args[0])) { //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } if (r.isAntDetectEnabled(antennaList)) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } // Create a simplereadplan which uses the antenna list created above SimpleReadPlan plan = new SimpleReadPlan(antennaList, TagProtocol.GEN2, null, null, 1000); // Set the created readplan r.ParamSet("/reader/read/plan", plan); //Use first antenna for operation if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } ushort[] Key0 = new ushort[] { 0x0123, 0x4567, 0x89AB, 0xCDEF, 0x0123, 0x4567, 0x89AB, 0xCDEF }; ushort[] Key1 = new ushort[] { 0x1122, 0x3344, 0x5566, 0x7788, 0x1122, 0x3344, 0x5566, 0x7788 }; // Change enable filter to true inorder to enable filter. bool enableFilter = false; Gen2.Select filter = null; if (enableFilter) { filter = new Gen2.Select(false, Gen2.Bank.EPC, 32, 96, new byte[] { 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF }); } bool SendRawData = true; bool _isNMV2DTag = false; byte[] Response; Gen2.NXP.AES.Tam1Authentication tam1Auth; Gen2.NXP.AES.Tam2Authentication tam2Auth; //Uncomment this to enable Authenticate with TAM1 with key0 for NXPUCODE AES tag //tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0, SendRawData); //Gen2.NXP.AES.Authenticate auth = new Gen2.NXP.AES.Authenticate(tam1Auth); //Response = (byte[])r.ExecuteTagOp(auth, filter); //if (SendRawData) //{ // parseTAM1Response(Response, ByteConv.ConvertFromUshortArray(Key0)); //} //else //{ // Console.WriteLine("Generated Ichallenge:" + ByteFormat.ToHex(Response, "", " ")); //} //Uncomment this to enable Authenticate with TAM1 with Key1 //tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, SendRawData); //Gen2.NXP.AES.Authenticate tam1AuthKey1 = new Gen2.NXP.AES.Authenticate(tam1Auth); //Response = (byte[])r.ExecuteTagOp(tam1AuthKey1, filter); //if (SendRawData) //{ // parseTAM1Response(Response, ByteConv.ConvertFromUshortArray(Key1)); //} //else //{ // Console.WriteLine("Generated Ichallenge:" + ByteFormat.ToHex(Response, "", " ")); //} //Uncomment this to enable Authenticate with TAM2 with key1 ushort Offset = 0; ushort BlockCount = 1; //supported protMode value is 1 for NXPUCODE AES ushort ProtMode = 1; tam2Auth = new Gen2.NXP.AES.Tam2Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, Gen2.NXP.AES.Profile.EPC, Offset, BlockCount, ProtMode, SendRawData); Gen2.NXP.AES.Authenticate tam2AuthKey1 = new Gen2.NXP.AES.Authenticate(tam2Auth); Response = (byte[])r.ExecuteTagOp(tam2AuthKey1, filter); if (SendRawData) { parseTAM2Response(Response, ByteConv.ConvertFromUshortArray(Key1), ProtMode); } else { byte[] generatedIChallenge = new byte[10]; byte[] dataRequested = new byte[16]; Array.Copy(Response, 0, generatedIChallenge, 0, 10); Console.WriteLine("Generated Ichallenge:" + ByteFormat.ToHex(generatedIChallenge, "", " ")); Array.Copy(Response, 10, dataRequested, 0, 16); Console.WriteLine("Data :" + ByteFormat.ToHex(dataRequested, "", " ")); } // Embedded tag operations #region EmbeddedTagOperations { //Uncomment this to execute embedded tagop for TAM1 Authentication using Key0 //tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0, SendRawData); //Gen2.NXP.AES.Authenticate embeddedauth = new Gen2.NXP.AES.Authenticate(tam1Auth); //Response = performEmbeddedOperation(filter, embeddedauth); //if (SendRawData) //{ //parseTAM1Response(Response, ByteConv.ConvertFromUshortArray(Key0)); //} //else //{ //Console.WriteLine("Generated Ichallenge:" + ByteFormat.ToHex(Response, "", " ")); //} //Uncomment this to execute embedded tagop for Authenticate with TAM1 using Key1 //tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, SendRawData); //Gen2.NXP.AES.Authenticate embeddedtam1AuthKey1 = new Gen2.NXP.AES.Authenticate(tam1Auth); //Response = performEmbeddedOperation(filter, embeddedtam1AuthKey1); //if (SendRawData) //{ // parseTAM1Response(Response, ByteConv.ConvertFromUshortArray(Key1)); //} //else //{ // Console.WriteLine("Generated Ichallenge:" + ByteFormat.ToHex(Response, "", " ")); //} //Uncomment this to execute embedded tagop for Authenticate with TAM2 with key1 //ushort EmbeddedOffset = 0; //ushort EmbeddedBlockCount = 1; ////supported protMode value is 1 for NXPUCODE AES //ushort EmbeddedProtMode = 1; //tam2Auth = new Gen2.NXP.AES.Tam2Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, Gen2.NXP.AES.Profile.EPC, // EmbeddedOffset, EmbeddedBlockCount, EmbeddedProtMode, SendRawData); //Gen2.NXP.AES.Authenticate embeddedtam2AuthKey1 = new Gen2.NXP.AES.Authenticate(tam2Auth); //Response = performEmbeddedOperation(filter, embeddedtam2AuthKey1); //if (SendRawData) //{ // parseTAM2Response(Response, ByteConv.ConvertFromUshortArray(Key1), EmbeddedProtMode); //} //else //{ // byte[] generatedIChallenge = new byte[10]; // byte[] dataRequested = new byte[16]; // Array.Copy(Response, 0, generatedIChallenge, 0, 10); // Console.WriteLine("Generated Ichallenge:" + ByteFormat.ToHex(generatedIChallenge, "", " ")); // Array.Copy(Response, 10, dataRequested, 0, 16); // Console.WriteLine("Data :" + ByteFormat.ToHex(dataRequested, "", " ")); //} } #endregion EmbeddedTagOperations //Enable flag _isNMV2DTag for TAM1/TAM2 Authentication with KEY0 for NMV2D Tag if (_isNMV2DTag) { // NMV2D tag only supports KEY0 // Uncomment this to enable TAM1 Authentication with KEY0 //ushort[] Key0_NMV2D = new ushort[] { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; //tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0_NMV2D, SendRawData); //Gen2.NXP.AES.Authenticate tam1AuthKey0 = new Gen2.NXP.AES.Authenticate(tam1Auth); //Response = (byte[])r.ExecuteTagOp(tam1AuthKey0, filter); //if (SendRawData) //{ // parseTAM1Response(Response, ByteConv.ConvertFromUshortArray(Key0_NMV2D)); //} //else //{ // Console.WriteLine("Generated Ichallenge:" + ByteFormat.ToHex(Response, "", " ")); //} //TAM2 Authentication with KEY0 //ushort offset = 0; //ushort blockCount = 1; ////supported protMode values are 0x00, 0x01, 0x02, 0x03 //ushort protMode = 0; //tam2Auth = new Gen2.NXP.AES.Tam2Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0_NMV2D, Gen2.NXP.AES.Profile.EPC, // offset, blockCount, protMode, SendRawData); //Gen2.NXP.AES.Authenticate tam2AuthKey0 = new Gen2.NXP.AES.Authenticate(tam2Auth); //Response = (byte[])r.ExecuteTagOp(tam2AuthKey0, filter); //if (SendRawData) //{ // parseTAM2Response(Response, ByteConv.ConvertFromUshortArray(Key0_NMV2D), protMode); //} //else //{ // byte[] generatedIChallenge = new byte[10]; // byte[] dataRequested = new byte[16]; // Array.Copy(Response, 0, generatedIChallenge, 0, 10); // Console.WriteLine("Generated Ichallenge:" + ByteFormat.ToHex(generatedIChallenge, "", " ")); // Array.Copy(Response, 10, dataRequested, 0, 16); // Console.WriteLine("Data :" + ByteFormat.ToHex(dataRequested, "", " ")); // } } } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } TagFilter filter = null; for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (r = Reader.Create(args[0])) { //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } if (r.isAntDetectEnabled(antennaList)) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } //Use first antenna for operation if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } // This select filter matches all Gen2 tags where bits 32-48 of the EPC are 0x0123 #if ENABLE_FILTER filter = new Gen2.Select(false, Gen2.Bank.EPC, 32, 16, new byte[] { 0x01, 0x23 }); #endif //Gen2.TagData epc = new Gen2.TagData(new byte[] { // 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, // 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, //}); //Gen2.WriteTag tagop = new Gen2.WriteTag(epc); //r.ExecuteTagOp(tagop, null); // Reads data from a tag memory bank after writing data to the requested memory bank without powering down of tag #if ENABLE_READ_AFTER_WRITE { //create a tagopList with write tagop followed by read tagop TagOpList tagopList = new TagOpList(); byte wordCount; ushort[] readData; //Write one word of data to USER memory and read back 8 words from EPC memory using WriteData and ReadData { ushort[] writeData = { 0x9999 }; wordCount = 8; Gen2.WriteData wData = new Gen2.WriteData(Gen2.Bank.USER, 2, writeData); Gen2.ReadData rData = new Gen2.ReadData(Gen2.Bank.EPC, 0, wordCount); //Gen2.WriteTag wTag = new Gen2.WriteTag(epc); // assemble tagops into list tagopList.list.Add(wData); tagopList.list.Add(rData); Console.WriteLine("###################Embedded Read after write######################"); // uncomment the following for embedded read after write. embeddedReadAfterWrite(null, tagopList); // call executeTagOp with list of tagops //readData = (ushort[])r.ExecuteTagOp(tagopList, null); //Console.WriteLine("ReadData: "); //foreach (ushort word in readData) //{ // Console.Write(" {0:X4}", word); //} //Console.WriteLine("\n"); } //clearing the list for next operation tagopList.list.Clear(); //Write 12 bytes(6 words) of EPC and read back 8 words from EPC memory using WriteTag and ReadData { Gen2.TagData epc1 = new Gen2.TagData(new byte[] { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, }); wordCount = 8; Gen2.WriteTag wtag = new Gen2.WriteTag(epc1); Gen2.ReadData rData = new Gen2.ReadData(Gen2.Bank.EPC, 0, wordCount); // assemble tagops into list tagopList.list.Add(wtag); tagopList.list.Add(rData); // call executeTagOp with list of tagops //readData = (ushort[])r.ExecuteTagOp(tagopList, null); //Console.WriteLine("ReadData: "); //foreach (ushort word in readData) //{ // Console.Write(" {0:X4}", word); //} //Console.WriteLine("\n"); } } #endif } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
private void ReadtheTags() { try { // Make sure reader is connected ReadMgr.GetReader(); System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); if (btnStartReads.Text == "Start Reads") { Cursor.Current = Cursors.WaitCursor; try { //Check the battery power level if (CoreDLL.GetSystemPowerStatusEx(status, false) == 1) { if (status.BatteryLifePercent <= 5) { if (status.ACLineStatus == 0) { MessageBox.Show("Battery level is low to read tags"); return; } } } properties["isreading"] = "yes"; Utilities.SaveConfigurations(properties); //disable read power coverage tbTXPower.Enabled = false; ReadMgr.GetReader().ParamSet("/reader/transportTimeout", 2000); int powerLevel = Convert.ToInt32(properties["readpower"]); ReadMgr.GetReader().ParamSet("/reader/radio/readPower", powerLevel); Utilities.SwitchRegion(properties["region"]); ReadMgr.GetReader().ParamSet("/reader/antenna/txRxMap", new int[][] { new int[] { 1, 1, 1 } }); ant.Add(1); SimpleReadPlan plan = new SimpleReadPlan(ant.ToArray(), TagProtocol.GEN2); ReadMgr.GetReader().ParamSet("/reader/read/plan", plan); //int readPower = Convert.ToInt32(properties["readpower"].ToString()) * 100; //tbTXPower.Value = (readPower - 1000) / 50; tmrBackLightControl.Enabled = true; miGoToMain.Enabled = false; //set properties ReadMgr.GetReader().ParamSet("/reader/read/asyncOffTime", 50); ReadMgr.GetReader().ParamSet("/reader/powerMode", Reader.PowerMode.FULL); //set the tag population settings ReadMgr.GetReader().ParamSet("/reader/gen2/target", Gen2.Target.A);//default target string tagPopulation = properties["tagpopulation"]; switch (tagPopulation) { case "small": ReadMgr.GetReader().ParamSet("/reader/gen2/q", new Gen2.StaticQ(2)); ReadMgr.GetReader().ParamSet("/reader/gen2/session", Gen2.Session.S0); ReadMgr.GetReader().ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M4); break; case "medium": ReadMgr.GetReader().ParamSet("/reader/gen2/q", new Gen2.StaticQ(4)); ReadMgr.GetReader().ParamSet("/reader/gen2/session", Gen2.Session.S1); ReadMgr.GetReader().ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M4); break; case "large": ReadMgr.GetReader().ParamSet("/reader/gen2/q", new Gen2.StaticQ(6)); ReadMgr.GetReader().ParamSet("/reader/gen2/session", Gen2.Session.S1); ReadMgr.GetReader().ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M2); break; default: break; } if (null != properties) { Utilities.SetReaderSettings(ReadMgr.GetReader(), properties); } else { MessageBox.Show("properties are null"); } //set the read plan and filter TagFilter filter; int addressToRead = int.Parse(properties["selectionaddress"]); Gen2.Bank bank = Gen2.Bank.EPC; switch (properties["tagselection"].ToLower()) { case "None": case "epc": bank = Gen2.Bank.EPC; break; case "tid": bank = Gen2.Bank.TID; break; case "user": bank = Gen2.Bank.USER; break; case "reserved": bank = Gen2.Bank.RESERVED; break; default: break; } if ("yes" == properties["ismaskselected"]) { filter = new Gen2.Select(true, bank, (uint)addressToRead * 8, (ushort)(properties["selectionmask"].Length * 4), ByteFormat.FromHex(properties["selectionmask"])); } else { filter = new Gen2.Select(false, bank, (uint)addressToRead * 8, (ushort)(properties["selectionmask"].Length * 4), ByteFormat.FromHex(properties["selectionmask"])); } SimpleReadPlan srp; if (properties["tagselection"].ToLower() == "none") { srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, null, 0); } else { srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, filter, 0); } ReadMgr.GetReader().ParamSet("/reader/read/plan", srp); btnStartReads.Text = "Stop Reads"; setStatus("Reading", System.Drawing.Color.DarkGoldenrod); ReadMgr.GetReader().ReadException += ReadException; ReadMgr.GetReader().TagRead += PrintTagRead; ReadMgr.GetReader().StartReading(); if (properties["audiblealert"].ToLower() == "yes") { if (readTriggeredByTap) { playStartSound(); } } } catch (Exception ex) { logger.Error(ex.ToString()); tbTXPower.Enabled = true; //MessageBox.Show("Error connecting to reader: " + ex.Message.ToString(), "Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); btnStartReads.Text = "Start Reads"; setStatus(Status.IDLE); ReadMgr.GetReader().ParamSet("/reader/powerMode", Reader.PowerMode.MAXSAVE); miGoToMain.Enabled = true; tmrBackLightControl.Enabled = false; properties["isreading"] = "no"; Utilities.SaveConfigurations(properties); throw ex; } finally { Cursor.Current = Cursors.Default; } } else if (btnStartReads.Text == "Stop Reads") { logger.Debug("Stop Reads pressed: Calling StopReads from ReadtheTags"); StopReads(); logger.Debug("Stop Reads pressed: Called StopReads from ReadtheTags"); } } catch (Exception ex) { logger.Error(ex.ToString()); if (-1 != ex.Message.IndexOf("RFID reader was not found")) { MessageBox.Show(ex.Message, "Error"); } else { btnStartReads.Text = "Start Reads"; setStatus(Status.IDLE); properties["isreading"] = "no"; Utilities.SaveConfigurations(properties); throw ex; } } }
// TODO: Merge common functionality between KeyboardWedgeRead and ReadTags.ReadtheTags private void KeyboardWedgeRead() { List <SendInputWrapper.INPUT> inputList = new List <SendInputWrapper.INPUT>(); string startIndicator = "."; // Signal start of read inputList.Clear(); AddKeypresses(inputList, startIndicator); SendInput(inputList); properties = Utilities.GetProperties(); SoundPlayer startSound = new SoundPlayer(properties["startscanwavefile"]); if (properties["audiblealert"].ToLower() == "yes") { startSound.Play(); } SoundPlayer stopSound = new SoundPlayer(properties["endscanwavefile"]); stopSound.LoadAsync(); CoreDLL.SYSTEM_POWER_STATUS_EX status = new CoreDLL.SYSTEM_POWER_STATUS_EX(); //Check the battery power level if (CoreDLL.GetSystemPowerStatusEx(status, false) == 1) { if (status.BatteryLifePercent <= 5) { if (status.ACLineStatus == 0) { MessageBox.Show("Battery level is low to read tags"); return; } } } try { TagReadData[] reads; //Utilities.PowerManager.PowerNotify += new PowerManager.PowerEventHandler(PowerManager_PowerNotify); using (ThingMagic.RFIDSearchLight.ReadMgr.Session rsess = ThingMagic.RFIDSearchLight.ReadMgr.GetSession()) { #if DEBUG if (properties["audiblealert"].ToLower() == "yes") { startSound.Play(); } #endif int radioPower = 0; if (properties["readpower"].ToString() == "") { radioPower = 2300;//While reading read power should be max } else { radioPower = Convert.ToInt32(properties["readpower"].ToString()); } //Set the region string region = properties["region"]; try { Utilities.SwitchRegion(region); } catch (ArgumentException) { MessageBox.Show( "Unknown Region: " + region + "\r\n" + "Please run RFIDSearchLight to initialize the region." ); } rsess.Reader.ParamSet("/reader/powerMode", Reader.PowerMode.FULL); rsess.Reader.ParamSet("/reader/radio/readPower", radioPower); rsess.Reader.ParamSet("/reader/antenna/txRxMap", new int[][] { new int[] { 1, 1, 1 } }); List <int> ant = new List <int>(); ant.Add(1); //set the tag population settings rsess.Reader.ParamSet("/reader/gen2/target", Gen2.Target.A);//default target string tagPopulation = properties["tagpopulation"]; switch (tagPopulation) { case "small": rsess.Reader.ParamSet("/reader/gen2/q", new Gen2.StaticQ(2)); rsess.Reader.ParamSet("/reader/gen2/session", Gen2.Session.S0); rsess.Reader.ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M4); break; case "medium": rsess.Reader.ParamSet("/reader/gen2/q", new Gen2.StaticQ(4)); rsess.Reader.ParamSet("/reader/gen2/session", Gen2.Session.S1); rsess.Reader.ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M4); break; case "large": rsess.Reader.ParamSet("/reader/gen2/q", new Gen2.StaticQ(6)); rsess.Reader.ParamSet("/reader/gen2/session", Gen2.Session.S2); rsess.Reader.ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M2); break; default: break; } //set the read plan and filter TagFilter filter; int addressToRead = int.Parse(properties["selectionaddress"]); Gen2.Bank bank = Gen2.Bank.EPC; switch (properties["tagselection"].ToLower()) { case "None": case "epc": bank = Gen2.Bank.EPC; break; case "tid": bank = Gen2.Bank.TID; break; case "user": bank = Gen2.Bank.USER; break; case "reserved": bank = Gen2.Bank.RESERVED; break; default: break; } if ("yes" == properties["ismaskselected"]) { filter = new Gen2.Select(true, bank, (uint)addressToRead * 8, (ushort)(properties["selectionmask"].Length * 4), ByteFormat.FromHex(properties["selectionmask"])); } else { filter = new Gen2.Select(false, bank, (uint)addressToRead * 8, (ushort)(properties["selectionmask"].Length * 4), ByteFormat.FromHex(properties["selectionmask"])); } //set the read plan SimpleReadPlan srp; if (properties["tagselection"].ToLower() == "none") { srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, null, 0); } else { srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, filter, 0); } rsess.Reader.ParamSet("/reader/read/plan", srp); double readDuration = Convert.ToDouble(properties["scanduration"].ToString()) * 1000; int readTimeout = Convert.ToInt32(readDuration); //Do a sync read for the readduration #if DEBUG if (properties["audiblealert"].ToLower() == "yes") { startSound.Play(); } #endif reads = rsess.Reader.Read(readTimeout); rsess.Reader.ParamSet("/reader/powerMode", Reader.PowerMode.MINSAVE); if (properties["audiblealert"].ToLower() == "yes") { stopSound.Play(); } // Clear start indicator inputList.Clear(); for (int i = 0; i < startIndicator.Length; i++) { AddKeypresses(inputList, new byte[] { // Don't send Backspace -- that's one of our hotkeys, // so it'll put us in an infinite loop. (byte)Keys.Left, (byte)Keys.Delete, }); } SendInput(inputList); } inputList.Clear(); //HideWindow(); bool timestamp = false, rssi = false, position = false; string[] metadata = properties["metadatatodisplay"].Split(','); //Metadata boolean variables foreach (string mdata in metadata) { switch (mdata.ToLower()) { case "timestamp": timestamp = true; break; case "rssi": rssi = true; break; case "position": position = true; break; default: break; } } string metadataseparator = properties["metadataseparator"]; byte metadataseparatorInByte = 0x00; switch (metadataseparator.ToLower()) { //The byte representation of special characters can be found here - http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx case "comma": metadataseparatorInByte = 0xBC; break; case "space": metadataseparatorInByte = 0x20; break; case "enter": metadataseparatorInByte = 0x0D; break; case "tab": metadataseparatorInByte = 0x09; break; default: break; } //Print the epc in caps AddKeypress(inputList, (byte)Keys.Capital); // Toggle Caps Lock //Print the tag reads foreach (TagReadData dat in reads) { string tagData = string.Empty; string epc = string.Empty; if (properties["displayformat"] == "base36") { epc = ConvertEPC.ConvertHexToBase36(dat.EpcString); } else { epc = dat.EpcString; } AddKeypresses(inputList, properties["prefix"].ToUpper()); AddKeypresses(inputList, epc.ToUpper()); AddKeypresses(inputList, properties["suffix"].ToUpper()); if (timestamp) { AddKeypress(inputList, metadataseparatorInByte); AddKeypresses(inputList, dat.Time.ToString("yyyy-MM-dd-HH-mm-ss")); } if (rssi) { AddKeypress(inputList, metadataseparatorInByte); AddKeypresses(inputList, dat.Rssi.ToString()); } if (position) { AddKeypress(inputList, metadataseparatorInByte); AddKeypresses(inputList, GpsMgr.LatLonString); } switch (properties["multipletagseparator"].ToLower()) { case "comma": AddKeypress(inputList, 0xBC); break; case "space": AddKeypress(inputList, 0x20); break; case "enter": AddKeypress(inputList, 0x0D); break; case "tab": AddKeypress(inputList, 0x09); break; case "pipe": AddInput(inputList, SHIFT_DOWN); AddKeypress(inputList, 0xDC); AddInput(inputList, SHIFT_UP); break; default: break; } // Send keystrokes after each tag read record -- input buffer // isn't big enough to hold more than a few lines SendInput(inputList); inputList.Clear(); } //Turn caps lock back off AddKeypress(inputList, (byte)Keys.Capital); // Toggle Caps Lock SendInput(inputList); } catch (Exception ex) { logger.Error("In KeyboardWedgeRead(): " + ex.ToString()); //MessageBox.Show(ex.Message); //Debug.Log(ex.ToString()); } }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (r = Reader.Create(args[0])) { //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } if (r.isAntDetectEnabled(antennaList)) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } // Create a simplereadplan which uses the antenna list created above SimpleReadPlan plan = new SimpleReadPlan(antennaList, TagProtocol.GEN2, null, null, 1000); // Set the created readplan r.ParamSet("/reader/read/plan", plan); //Use first antenna for operation if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } // Set the session to S0 r.ParamSet("/reader/gen2/session", Gen2.Session.S0); ushort[] Key0 = new ushort[] { 0x0123, 0x4567, 0x89AB, 0xCDEF, 0x0123, 0x4567, 0x89AB, 0xCDEF }; ushort[] Key1 = new ushort[] { 0x1122, 0x3344, 0x5566, 0x7788, 0x1122, 0x3344, 0x5566, 0x7788 }; // Change enable filter to true inorder to enable filter. bool enableFilter = false; Gen2.Select filter = null; if (enableFilter) { filter = new Gen2.Select(false, Gen2.Bank.EPC, 32, 96, new byte[] { 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF }); } int EpcLength; Gen2.Password accesspassword; bool SendRawData = false; Gen2.NXP.AES.Tam1Authentication auth; // Read tag epc before performing untraceable action ReadTags(r); // Untraceable with TAM1 using Key0 EpcLength = 4; //words auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0, SendRawData); Gen2.Untraceable UntraceWithTam1WithKey0 = new Gen2.NXP.AES.Untraceable(Gen2.Untraceable.EPC.HIDE, EpcLength, Gen2.Untraceable.TID.HIDE_NONE, Gen2.Untraceable.UserMemory.SHOW, Gen2.Untraceable.Range.NORMAL, auth); r.ExecuteTagOp(UntraceWithTam1WithKey0, filter); ReadTags(r); //Uncomment this to enable untraceable with TAM2 using Key1 //EpcLength = 6; //words //auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, SendRawData); //accesspassword = new Gen2.Password(0x00000000); //r.ParamSet("/reader/gen2/accessPassword", accesspassword); //Gen2.Untraceable UntraceWithTam1WithKey1 = new Gen2.NXP.AES.Untraceable(Gen2.Untraceable.EPC.HIDE, EpcLength, // Gen2.Untraceable.TID.HIDE_NONE, Gen2.Untraceable.UserMemory.SHOW, Gen2.Untraceable.Range.NORMAL, auth); //r.ExecuteTagOp(UntraceWithTam1WithKey1, filter); //ReadTags(r); //Uncomment this to enable untraceable with Access //EpcLength = 3; //accesspassword = new Gen2.Password(0x00000001); //r.ParamSet("/reader/gen2/accessPassword", accesspassword); //Gen2.Untraceable UntraceWithAccess = new Gen2.NXP.AES.Untraceable(Gen2.Untraceable.EPC.HIDE, EpcLength, // Gen2.Untraceable.TID.HIDE_NONE, Gen2.Untraceable.UserMemory.SHOW, Gen2.Untraceable.Range.NORMAL, accesspassword.Value); //r.ExecuteTagOp(UntraceWithAccess, filter); //ReadTags(r); #region EmbeddedTagOperations { // Uncomment this to execute Untraceable with TAM1 using Key0 //EpcLength = 4; //words //auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0, SendRawData); //Gen2.Untraceable embeddedUntraceWithTam1WithKey0 = new Gen2.NXP.AES.Untraceable(Gen2.Untraceable.EPC.HIDE, EpcLength, // Gen2.Untraceable.TID.HIDE_NONE, Gen2.Untraceable.UserMemory.SHOW, Gen2.Untraceable.Range.NORMAL, auth); //performEmbeddedOperation(filter, embeddedUntraceWithTam1WithKey0); //ReadTags(r); //Uncomment this to execute untraceable with TAM2 using Key1 //EpcLength = 6; //words //auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, SendRawData); //Gen2.Untraceable EmbeddedUntraceWithTam1WithKey1 = new Gen2.NXP.AES.Untraceable(Gen2.Untraceable.EPC.HIDE, EpcLength, // Gen2.Untraceable.TID.HIDE_NONE, Gen2.Untraceable.UserMemory.SHOW, Gen2.Untraceable.Range.NORMAL, auth); //performEmbeddedOperation(filter, EmbeddedUntraceWithTam1WithKey1); //ReadTags(r); //Uncomment this to execute untraceable with Access //EpcLength = 3; //accesspassword = new Gen2.Password(0x00000000); //Gen2.Untraceable EmbeddedUntraceWithAccess = new Gen2.NXP.AES.Untraceable(Gen2.Untraceable.EPC.HIDE, EpcLength, // Gen2.Untraceable.TID.HIDE_NONE, Gen2.Untraceable.UserMemory.SHOW, Gen2.Untraceable.Range.NORMAL, accesspassword.Value); //performEmbeddedOperation(filter, EmbeddedUntraceWithAccess); //ReadTags(r); } #endregion EmbeddedTagOperations } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (Reader r = Reader.Create(args[0])) { //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } if (r.isAntDetectEnabled(antennaList)) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } // Create a simplereadplan which uses the antenna list created above SimpleReadPlan plan = new SimpleReadPlan(antennaList, TagProtocol.GEN2, null, null, 1000); // Set the created readplan r.ParamSet("/reader/read/plan", plan); //Use first antenna for operation if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } DenatranIAVCustomTagOperations denatranIavCustomTagOp = new DenatranIAVCustomTagOperations(); denatranIavCustomTagOp.reader = r; #region EnablingGEN2DenatranIAVTagOps // Serial reader condition is bypassed to add support for Network readers. Console.WriteLine(String.Format("Get Protocol Extension : {0}", r.ParamGet("/reader/gen2/protocolExtension"))); Console.WriteLine(); #endregion #region Initialsettings //Initial settings //Set tagencoding Console.WriteLine(String.Format("Get tagencoding : {0}", r.ParamGet("/reader/gen2/tagEncoding"))); Console.WriteLine("Set tagencoding"); r.ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.FM0); Console.WriteLine(String.Format("Get tagencoding : {0}", r.ParamGet("/reader/gen2/tagEncoding"))); Console.WriteLine(); //Set BLF 320KHZ Console.WriteLine(String.Format("Get BLF : {0}", r.ParamGet("/reader/gen2/blf"))); Console.WriteLine("Set BLF to 320KHZ"); r.ParamSet("/reader/gen2/blf", Gen2.LinkFrequency.LINK320KHZ); Console.WriteLine(String.Format("Get BLF : {0}", r.ParamGet("/reader/gen2/blf"))); Console.WriteLine(); //Set tari Console.WriteLine(String.Format("Get tari : {0}", r.ParamGet("/reader/gen2/tari"))); Console.WriteLine("Set tari"); r.ParamSet("/reader/gen2/tari", Gen2.Tari.TARI_6_25US); Console.WriteLine(String.Format("Get tari : {0}", r.ParamGet("/reader/gen2/tari"))); Console.WriteLine(); //Set session Console.WriteLine(String.Format("Get session : {0}", r.ParamGet("/reader/gen2/session"))); Console.WriteLine("Set session"); r.ParamSet("/reader/gen2/session", Gen2.Session.S0); Console.WriteLine(String.Format("Get session : {0}", r.ParamGet("/reader/gen2/session"))); Console.WriteLine(); //Set target Console.WriteLine(String.Format("Get target : {0}", r.ParamGet("/reader/gen2/target"))); Console.WriteLine("Set target"); r.ParamSet("/reader/gen2/target", Gen2.Target.AB); Console.WriteLine(String.Format("Get target : {0}", r.ParamGet("/reader/gen2/target"))); Console.WriteLine(); //Set Q Console.WriteLine(String.Format("Get Q : {0}", r.ParamGet("/reader/gen2/q"))); Console.WriteLine("Set Q"); Gen2.StaticQ staticQ = new Gen2.StaticQ(0); r.ParamSet("/reader/gen2/q", staticQ); Console.WriteLine(String.Format("Get Q : {0}", r.ParamGet("/reader/gen2/q"))); Console.WriteLine(); #endregion Initialsettings TagReadData[] tagReads; // Read tagReads = r.Read(500); if (tagReads.Length == 0) { Console.WriteLine("Error : No tags found"); } else { #region Filter initialization //Gen2Select filter Gen2.Select selectfilter = new Gen2.Select(false, Gen2.Bank.EPC, 32, (ushort)(tagReads[0].Epc.Length * 8), ByteFormat.FromHex(tagReads[0].EpcString)); //TagData filter TagFilter tagdataFilter = new TagData(ByteFormat.FromHex(tagReads[0].EpcString)); #endregion Filter initialization #region Tag Operation Initialization byte payload = 0x80; byte OBUAuthID = 0x00; byte OBUAuthFullPass = 0x01; byte OBUAuthFullPass1 = 0x02; ushort readptr = 0xFFFF; ushort wordAddress = 0xFFFF; ushort word = 0xFFFF; //Read ptr for readsec tagop ushort readSecReadPtr = 0x0000; //Set the tag Identification and writeCredentials Gen2.DenatranIAVWriteCredential writeCredential = new Gen2.DenatranIAVWriteCredential (new byte [] { 0x80, 0x10, 0x00, 0x12, 0x34, 0xAD, 0xBD, 0xC0 }, new byte [] { 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF }); //Set the data and writeCredentials for WriteSec Gen2.DenatranIAVWriteSecCredential writeSecCredential = new Gen2.DenatranIAVWriteSecCredential (new byte[] { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 }, new byte[] { 0x35, 0x49, 0x87, 0xbd, 0xb2, 0xab, 0xd2, 0x7c, 0x2e, 0x34, 0x78, 0x8b, 0xf2, 0xf7, 0x0b, 0xa2 }); //IAVDenatran secure tag operation - ActivateSecureMode denatranIavCustomTagOp.tagOpActivateSecureMode = new Gen2.Denatran.IAV.ActivateSecureMode(payload); //IAVDenatran secure tag operation - AuthenticateOBU denatranIavCustomTagOp.tagOpAuthenticateOBU = new Gen2.Denatran.IAV.AuthenticateOBU(payload); //IAVDenatran secure tag operation - ActivateSiniavMode denatranIavCustomTagOp.tagOpActivateSiniavMode = new Gen2.Denatran.IAV.ActivateSiniavMode(0x81, new byte[] { 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef }); //IAVDenatran secure tag operation - OBUAuthFullPass1 denatranIavCustomTagOp.tagOpOBUAuthFullPass1 = new Gen2.Denatran.IAV.OBUAuthFullPass1(payload); //IAVDenatran secure tag operation - OBUAuthFullPass2 denatranIavCustomTagOp.tagOpOBUAuthFullPass2 = new Gen2.Denatran.IAV.OBUAuthFullPass2(payload); //IAVDenatran secure tag operation - OBUAuthID denatranIavCustomTagOp.tagOpOBUAuthID = new Gen2.Denatran.IAV.OBUAuthID(payload); //IAVDenatran secure tag operation - OBUReadFromMemMap denatranIavCustomTagOp.tagOpOBUReadFromMemMap = new Gen2.Denatran.IAV.OBUReadFromMemMap (payload, readptr); //IAVDenatran secure tag operation - OBUWriteToMemMap denatranIavCustomTagOp.tagOpOBUWriteToMemMap = new Gen2.Denatran.IAV.OBUWriteToMemMap (payload, wordAddress, word, writeCredential); //IAVDenatran secure tag operation - OBUAuthFullPass denatranIavCustomTagOp.tagOpOBUAuthFullPass = new Gen2.Denatran.IAV.OBUAuthFullPass(payload); //IAVDenatran secure tag operation - GetTokenId denatranIavCustomTagOp.tagOpGetTokenId = new Gen2.Denatran.IAV.GetTokenId(); //IAVDenatran secure tag operation - ReadSec denatranIavCustomTagOp.tagOpReadSec = new Gen2.Denatran.IAV.ReadSec (payload, readSecReadPtr); //IAVDenatran secure tag operation - WriteSec denatranIavCustomTagOp.tagOpWriteSec = new Gen2.Denatran.IAV.WriteSec (payload, writeSecCredential); // For G0 Tag denatranIavCustomTagOp.tagOpG0PAOBUAuth = new Gen2.Denatran.IAV.G0PAOBUAuth((byte)(payload | OBUAuthID)); denatranIavCustomTagOp.tagOpG0PAOBUAuthFullPass = new Gen2.Denatran.IAV.G0PAOBUAuth((byte)(payload | OBUAuthFullPass)); denatranIavCustomTagOp.tagOpG0PAOBUAuthFullPass1 = new Gen2.Denatran.IAV.G0PAOBUAuth((byte)(payload | OBUAuthFullPass1)); //Uncomment this for PA tag //denatranIavCustomTagOp.tagOpG0PAOBUAuth = new Gen2.Denatran.IAV.G0PAOBUAuth(payload); #endregion Tag Operation Initialization #region Standalonetagoperations //Standalone tagop Console.WriteLine("Standalone tagop without filter : "); Console.WriteLine(); denatranIavCustomTagOp.ExecuteTagOpFilter(null); Console.WriteLine("Standalone tagop with tagdata filter : "); Console.WriteLine(); denatranIavCustomTagOp.ExecuteTagOpFilter(tagdataFilter); Console.WriteLine("Standalone tagop with gen2Select filter : "); Console.WriteLine(); denatranIavCustomTagOp.ExecuteTagOpFilter(selectfilter); #endregion Standalonetagoperations #region Embeddedtagoperations //Embedded tagop Console.WriteLine("Embedded tagop without filter and fastsearch : "); Console.WriteLine(); denatranIavCustomTagOp.EmbeddedTagOpFilter(null, false); Console.WriteLine("Embedded tagop with tagdata filter and fastsearch enabled : "); Console.WriteLine(); denatranIavCustomTagOp.EmbeddedTagOpFilter(tagdataFilter, true); Console.WriteLine("Embedded tagop with gen2select filter and fast search enabled : "); Console.WriteLine(); denatranIavCustomTagOp.EmbeddedTagOpFilter(selectfilter, true); #endregion Embeddedtagoperations } } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } int[] antennaList = null; for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } // Create Reader object, connecting to physical device try { Reader r; TagReadData[] filteredTagReads; r = Reader.Create(args[0]); //Uncomment this line to add default transport listener. r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } if (r.isAntDetectEnabled(antennaList)) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } ////To perform standalone operations if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } try { Gen2.Select tidFilter = new Gen2.Select(false, Gen2.Bank.TID, 32, 16, new byte[] { (byte)0x01, (byte)0x2E }); tidFilter.target = Gen2.Select.Target.Inventoried_S1; tidFilter.action = Gen2.Select.Action.ON_N_OFF; Gen2.Select epcFilter = new Gen2.Select(false, Gen2.Bank.EPC, 32, 16, new byte[] { (byte)0x11, (byte)0x22 }); epcFilter.target = Gen2.Select.Target.Inventoried_S1; epcFilter.action = Gen2.Select.Action.NEG_N_NOP; CustomAntConfigPerAntenna sig = new CustomAntConfigPerAntenna(Gen2.Session.S1, Gen2.Target.A, tidFilter, 1); CustomAntConfigPerAntenna sig2 = new CustomAntConfigPerAntenna(Gen2.Session.S1, Gen2.Target.A, epcFilter, 2); List <CustomAntConfigPerAntenna> CustomConfigAnt = new List <CustomAntConfigPerAntenna>(); CustomConfigAnt.Add(sig); CustomConfigAnt.Add(sig2); //parameters in the CustomAntConfig //1. No. of antennas //2. List of CustomAntConfigPerAntenna //3. Fast search enabled / disabled //4. Dynamic - 1(default)/ Equal //5. Tagreadtimeout CustomAntConfig cnf = new CustomAntConfig(2, CustomConfigAnt, false, 1, 50000); SimpleReadPlan srp = new SimpleReadPlan(antennaList, TagProtocol.GEN2, null, cnf); r.ParamSet("/reader/read/plan", srp); ////Sync Read //// //filteredTagReads = r.Read(5000); //foreach (TagReadData tr in filteredTagReads) // Console.WriteLine(tr.ToString()); //Console.WriteLine(); ////Async read r.TagRead += delegate(Object sender, TagReadDataEventArgs e) { Console.WriteLine("Background read: " + e.TagReadData); }; // Create and add read exception listener r.ReadException += new EventHandler <ReaderExceptionEventArgs>(r_ReadException); // Search for tags in the background r.StartReading(); Console.WriteLine("\r\n<Do other work here>\r\n"); Thread.Sleep(500); r.StopReading(); } finally { } // Shut down reader r.Destroy(); } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
private void btnWrite_Click(object sender, RoutedEventArgs e) { try { Mouse.SetCursor(Cursors.Wait); if ((bool)rbFirstTagUserMemTb.IsChecked) { antenna = ((null != GetSelectedAntennaList()) ? ( GetSelectedAntennaList()[0]) : antenna); } objReader.ParamSet("/reader/tagop/antenna", antenna); if ((bool)rbSelectedTagUserMemTb.IsChecked) { TagFilter searchSelect = null; if (selectMemBank == Gen2.Bank.EPC) { searchSelect = new TagData(txtEpc.Text); } else { byte[] SearchSelectData = ByteFormat.FromHex(txtData.Text); if (null == SearchSelectData) { dataLength = 0; } else { dataLength = SearchSelectData.Length; } searchSelect = new Gen2.Select(false, selectMemBank, Convert.ToUInt16(startAddress * 16), Convert.ToUInt16(dataLength * 8), SearchSelectData); } WriteUserMem(searchSelect); } else { WriteUserMem(null); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } finally { Mouse.SetCursor(Cursors.Arrow); } }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } int[] antennaList = null; for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } // Create Reader object, connecting to physical device try { Reader r; TagReadData[] tagReads, filteredTagReads; TagFilter filter; r = Reader.Create(args[0]); //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } if (r.isAntDetectEnabled(antennaList)) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } // In the current system, sequences of Gen2 operations require Session 0, // since each operation resingulates the tag. In other sessions, // the tag will still be "asleep" from the preceding singulation. Gen2.Session oldSession = (Gen2.Session)r.ParamGet("/reader/gen2/session"); Gen2.Session newSession = Gen2.Session.S0; Console.WriteLine("Changing to Session " + newSession + " (from Session " + oldSession + ")"); r.ParamSet("/reader/gen2/session", newSession); Console.WriteLine(); SimpleReadPlan srp = new SimpleReadPlan(antennaList, TagProtocol.GEN2); r.ParamSet("/reader/read/plan", srp); //To perform standalone operations if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } try { Console.WriteLine("Unfiltered Read:"); // Read the tags in the field tagReads = r.Read(500); foreach (TagReadData tr in tagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); if (0 == tagReads.Length) { Console.WriteLine("No tags found."); } else { // A TagData object may be used as a filter, for example to // perform a tag data operation on a particular tag. Console.WriteLine("Filtered Tagop:"); // Read kill password of tag found in previous operation filter = tagReads[0].Tag; Console.WriteLine("Read kill password of tag {0}", filter); Gen2.ReadData tagop = new Gen2.ReadData(Gen2.Bank.RESERVED, 0, 2); try { ushort[] data = (ushort[])r.ExecuteTagOp(tagop, filter); foreach (ushort word in data) { Console.Write("{0:X4}", word); } Console.WriteLine(); } catch (ReaderException ex) { Console.WriteLine("Can't read tag: {0}", ex.Message); } Console.WriteLine(); // Filter objects that apply to multiple tags are most useful in // narrowing the set of tags that will be read. This is // performed by setting a read plan that contains a filter. // A TagData with a short EPC will filter for tags whose EPC // starts with the same sequence. filter = new TagData(tagReads[0].Tag.EpcString.Substring(0, 4)); Console.WriteLine("EPCs that begin with {0}:", filter); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); // A filter can also be an full Gen2 Select operation. For // example, this filter matches all Gen2 tags where bits 8-19 of // the TID are 0x003 (that is, tags manufactured by Alien // Technology). // In case of Network readers, ensure that bitLength is a multiple of 8. Console.WriteLine("Tags with Alien Technology TID"); filter = new Gen2.Select(false, Gen2.Bank.TID, 8, 12, new byte[] { 0, 0x30 }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); if (r is SerialReader) { // A filter can also be Gen2 Truncate Select operation. // Truncate indicates whether a Tag’s backscattered reply shall be truncated to those EPC bits that follow Mask. // For example, truncated select starting with PC word start address and length of 16 bits // In case of Network readers, ensure that bitLength is a multiple of 8. Console.WriteLine("GEN2 Select Truncate Operation"); filter = new Gen2.Select(false, Gen2.Bank.GEN2EPCTRUNCATE, 16, 40, new byte[] { 0x30, 0x00, 0xDE, 0xAD, 0xCA }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); // A filter can also perform Gen2 Tag Filtering. // Major advantage of this feature is to limit the EPC response to user specified length field and all others will be rejected by firmware. // invert, bitPointer, mask : Parameters will be ignored when TMR_GEN2_EPC_LENGTH_FILTER is used // maskBitLength : Specified EPC Length used for filtering // For example, Tag filtering will be applied on EPC with 128 bits length, rest of the tags will be ignored // In case of Network readers, ensure that bitLength is a multiple of 8. Console.WriteLine("GEN2 Tag Filter Based on EPC Length"); filter = new Gen2.Select(false, Gen2.Bank.GEN2EPCLENGTHFILTER, 16, 128, new byte[] { 0x30, 0x00 }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); } // Gen2 Select may also be inverted, to give all non-matching tags // In case of Network readers, ensure that bitLength is a multiple of 8. Console.WriteLine("Tags without Alien Technology TID"); filter = new Gen2.Select(true, Gen2.Bank.TID, 8, 12, new byte[] { 0, 0x30 }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); // Filters can also be used to match tags that have already been // read. This form can only match on the EPC, as that's the only // data from the tag's memory that is contained in a TagData // object. // Note that this filter has invert=true. This filter will match // tags whose bits do not match the selection mask. // Also note the offset - the EPC code starts at bit 32 of the // EPC memory bank, after the StoredCRC and StoredPC. // In case of Network readers, ensure that bitLength is a multiple of 8. filter = new Gen2.Select(true, Gen2.Bank.EPC, 32, 2, new byte[] { (byte)0xC0 }); Console.WriteLine("EPCs with first 2 bits equal to zero (post-filtered):"); foreach (TagReadData tr in tagReads) // unfiltered tag reads from the first example { if (filter.Matches(tr.Tag)) { Console.WriteLine(tr.ToString()); } } Console.WriteLine(); /** * Multi filter creation and initialization. This filter will match those tags whose bits matches the * selection mask of both tidFilter(tags manufactured by Alien Technology) and epcFilter(epc of first * tag read from tagReads[0]). Target and action are the two new parameters of Gen2.Select class whose * default values could be "Gen2.Select.Target.Select" and "Gen2.Select.Action.ON_N_OFF" respectively * if not provided by the user. * * Gen2 Select Action indicates which Select action to take * (See Gen2 spec /Select commands / Tag response to Action parameter) * |-----------------------------------------------------------------------------| * | Action | Tag Matching | Tag Not-Matching | * |----------|--------------------------------|---------------------------------| * | 0x00 | Assert SL or Inventoried->A | Deassert SL or Inventoried->B | * | 0x01 | Assert SL or Inventoried->A | Do nothing | * | 0x02 | Do nothing | Deassert SL or Inventoried->B | * | 0x03 | Negate SL or (A->B,B->A) | Do nothing | * | 0x04 | Deassert SL or Inventoried->B | Assert SL or Inventoried->A | * | 0x05 | Deassert SL or Inventoried->B | Do nothing | * | 0x06 | Do nothing | Assert SL or Inventoried->A | * | 0x07 | Do nothing | Negate SL or (A->B,B->A) | * * * To improve readability and ease typing, these names abbreviate the official terminology of the Gen2 spec. * <A>_N_<B>: The "_N_" stands for "Non-Matching". * The <A> clause before the _N_ describes what happens to Matching tags. * The <B> clause after the _N_ describes what happens to Non-Matching tags. * (Alternately, you can pronounce "_N_" as "and", or "&"; i.e., * the pair of Matching / Non-Matching actions is known as "<A> and <B>".) * * ON: assert SL or inventoried -> A * OFF: deassert SL or inventoried -> B * NEG: negate SL or (A->B, B->A) * NOP: do nothing * * The enum is simply a transliteration of the Gen2 spec's table: "Tag response to Action parameter" */ // create and initialize tidFilter // In case of Network readers, ensure that bitLength is a multiple of 8. Gen2.Select tidFilter = new Gen2.Select(false, Gen2.Bank.TID, 32, 16, new byte[] { (byte)0x01, (byte)0x2E }); tidFilter.target = Gen2.Select.Target.Select; tidFilter.action = Gen2.Select.Action.ON_N_OFF; // create and initialize epcFilter // In case of Network readers, ensure that bitLength is a multiple of 8. Gen2.Select epcFilter = new Gen2.Select(false, Gen2.Bank.EPC, 32, 16, new byte[] { (byte)0x11, (byte)0x22 }); epcFilter.target = Gen2.Select.Target.Select; epcFilter.action = Gen2.Select.Action.ON_N_OFF; // Initialize multifilter with tagFilter array containing list of filters // In case of Network readers, ensure that bitLength is a multiple of 8. MultiFilter multiFilter = new MultiFilter(new TagFilter[] { tidFilter, epcFilter }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, multiFilter, 1000)); Console.WriteLine("Reading tags which matches multi filter criteria \n", filter.ToString()); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); } } finally { // Restore original settings Console.WriteLine("Restoring Session " + oldSession); r.ParamSet("/reader/gen2/session", oldSession); } // Shut down reader r.Destroy(); } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
static void Main(string[] args) { // Program setup if (1 != args.Length) { Console.WriteLine(String.Join("\r\n", new string[] { "Please provide reader URL, such as:", "tmr:///com4", "tmr://my-reader.example.com", })); Environment.Exit(1); } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (Reader r = Reader.Create(args[0])) { // Uncomment this line to add default transport listener. // r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } else { r.ParamSet("/reader/region/id", supportedRegions[0]); } } TagReadData[] tagReads; TagFilter filter; byte[] mask = new byte[4]; Gen2.Impinj.Monza4.QTPayload payLoad; Gen2.Impinj.Monza4.QTControlByte controlByte; Gen2.Impinj.Monza4.QTReadWrite readWrite; uint accesspassword = 0; r.ParamSet("/reader/tagop/antenna", 1); Gen2.Session session = Gen2.Session.S0; r.ParamSet("/reader/gen2/session", session); SimpleReadPlan readPlan = new SimpleReadPlan(null, TagProtocol.GEN2, null, null, 1000); r.ParamSet("/reader/read/plan", readPlan); // Reading tags with a Monza 4 public EPC in response Console.WriteLine("Reading tags with a Monza 4 public EPC in response"); tagReads = r.Read(1000); foreach (TagReadData tagData in tagReads) { Console.WriteLine("Monza4 tag epc: " + tagData.EpcString); } Console.WriteLine(); // Initialize the payload and the controlByte of Monza4 payLoad = new Gen2.Impinj.Monza4.QTPayload(); controlByte = new Gen2.Impinj.Monza4.QTControlByte(); Console.WriteLine("Changing to private Mode "); // Executing Monza4 QT Write Set Private tagop payLoad.QTMEM = false; payLoad.QTSR = false; controlByte.QTReadWrite = true; controlByte.Persistence = true; readWrite = new Gen2.Impinj.Monza4.QTReadWrite(accesspassword, payLoad, controlByte); r.ExecuteTagOp(readWrite, null); Console.WriteLine(); // Setting the session to S2 session = Gen2.Session.S2; r.ParamSet("/reader/gen2/session", session); // Enable filter mask[0] = (byte)0x20; mask[1] = (byte)0x01; mask[2] = (byte)0xB0; mask[3] = (byte)0x00; filter = new Gen2.Select(true, Gen2.Bank.TID, 0x04, 0x18, mask); Console.WriteLine("Reading tags private Mode with session s2 "); readPlan = new SimpleReadPlan(null, TagProtocol.GEN2, filter, null, 1000); r.ParamSet("/reader/read/plan", readPlan); // Reading tags with a Monza 4 FastID with TID in response Console.WriteLine("Reading tags with a Monza 4 FastID with TID in response"); tagReads = r.Read(1000); foreach (TagReadData tagData in tagReads) { Console.WriteLine("Monza4 tag epc: " + tagData.EpcString); } Console.WriteLine(); Console.WriteLine("Setting the session to S0"); // Setting the session to S0 session = Gen2.Session.S0; r.ParamSet("/reader/gen2/session", session); mask[0] = (byte)0xE2; mask[1] = (byte)0x80; mask[2] = (byte)0x11; mask[3] = (byte)0x05; filter = new Gen2.Select(false, Gen2.Bank.TID, 0x00, 0x20, mask); Console.WriteLine("Reading tags private Mode with session s0 "); readPlan = new SimpleReadPlan(null, TagProtocol.GEN2, filter, null, 1000); r.ParamSet("/reader/read/plan", readPlan); // Reading tags with a Monza 4 FastID with NO TID in response Console.WriteLine("Reading tags with a Monza 4 FastID with NO TID in response"); tagReads = r.Read(1000); foreach (TagReadData tagData in tagReads) { Console.WriteLine("Monza4 tag epc: " + tagData.EpcString); } Console.WriteLine(); Console.WriteLine("Converting to public mode"); // Executing Monza4 QT Write Set Public tagop payLoad.QTMEM = true; payLoad.QTSR = false; controlByte.QTReadWrite = true; controlByte.Persistence = true; readWrite = new Gen2.Impinj.Monza4.QTReadWrite(accesspassword, payLoad, controlByte); r.ExecuteTagOp(readWrite, null); Console.WriteLine(); // Enable filter mask[0] = (byte)0x20; mask[1] = (byte)0x01; mask[2] = (byte)0xB0; mask[3] = (byte)0x00; filter = new Gen2.Select(true, Gen2.Bank.TID, 0x04, 0x18, mask); Console.WriteLine("Reading tags public Mode with session s0 "); readPlan = new SimpleReadPlan(null, TagProtocol.GEN2, filter, null, 1000); r.ParamSet("/reader/read/plan", readPlan); // Reading tags with a Monza 4 FastID with TID in response tagReads = r.Read(1000); foreach (TagReadData tagData in tagReads) { Console.WriteLine("Monza4 tag epc: " + tagData.EpcString); } Console.WriteLine(); Console.WriteLine("Reset the Read protect on "); // Reset the Read protect on payLoad.QTMEM = false; payLoad.QTSR = false; controlByte.QTReadWrite = false; controlByte.Persistence = false; readWrite = new Gen2.Impinj.Monza4.QTReadWrite(accesspassword, payLoad, controlByte); r.ExecuteTagOp(readWrite, null); } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
static void Main(string[] args) { // Program setup if (args.Length != 1) { Console.WriteLine("Please provide reader URL, such as:\n" + "tmr:///com4\n" + "tmr://my-reader.example.com\n"); Environment.Exit(1); } // Create Reader object, connecting to physical device try { Reader r; TagReadData[] tagReads, filteredTagReads; TagFilter filter; r = Reader.Create(args[0]); //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } else { r.ParamSet("/reader/region/id", supportedRegions[0]); } } // In the current system, sequences of Gen2 operations require Session 0, // since each operation resingulates the tag. In other sessions, // the tag will still be "asleep" from the preceding singulation. Gen2.Session oldSession = (Gen2.Session)r.ParamGet("/reader/gen2/session"); Gen2.Session newSession = Gen2.Session.S0; Console.WriteLine("Changing to Session " + newSession + " (from Session " + oldSession + ")"); r.ParamSet("/reader/gen2/session", newSession); Console.WriteLine(); try { Console.WriteLine("Unfiltered Read:"); // Read the tags in the field tagReads = r.Read(500); foreach (TagReadData tr in tagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); if (0 == tagReads.Length) { Console.WriteLine("No tags found."); } else { // A TagData object may be used as a filter, for example to // perform a tag data operation on a particular tag. Console.WriteLine("Filtered Tagop:"); // Read kill password of tag found in previous operation filter = tagReads[0].Tag; Console.WriteLine("Read kill password of tag {0}", filter); Gen2.ReadData tagop = new Gen2.ReadData(Gen2.Bank.RESERVED, 0, 2); try { ushort[] data = (ushort[])r.ExecuteTagOp(tagop, filter); foreach (ushort word in data) { Console.Write("{0:X4}", word); } Console.WriteLine(); } catch (ReaderException ex) { Console.WriteLine("Can't read tag: {0}", ex.Message); } Console.WriteLine(); // Filter objects that apply to multiple tags are most useful in // narrowing the set of tags that will be read. This is // performed by setting a read plan that contains a filter. // A TagData with a short EPC will filter for tags whose EPC // starts with the same sequence. filter = new TagData(tagReads[0].Tag.EpcString.Substring(0, 4)); Console.WriteLine("EPCs that begin with {0}:", filter); r.ParamSet("/reader/read/plan", new SimpleReadPlan(null, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); // A filter can also be an full Gen2 Select operation. For // example, this filter matches all Gen2 tags where bits 8-19 of // the TID are 0x003 (that is, tags manufactured by Alien // Technology). Console.WriteLine("Tags with Alien Technology TID"); filter = new Gen2.Select(false, Gen2.Bank.TID, 8, 12, new byte[] { 0, 0x30 }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(null, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); // Gen2 Select may also be inverted, to give all non-matching tags Console.WriteLine("Tags without Alien Technology TID"); filter = new Gen2.Select(true, Gen2.Bank.TID, 8, 12, new byte[] { 0, 0x30 }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(null, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); // Filters can also be used to match tags that have already been // read. This form can only match on the EPC, as that's the only // data from the tag's memory that is contained in a TagData // object. // Note that this filter has invert=true. This filter will match // tags whose bits do not match the selection mask. // Also note the offset - the EPC code starts at bit 32 of the // EPC memory bank, after the StoredCRC and StoredPC. filter = new Gen2.Select(true, Gen2.Bank.EPC, 32, 2, new byte[] { (byte)0xC0 }); Console.WriteLine("EPCs with first 2 bits equal to zero (post-filtered):"); foreach (TagReadData tr in tagReads) // unfiltered tag reads from the first example { if (filter.Matches(tr.Tag)) { Console.WriteLine(tr.ToString()); } } Console.WriteLine(); } } finally { // Restore original settings Console.WriteLine("Restoring Session " + oldSession); r.ParamSet("/reader/gen2/session", oldSession); } // Shut down reader r.Destroy(); } catch (ReaderException re) { Console.WriteLine("Error: " + re.ToString()); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
// TODO: Merge common functionality between KeyboardWedgeRead and ReadTags.ReadtheTags private void KeyboardWedgeRead() { List<SendInputWrapper.INPUT> inputList = new List<SendInputWrapper.INPUT>(); string startIndicator = "."; // Signal start of read inputList.Clear(); AddKeypresses(inputList, startIndicator); SendInput(inputList); properties = Utilities.GetProperties(); SoundPlayer startSound = new SoundPlayer(properties["startscanwavefile"]); if (properties["audiblealert"].ToLower() == "yes") { startSound.Play(); } SoundPlayer stopSound = new SoundPlayer(properties["endscanwavefile"]); stopSound.LoadAsync(); CoreDLL.SYSTEM_POWER_STATUS_EX status = new CoreDLL.SYSTEM_POWER_STATUS_EX(); //Check the battery power level if (CoreDLL.GetSystemPowerStatusEx(status, false) == 1) { if (status.BatteryLifePercent <= 5) { if (status.ACLineStatus == 0) { MessageBox.Show("Battery level is low to read tags"); return; } } } try { TagReadData[] reads; //Utilities.PowerManager.PowerNotify += new PowerManager.PowerEventHandler(PowerManager_PowerNotify); using (ThingMagic.RFIDSearchLight.ReadMgr.Session rsess = ThingMagic.RFIDSearchLight.ReadMgr.GetSession()) { #if DEBUG if (properties["audiblealert"].ToLower() == "yes") { startSound.Play(); } #endif int radioPower = 0; if (properties["readpower"].ToString() == "") { radioPower = 2300;//While reading read power should be max } else { radioPower = Convert.ToInt32(properties["readpower"].ToString()); } //Set the region string region = properties["region"]; try { Utilities.SwitchRegion(region); } catch (ArgumentException) { MessageBox.Show( "Unknown Region: " + region + "\r\n" + "Please run RFIDSearchLight to initialize the region." ); } rsess.Reader.ParamSet("/reader/powerMode", Reader.PowerMode.FULL); rsess.Reader.ParamSet("/reader/radio/readPower", radioPower); rsess.Reader.ParamSet("/reader/antenna/txRxMap", new int[][] { new int[] { 1, 1, 1 } }); List<int> ant = new List<int>(); ant.Add(1); //set the tag population settings rsess.Reader.ParamSet("/reader/gen2/target", Gen2.Target.A);//default target string tagPopulation = properties["tagpopulation"]; switch (tagPopulation) { case "small": rsess.Reader.ParamSet("/reader/gen2/q", new Gen2.StaticQ(2)); rsess.Reader.ParamSet("/reader/gen2/session", Gen2.Session.S0); rsess.Reader.ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M4); break; case "medium": rsess.Reader.ParamSet("/reader/gen2/q", new Gen2.StaticQ(4)); rsess.Reader.ParamSet("/reader/gen2/session", Gen2.Session.S1); rsess.Reader.ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M4); break; case "large": rsess.Reader.ParamSet("/reader/gen2/q", new Gen2.StaticQ(6)); rsess.Reader.ParamSet("/reader/gen2/session", Gen2.Session.S2); rsess.Reader.ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M2); break; default: break; } //set the read plan and filter TagFilter filter; int addressToRead = int.Parse(properties["selectionaddress"]); Gen2.Bank bank = Gen2.Bank.EPC; switch (properties["tagselection"].ToLower()) { case "None": case "epc": bank = Gen2.Bank.EPC; break; case "tid": bank = Gen2.Bank.TID; break; case "user": bank = Gen2.Bank.USER; break; case "reserved": bank = Gen2.Bank.RESERVED; break; default: break; } if ("yes" == properties["ismaskselected"]) { filter = new Gen2.Select(true, bank, (uint)addressToRead * 8, (ushort)(properties["selectionmask"].Length * 4), ByteFormat.FromHex(properties["selectionmask"])); } else { filter = new Gen2.Select(false, bank, (uint)addressToRead * 8, (ushort)(properties["selectionmask"].Length * 4), ByteFormat.FromHex(properties["selectionmask"])); } //set the read plan SimpleReadPlan srp; if (properties["tagselection"].ToLower() == "none") { srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, null, 0); } else { srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, filter, 0); } rsess.Reader.ParamSet("/reader/read/plan", srp); double readDuration = Convert.ToDouble(properties["scanduration"].ToString()) * 1000; int readTimeout = Convert.ToInt32(readDuration); //Do a sync read for the readduration #if DEBUG if (properties["audiblealert"].ToLower() == "yes") { startSound.Play(); } #endif reads = rsess.Reader.Read(readTimeout); rsess.Reader.ParamSet("/reader/powerMode", Reader.PowerMode.MINSAVE); if (properties["audiblealert"].ToLower() == "yes") { stopSound.Play(); } // Clear start indicator inputList.Clear(); for (int i = 0; i < startIndicator.Length; i++) { AddKeypresses(inputList, new byte[] { // Don't send Backspace -- that's one of our hotkeys, // so it'll put us in an infinite loop. (byte)Keys.Left, (byte)Keys.Delete, }); } SendInput(inputList); } inputList.Clear(); //HideWindow(); bool timestamp = false, rssi = false, position = false; string[] metadata = properties["metadatatodisplay"].Split(','); //Metadata boolean variables foreach (string mdata in metadata) { switch (mdata.ToLower()) { case "timestamp": timestamp = true; break; case "rssi": rssi = true; break; case "position": position = true; break; default: break; } } string metadataseparator = properties["metadataseparator"]; byte metadataseparatorInByte = 0x00; switch (metadataseparator.ToLower()) { //The byte representation of special characters can be found here - http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx case "comma": metadataseparatorInByte = 0xBC; break; case "space": metadataseparatorInByte = 0x20; break; case "enter": metadataseparatorInByte = 0x0D; break; case "tab": metadataseparatorInByte = 0x09; break; default: break; } //Print the epc in caps AddKeypress(inputList, (byte)Keys.Capital); // Toggle Caps Lock //Print the tag reads foreach (TagReadData dat in reads) { string tagData = string.Empty; string epc = string.Empty; if (properties["displayformat"] == "base36") { epc = ConvertEPC.ConvertHexToBase36(dat.EpcString); } else { epc = dat.EpcString; } AddKeypresses(inputList, properties["prefix"].ToUpper()); AddKeypresses(inputList, epc.ToUpper()); AddKeypresses(inputList, properties["suffix"].ToUpper()); if (timestamp) { AddKeypress(inputList, metadataseparatorInByte); AddKeypresses(inputList, dat.Time.ToString("yyyy-MM-dd-HH-mm-ss")); } if (rssi) { AddKeypress(inputList, metadataseparatorInByte); AddKeypresses(inputList, dat.Rssi.ToString()); } if (position) { AddKeypress(inputList, metadataseparatorInByte); AddKeypresses(inputList, GpsMgr.LatLonString); } switch (properties["multipletagseparator"].ToLower()) { case "comma": AddKeypress(inputList, 0xBC); break; case "space": AddKeypress(inputList, 0x20); break; case "enter": AddKeypress(inputList, 0x0D); break; case "tab": AddKeypress(inputList, 0x09); break; case "pipe": AddInput(inputList, SHIFT_DOWN); AddKeypress(inputList, 0xDC); AddInput(inputList, SHIFT_UP); break; default: break; } // Send keystrokes after each tag read record -- input buffer // isn't big enough to hold more than a few lines SendInput(inputList); inputList.Clear(); } //Turn caps lock back off AddKeypress(inputList, (byte)Keys.Capital); // Toggle Caps Lock SendInput(inputList); } catch (Exception ex) { logger.Error("In KeyboardWedgeRead(): " + ex.ToString()); //MessageBox.Show(ex.Message); //Debug.Log(ex.ToString()); } }
public ReadPlan LoadSimpleReadPlan(string valstr) { Object value = ParseValue(valstr); string str = string.Empty; //Reamoves leading string for ex: SimpleReadPlan: str = valstr.Remove(0, 15); SimpleReadPlan srp = new SimpleReadPlan(); //Regular expression to remove leading and trailing square brackets string remove = Regex.Replace(str, @"]$|^\[", ""); //Regular expression to split the string string[] lines = Regex.Split(remove, @",(?![^\[\]]*\])"); TagFilter tf = null; TagOp op = null; foreach (string line in lines) { if (-1 != line.IndexOf("Antennas")) { ArrayList list = new ArrayList(); int[] antList = null; object value1 = ParseValue(line.Split('=')[1]); if (value1 != null) { antList = (int[])((ArrayList)value1).ToArray(typeof(int)); } srp.Antennas = antList; } else if (-1 != line.IndexOf("Protocol")) { srp.Protocol = (TagProtocol)Enum.Parse(typeof(TagProtocol), line.Split('=')[1], true); } else if (-1 != line.IndexOf("Filter")) { string filterData = line.Split('=')[1]; if (-1 != filterData.IndexOf("Gen2.Select")) { str = line.Remove(0, 19); //Regular expression to remove leading and trailing square brackets str = Regex.Replace(str, @"]$|^\[", ""); //Regular expression to split the string string[] select = Regex.Split(str, @"[ ,;]+"); bool Invert = false; Gen2.Bank bank = Gen2.Bank.EPC; uint BitPointer = 0; ushort BitLength = 0; byte[] mask = null; if (select.Length != 5) { throw new Exception("Invalid number of arguments for ReadPlan filter"); } foreach (string arg in select) { if (-1 != arg.IndexOf("Invert")) { Invert = Convert.ToBoolean(arg.Split('=')[1]); } else if (-1 != arg.IndexOf("Bank")) { bank = (Gen2.Bank)Enum.Parse(typeof(Gen2.Bank), arg.Split('=')[1], true); } else if (-1 != arg.IndexOf("BitPointer")) { BitPointer = Convert.ToUInt32(arg.Split('=')[1]); } else if (-1 != arg.IndexOf("BitLength")) { BitLength = Convert.ToUInt16(arg.Split('=')[1]); } else if (-1 != arg.IndexOf("Mask")) { mask = StringToByteArray(arg.Split('=')[1]); } else { throw new Exception("Invalid Argument in ReadPlan"); } } tf = new Gen2.Select(Invert, bank, BitPointer, BitLength, mask); } else if (-1 != filterData.IndexOf("EPC")) { str = line.Remove(0, 15); str = Regex.Replace(str, @"]$|^\[", ""); tf = new TagData(StringToByteArray((str.Split('=')[1]))); } else { if (!filterData.Equals("null")) { throw new Exception("Invalid Argument in ReadPlan"); } } } else if (-1 != line.IndexOf("Op")) { string tagOpData = line.Split('=')[1]; if (tagOpData != null) { if (-1 != tagOpData.IndexOf("ReadData")) { str = line.Remove(0, 12); //Regular expression to remove leading and trailing square brackets str = Regex.Replace(str, @"]$|^\[", ""); //Regular expression to split the string string[] select = Regex.Split(str, @"[ ,;]+"); Gen2.Bank bank = Gen2.Bank.EPC; uint wordAddress = 0; byte length = 0; foreach (string arg in select) { if (-1 != arg.IndexOf("Bank")) { bank = (Gen2.Bank)Enum.Parse(typeof(Gen2.Bank), arg.Split('=')[1], true); } else if (-1 != arg.IndexOf("WordAddress")) { wordAddress = Convert.ToUInt32(arg.Split('=')[1]); } else if (-1 != arg.IndexOf("Len")) { length = Convert.ToByte(arg.Split('=')[1]); } else { throw new Exception("Invalid Argument in ReadPlan TagOp"); } } op = new Gen2.ReadData(bank, wordAddress, length); } else { if (!tagOpData.Equals("null")) { throw new Exception("Invalid Argument in ReadPlan"); } } } } else if (-1 != line.IndexOf("UseFastSearch")) { srp.UseFastSearch = Convert.ToBoolean(line.Split('=')[1]); } else if (-1 != line.IndexOf("Weight")) { srp.Weight = Convert.ToInt32(lines[5].Split('=')[1]); } else { throw new Exception("Invalid Argument in ReadPlan"); } } srp.Filter = tf; srp.Op = op; return(srp); }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } int[] antennaList = null; for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } // Create Reader object, connecting to physical device try { Reader r; TagReadData[] tagReads, filteredTagReads; TagFilter filter; r = Reader.Create(args[0]); //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } string model = r.ParamGet("/reader/version/model").ToString(); if ((model.Equals("M6e Micro") || model.Equals("M6e Nano") || model.Equals("Sargas")) && antennaList == null) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } // In the current system, sequences of Gen2 operations require Session 0, // since each operation resingulates the tag. In other sessions, // the tag will still be "asleep" from the preceding singulation. Gen2.Session oldSession = (Gen2.Session)r.ParamGet("/reader/gen2/session"); Gen2.Session newSession = Gen2.Session.S0; Console.WriteLine("Changing to Session " + newSession + " (from Session " + oldSession + ")"); r.ParamSet("/reader/gen2/session", newSession); Console.WriteLine(); SimpleReadPlan srp = new SimpleReadPlan(antennaList, TagProtocol.GEN2); r.ParamSet("/reader/read/plan", srp); //To perform standalone operations if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } try { Console.WriteLine("Unfiltered Read:"); // Read the tags in the field tagReads = r.Read(500); foreach (TagReadData tr in tagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); if (0 == tagReads.Length) { Console.WriteLine("No tags found."); } else { // A TagData object may be used as a filter, for example to // perform a tag data operation on a particular tag. Console.WriteLine("Filtered Tagop:"); // Read kill password of tag found in previous operation filter = tagReads[0].Tag; Console.WriteLine("Read kill password of tag {0}", filter); Gen2.ReadData tagop = new Gen2.ReadData(Gen2.Bank.RESERVED, 0, 2); try { ushort[] data = (ushort[])r.ExecuteTagOp(tagop, filter); foreach (ushort word in data) { Console.Write("{0:X4}", word); } Console.WriteLine(); } catch (ReaderException ex) { Console.WriteLine("Can't read tag: {0}", ex.Message); } Console.WriteLine(); // Filter objects that apply to multiple tags are most useful in // narrowing the set of tags that will be read. This is // performed by setting a read plan that contains a filter. // A TagData with a short EPC will filter for tags whose EPC // starts with the same sequence. filter = new TagData(tagReads[0].Tag.EpcString.Substring(0, 4)); Console.WriteLine("EPCs that begin with {0}:", filter); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); // A filter can also be an full Gen2 Select operation. For // example, this filter matches all Gen2 tags where bits 8-19 of // the TID are 0x003 (that is, tags manufactured by Alien // Technology). Console.WriteLine("Tags with Alien Technology TID"); filter = new Gen2.Select(false, Gen2.Bank.TID, 8, 12, new byte[] { 0, 0x30 }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); if (r is SerialReader) { // A filter can also be Gen2 Truncate Select operation. // Truncate indicates whether a Tag’s backscattered reply shall be truncated to those EPC bits that follow Mask. // For example, truncated select starting with PC word start address and length of 16 bits Console.WriteLine("GEN2 Select Truncate Operation"); filter = new Gen2.Select(false, Gen2.Bank.GEN2EPCTRUNCATE, 16, 40, new byte[] { 0x30, 0x00, 0xDE, 0xAD, 0xCA }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); // A filter can also perform Gen2 Tag Filtering. // Major advantage of this feature is to limit the EPC response to user specified length field and all others will be rejected by firmware. // invert, bitPointer, mask : Parameters will be ignored when TMR_GEN2_EPC_LENGTH_FILTER is used // maskBitLength : Specified EPC Length used for filtering // For example, Tag filtering will be applied on EPC with 128 bits length, rest of the tags will be ignored Console.WriteLine("GEN2 Tag Filter Based on EPC Length"); filter = new Gen2.Select(false, Gen2.Bank.GEN2EPCLENGTHFILTER, 16, 128, new byte[] { 0x30, 0x00 }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); } // Gen2 Select may also be inverted, to give all non-matching tags Console.WriteLine("Tags without Alien Technology TID"); filter = new Gen2.Select(true, Gen2.Bank.TID, 8, 12, new byte[] { 0, 0x30 }); r.ParamSet("/reader/read/plan", new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, 1000)); filteredTagReads = r.Read(500); foreach (TagReadData tr in filteredTagReads) { Console.WriteLine(tr.ToString()); } Console.WriteLine(); // Filters can also be used to match tags that have already been // read. This form can only match on the EPC, as that's the only // data from the tag's memory that is contained in a TagData // object. // Note that this filter has invert=true. This filter will match // tags whose bits do not match the selection mask. // Also note the offset - the EPC code starts at bit 32 of the // EPC memory bank, after the StoredCRC and StoredPC. filter = new Gen2.Select(true, Gen2.Bank.EPC, 32, 2, new byte[] { (byte)0xC0 }); Console.WriteLine("EPCs with first 2 bits equal to zero (post-filtered):"); foreach (TagReadData tr in tagReads) // unfiltered tag reads from the first example { if (filter.Matches(tr.Tag)) { Console.WriteLine(tr.ToString()); } } Console.WriteLine(); } } finally { // Restore original settings Console.WriteLine("Restoring Session " + oldSession); r.ParamSet("/reader/gen2/session", oldSession); } // Shut down reader r.Destroy(); } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (r = Reader.Create(args[0])) { //Uncomment this line to add default transport listener. //r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } string model = r.ParamGet("/reader/version/model").ToString(); if ((model.Equals("M6e Micro") || model.Equals("M6e Nano") || model.Equals("Sargas")) && antennaList == null) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } // Create a simplereadplan which uses the antenna list created above SimpleReadPlan plan = new SimpleReadPlan(antennaList, TagProtocol.GEN2, null, null, 1000); // Set the created readplan r.ParamSet("/reader/read/plan", plan); //Use first antenna for operation if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } ushort[] Key0 = new ushort[] { 0x0123, 0x4567, 0x89AB, 0xCDEF, 0x0123, 0x4567, 0x89AB, 0xCDEF }; ushort[] Key1 = new ushort[] { 0x1122, 0x3344, 0x5566, 0x7788, 0x1122, 0x3344, 0x5566, 0x7788 }; ushort[] Ichallenge = new ushort[] { 0x0123, 0x4567, 0x89AB, 0xCDEF, 0xABCD }; Gen2.Select filter = new Gen2.Select(false, Gen2.Bank.EPC, 32, 96, new byte[] { 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF }); bool SendRawData = false; bool _isNMV2DTag = false; Gen2.NXP.AES.Tam1Authentication tam1Auth; Gen2.NXP.AES.Tam2Authentication tam2Auth; byte[] Response; byte[] Challenge; //ReadBuffer with TAM1 using Key0 tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0, Ichallenge, SendRawData); Gen2.ReadBuffer tagOp = new Gen2.NXP.AES.ReadBuffer(0, 128, tam1Auth); Response = (byte[])r.ExecuteTagOp(tagOp, null); if (SendRawData) { Challenge = DecryptIchallenge(Response, ByteConv.ConvertFromUshortArray(Key0)); Array.Copy(Challenge, 6, Challenge, 0, 10); Array.Resize(ref Challenge, 10); Console.WriteLine("Returned Ichallenge:" + ByteFormat.ToHex(Challenge, "", " ")); Console.WriteLine("Returned Response:" + ByteFormat.ToHex(Response, "", " ")); } // Uncomment this to enable ReadBuffer with TAM1 using Key1 //tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, Ichallenge, SendRawData); //Gen2.ReadBuffer Tam1RdBufWithKey0 = new Gen2.NXP.AES.ReadBuffer(0, 128, tam1Auth); //Response = (byte[])r.ExecuteTagOp(Tam1RdBufWithKey0, null); //if (SendRawData) //{ // Challenge = DecryptIchallenge(Response, ByteConv.ConvertFromUshortArray(Key1)); // Array.Copy(Challenge, 6, Challenge, 0, 10); // Array.Resize(ref Challenge, 10); // Console.WriteLine("Returned Ichallenge:" + ByteFormat.ToHex(Challenge, "", " ")); // Console.WriteLine("Returned Response:" + ByteFormat.ToHex(Response, "", " ")); //} //Uncomment this to enable ReadBuffer with TAM2 using key1 //ushort Offset = 0; //ushort BlockCount = 1; // supported protMode value is 1 for NXPUCODE AES tag //ushort ProtMode = 1; //tam2Auth = new Gen2.NXP.AES.Tam2Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, Ichallenge, // Gen2.NXP.AES.Profile.EPC, Offset, BlockCount, ProtMode, SendRawData); //Gen2.ReadBuffer Tam2RdBufWithKey1 = new Gen2.NXP.AES.ReadBuffer(0, 256, tam2Auth); //Response = (byte[])r.ExecuteTagOp(Tam2RdBufWithKey1, null); //if (SendRawData) //{ // byte[] CipherData = new byte[16]; // byte[] IV = new byte[16]; // Array.Copy(Response, IV, 16); // Array.Copy(Response, 0, IV, 0, 16); // Array.Copy(Response, 16, CipherData, 0, 16); // if (ProtMode == 1 || ProtMode == 3) // { // Console.WriteLine("Custom Data: " + DecryptCustomData(CipherData, ByteConv.ConvertFromUshortArray(Key1), (byte[])IV.Clone())); // } // Challenge = DecryptIchallenge(IV, ByteConv.ConvertFromUshortArray(Key1)); // Array.Copy(Challenge, 6, Challenge, 0, 10); // Array.Resize(ref Challenge, 10); // Console.WriteLine("Returned Ichallenge:" + ByteFormat.ToHex(Challenge, "", " ")); //} //else //{ // Console.WriteLine("Returned Response: " + ByteFormat.ToHex(Response, "", " ")); //} // Embedded tag operations #region EmbeddedTagOperations { //Uncomment this to execute embedded tagop for ReadBuffer with TAM1 using Key0 //tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0, Ichallenge, SendRawData); //Gen2.ReadBuffer embeddedTagOp = new Gen2.NXP.AES.ReadBuffer(0, 128, tam1Auth); //Response = performEmbeddedOperation(null, embeddedTagOp); //if (SendRawData) //{ // Challenge = DecryptIchallenge(Response, ByteConv.ConvertFromUshortArray(Key0)); // Array.Copy(Challenge, 6, Challenge, 0, 10); // Array.Resize(ref Challenge, 10); // Console.WriteLine("Returned Ichallenge:" + ByteFormat.ToHex(Challenge, "", " ")); // Console.WriteLine("Returned Response:" + ByteFormat.ToHex(Response, "", " ")); //} //Uncomment this to execute embedded tagop for ReadBuffer with TAM1 using Key1 //tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, Ichallenge, SendRawData); //Gen2.ReadBuffer embeddedTam1RdBufWithKey0 = new Gen2.NXP.AES.ReadBuffer(0, 128, tam1Auth); //Response = performEmbeddedOperation(null, embeddedTam1RdBufWithKey0); //if (SendRawData) //{ // Challenge = DecryptIchallenge(Response, ByteConv.ConvertFromUshortArray(Key1)); // Array.Copy(Challenge, 6, Challenge, 0, 10); // Array.Resize(ref Challenge, 10); // Console.WriteLine("Returned Ichallenge:" + ByteFormat.ToHex(Challenge, "", " ")); // Console.WriteLine("Returned Response:" + ByteFormat.ToHex(Response, "", " ")); //} //Uncomment this to execute embedded tagop for ReadBuffer with TAM2 using key1 //ushort EmbeddedOffset = 0; //ushort EmbeddedBlockCount = 1; //// supported protMode value is 1 for NXPUCODE AES tag //ushort EmbeddedProtMode = 1; //tam2Auth = new Gen2.NXP.AES.Tam2Authentication(Gen2.NXP.AES.KeyId.KEY1, Key1, Ichallenge, // Gen2.NXP.AES.Profile.EPC, EmbeddedOffset, EmbeddedBlockCount, EmbeddedProtMode, SendRawData); //Gen2.ReadBuffer embeddedTam2RdBufWithKey1 = new Gen2.NXP.AES.ReadBuffer(0, 256, tam2Auth); //Response = performEmbeddedOperation(null, embeddedTam2RdBufWithKey1); //if (SendRawData) //{ // byte[] data = new byte[16]; // Array.Copy(Response, data, 16); // Challenge = DecryptIchallenge(data, ByteConv.ConvertFromUshortArray(Key1)); // Array.Copy(Challenge, 6, Challenge, 0, 10); // Array.Resize(ref Challenge, 10); // Console.WriteLine("Returned Ichallenge:" + ByteFormat.ToHex(Challenge, "", " ")); // Console.WriteLine("Returned Response:" + ByteFormat.ToHex(Response, "", " ")); //} //else //{ // Console.WriteLine("Data: " + ByteFormat.ToHex(Response, "", " ")); //} } #endregion EmbeddedTagOperations //Enable flag _isNMV2DTag for ReadBuffer with TAM1/TAM2 Authentication using KEY0 for NMV2D Tag if (_isNMV2DTag) { // NMV2D tag only supports KEY0 ushort[] Key0_NMV2D = new ushort[] { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; //Uncomment this to enable ReadBuffer with TAM1 with Key0 //tam1Auth = new Gen2.NXP.AES.Tam1Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0_NMV2D, Ichallenge, SendRawData); //// Pass bitCount value as 128 for TAM1 //Gen2.ReadBuffer tagOp = new Gen2.NXP.AES.ReadBuffer(0, 128, tam1Auth); //Response = (byte[])r.ExecuteTagOp(tagOp, null); //if (SendRawData) //{ // Challenge = DecryptIchallenge(Response, ByteConv.ConvertFromUshortArray(Key0_NMV2D)); // Array.Copy(Challenge, 6, Challenge, 0, 10); // Array.Resize(ref Challenge, 10); // Console.WriteLine("Returned Ichallenge:" + ByteFormat.ToHex(Challenge, "", " ")); // Console.WriteLine("Returned Response:" + ByteFormat.ToHex(Response, "", " ")); //} //ReadBuffer with TAM2 with key0 ushort offset = 0; ushort blockCount = 1; //supported protMode values are 0,1,2,3 ushort protMode = 0; ushort bitCount = 0; tam2Auth = new Gen2.NXP.AES.Tam2Authentication(Gen2.NXP.AES.KeyId.KEY0, Key0_NMV2D, Ichallenge, Gen2.NXP.AES.Profile.EPC, offset, blockCount, protMode, SendRawData); // Pass bitCount value as 256 for protModes = 0, 1 and 352 for protModes = 2, 3 for TAM2 if (protMode == 0 || protMode == 1) { bitCount = 256; } else if (protMode == 2 || protMode == 3) { bitCount = 352; } Gen2.ReadBuffer Tam2RdBufWithKey0 = new Gen2.NXP.AES.ReadBuffer(0, bitCount, tam2Auth); Response = (byte[])r.ExecuteTagOp(Tam2RdBufWithKey0, null); if (SendRawData) { byte[] CipherData = new byte[16]; byte[] IV = new byte[16]; Array.Copy(Response, IV, 16); Array.Copy(Response, 0, IV, 0, 16); Array.Copy(Response, 16, CipherData, 0, 16); if (protMode == 1 || protMode == 3) { Console.WriteLine("Custom Data: " + DecryptCustomData(CipherData, ByteConv.ConvertFromUshortArray(Key0_NMV2D), (byte[])IV.Clone())); } Challenge = DecryptIchallenge(IV, ByteConv.ConvertFromUshortArray(Key0_NMV2D)); Array.Copy(Challenge, 6, Challenge, 0, 10); Array.Resize(ref Challenge, 10); Console.WriteLine("Returned Ichallenge:" + ByteFormat.ToHex(Challenge, "", " ")); } else { Console.WriteLine("Returned Response: " + ByteFormat.ToHex(Response, "", " ")); } } } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
static void Main(string[] args) { // Program setup if (1 > args.Length) { Usage(); } int[] antennaList = null; for (int nextarg = 1; nextarg < args.Length; nextarg++) { string arg = args[nextarg]; if (arg.Equals("--ant")) { if (null != antennaList) { Console.WriteLine("Duplicate argument: --ant specified more than once"); Usage(); } antennaList = ParseAntennaList(args, nextarg); nextarg++; } else { Console.WriteLine("Argument {0}:\"{1}\" is not recognized", nextarg, arg); Usage(); } } try { // Create Reader object, connecting to physical device. // Wrap reader in a "using" block to get automatic // reader shutdown (using IDisposable interface). using (Reader r = Reader.Create(args[0])) { // Uncomment this line to add default transport listener. // r.Transport += r.SimpleTransportListener; r.Connect(); if (Reader.Region.UNSPEC == (Reader.Region)r.ParamGet("/reader/region/id")) { Reader.Region[] supportedRegions = (Reader.Region[])r.ParamGet("/reader/region/supportedRegions"); if (supportedRegions.Length < 1) { throw new FAULT_INVALID_REGION_Exception(); } r.ParamSet("/reader/region/id", supportedRegions[0]); } if (r.isAntDetectEnabled(antennaList)) { Console.WriteLine("Module doesn't has antenna detection support please provide antenna list"); Usage(); } TagReadData[] tagReads; TagFilter filter; byte[] mask = new byte[4]; Gen2.Impinj.Monza4.QTPayload payLoad; Gen2.Impinj.Monza4.QTControlByte controlByte; Gen2.Impinj.Monza4.QTReadWrite readWrite; uint accesspassword = 0; //Use first antenna for operation if (antennaList != null) { r.ParamSet("/reader/tagop/antenna", antennaList[0]); } Gen2.Session session = Gen2.Session.S0; r.ParamSet("/reader/gen2/session", session); SimpleReadPlan readPlan = new SimpleReadPlan(antennaList, TagProtocol.GEN2, null, null, 1000); r.ParamSet("/reader/read/plan", readPlan); // Reading tags with a Monza 4 public EPC in response Console.WriteLine("Reading tags with a Monza 4 public EPC in response"); tagReads = r.Read(1000); foreach (TagReadData tagData in tagReads) { Console.WriteLine("Monza4 tag epc: " + tagData.EpcString); } Console.WriteLine(); // Initialize the payload and the controlByte of Monza4 payLoad = new Gen2.Impinj.Monza4.QTPayload(); controlByte = new Gen2.Impinj.Monza4.QTControlByte(); Console.WriteLine("Changing to private Mode "); // Executing Monza4 QT Write Set Private tagop payLoad.QTMEM = false; payLoad.QTSR = false; controlByte.QTReadWrite = true; controlByte.Persistence = true; readWrite = new Gen2.Impinj.Monza4.QTReadWrite(accesspassword, payLoad, controlByte); r.ExecuteTagOp(readWrite, null); Console.WriteLine(); // Setting the session to S2 session = Gen2.Session.S2; r.ParamSet("/reader/gen2/session", session); // Enable filter mask[0] = (byte)0x20; mask[1] = (byte)0x01; mask[2] = (byte)0xB0; mask[3] = (byte)0x00; filter = new Gen2.Select(true, Gen2.Bank.TID, 0x04, 0x18, mask); Console.WriteLine("Reading tags private Mode with session s2 "); readPlan = new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, null, 1000); r.ParamSet("/reader/read/plan", readPlan); // Reading tags with a Monza 4 FastID with TID in response Console.WriteLine("Reading tags with a Monza 4 FastID with TID in response"); tagReads = r.Read(1000); foreach (TagReadData tagData in tagReads) { Console.WriteLine("Monza4 tag epc: " + tagData.EpcString); } Console.WriteLine(); Console.WriteLine("Setting the session to S0"); // Setting the session to S0 session = Gen2.Session.S0; r.ParamSet("/reader/gen2/session", session); mask[0] = (byte)0xE2; mask[1] = (byte)0x80; mask[2] = (byte)0x11; mask[3] = (byte)0x05; filter = new Gen2.Select(false, Gen2.Bank.TID, 0x00, 0x20, mask); Console.WriteLine("Reading tags private Mode with session s0 "); readPlan = new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, null, 1000); r.ParamSet("/reader/read/plan", readPlan); // Reading tags with a Monza 4 FastID with NO TID in response Console.WriteLine("Reading tags with a Monza 4 FastID with NO TID in response"); tagReads = r.Read(1000); foreach (TagReadData tagData in tagReads) { Console.WriteLine("Monza4 tag epc: " + tagData.EpcString); } Console.WriteLine(); Console.WriteLine("Converting to public mode"); // Executing Monza4 QT Write Set Public tagop payLoad.QTMEM = true; payLoad.QTSR = false; controlByte.QTReadWrite = true; controlByte.Persistence = true; readWrite = new Gen2.Impinj.Monza4.QTReadWrite(accesspassword, payLoad, controlByte); r.ExecuteTagOp(readWrite, null); Console.WriteLine(); // Enable filter mask[0] = (byte)0x20; mask[1] = (byte)0x01; mask[2] = (byte)0xB0; mask[3] = (byte)0x00; filter = new Gen2.Select(true, Gen2.Bank.TID, 0x04, 0x18, mask); Console.WriteLine("Reading tags public Mode with session s0 "); readPlan = new SimpleReadPlan(antennaList, TagProtocol.GEN2, filter, null, 1000); r.ParamSet("/reader/read/plan", readPlan); // Reading tags with a Monza 4 FastID with TID in response tagReads = r.Read(1000); foreach (TagReadData tagData in tagReads) { Console.WriteLine("Monza4 tag epc: " + tagData.EpcString); } Console.WriteLine(); Console.WriteLine("Reset the Read protect on "); // Reset the Read protect on payLoad.QTMEM = false; payLoad.QTSR = false; controlByte.QTReadWrite = false; controlByte.Persistence = false; readWrite = new Gen2.Impinj.Monza4.QTReadWrite(accesspassword, payLoad, controlByte); r.ExecuteTagOp(readWrite, null); } } catch (ReaderException re) { Console.WriteLine("Error: " + re.Message); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
// create an RFID Gen2 Select Command with custom parameters public static Gen2.Select CreateGen2Select(int target, int action, Gen2.Bank bank, int pointer, int length, byte[] mask) { Gen2.Select select = new Gen2.Select(false, bank, (uint)pointer, (ushort)length, mask); switch (target) { case 0: select.target = Gen2.Select.Target.Inventoried_S0; break; case 1: select.target = Gen2.Select.Target.Inventoried_S1; break; case 2: select.target = Gen2.Select.Target.Inventoried_S2; break; case 3: select.target = Gen2.Select.Target.Inventoried_S3; break; case 4: select.target = Gen2.Select.Target.Select; break; default: throw new ArgumentException("invalid target value"); } switch (action) { case 0: select.action = Gen2.Select.Action.ON_N_OFF; break; case 1: select.action = Gen2.Select.Action.ON_N_NOP; break; case 2: select.action = Gen2.Select.Action.NOP_N_OFF; break; case 3: select.action = Gen2.Select.Action.NEG_N_NOP; break; case 4: select.action = Gen2.Select.Action.OFF_N_ON; break; case 5: select.action = Gen2.Select.Action.OFF_N_NOP; break; case 6: select.action = Gen2.Select.Action.NOP_N_ON; break; case 7: select.action = Gen2.Select.Action.NOP_N_NEG; break; default: throw new ArgumentException("invalid action value"); } return(select); }
static void Main(string[] args) { try { // connect to and initialize reader Reader reader = Common.EstablishReader(); // setup sensor activation commands and filters ensuring On-Chip RSSI Min Filter is applied Gen2.Select globalEnable = Common.CreateGen2Select(4, 2, Gen2.Bank.USER, 0x3B0, 8, new byte[] { (byte)0x00 }); Gen2.Select ocrssiMinFilter = Common.CreateGen2Select(4, 0, Gen2.Bank.USER, 0x3D0, 8, new byte[] { (byte)(0x20 | ocrssiMin - 1) }); Gen2.Select ocrssiMaxFilter = Common.CreateGen2Select(4, 2, Gen2.Bank.USER, 0x3D0, 8, new byte[] { ocrssiMax }); MultiFilter selects = new MultiFilter(new Gen2.Select[] { globalEnable, ocrssiMinFilter, ocrssiMaxFilter }); // parameters to read all three sensor codes at once Gen2.ReadData operation = new Gen2.ReadData(Gen2.Bank.RESERVED, 0xA, (byte)5); // create configuration SimpleReadPlan config = new SimpleReadPlan(Common.antennas, TagProtocol.GEN2, selects, operation, 1000); for (int i = 1; i <= readAttempts; i++) { Console.WriteLine("\nRead Attempt #" + i); // optimize settings for reading sensors reader.ParamSet("/reader/read/plan", config); reader.ParamSet("/reader/gen2/t4", (UInt32)9000); // CW delay in microseconds reader.ParamSet("/reader/gen2/session", Common.session); reader.ParamSet("/reader/gen2/q", new Gen2.DynamicQ()); // attempt to read sensor tags TagReadData[] results = reader.Read(Common.readTime); reader.ParamSet("/reader/gen2/t4", (UInt32)300); reader.ParamSet("/reader/gen2/session", Gen2.Session.S0); reader.ParamSet("/reader/gen2/q", new Gen2.StaticQ(0)); if (results.Length != 0) { foreach (TagReadData tag in results) { String epc = tag.EpcString; Console.WriteLine("* EPC: " + epc); byte[] dataBytes = tag.Data; short[] dataWords = Common.ConvertByteArrayToShortArray(dataBytes); if (dataWords.Length != 0) { int backport1Code = dataWords[0]; int backport2Code = dataWords[1]; int moistureCode = dataWords[2]; int ocrssiCode = dataWords[3]; int temperatureCode = dataWords[4]; // On-Chip RSSI Sensor Console.WriteLine(" - On-Chip RSSI: " + ocrssiCode); // Moisture Sensor String moistureStatus; if (ocrssiCode < 5) { moistureStatus = "power too low"; } else if (ocrssiCode > 21) { moistureStatus = "power too high"; } else { moistureStatus = moistureCode + " at " + tag.Frequency + " kHz"; } Console.WriteLine(" - Moisture: " + moistureStatus); // Temperature Sensor String temperatureStatus; if (ocrssiCode < 5) { temperatureStatus = "power too low"; } else if (ocrssiCode > 18) { temperatureStatus = "power too high"; } else if (temperatureCode < 1000 || 3500 < temperatureCode) { temperatureStatus = "bad read"; } else { try { // read, decode and apply calibration one tag at a time short[] calibrationWords = Common.ReadMemBlockByEpc(reader, tag, Gen2.Bank.USER, 0x12, 4); TemperatureCalibration cal = new TemperatureCalibration(calibrationWords); if (cal.valid) { double temperatureValue = cal.slope * temperatureCode + cal.offset; temperatureStatus = temperatureValue.ToString("0.00") + " degC"; } else { temperatureStatus = "invalid calibration"; } } catch (Exception) { temperatureStatus = "failed to read calibration"; } } Console.WriteLine(" - Temperature: " + temperatureStatus); // Backport 1 Sensor String backport1Status; if (ocrssiCode < 5) { backport1Status = "power too low"; } else if (ocrssiCode > 18) { backport1Status = "power too high"; } else { backport1Status = backport1Code + ""; } Console.WriteLine(" - Backport 1: " + backport1Status); // Backport 1 Sensor String backport2Status; if (ocrssiCode < 5) { backport2Status = "power too low"; } else if (ocrssiCode > 18) { backport2Status = "power too high"; } else { backport2Status = backport2Code + ""; } Console.WriteLine(" - Backport 2: " + backport2Status); } } } else { Console.WriteLine("No tag(s) found"); } Console.WriteLine(); } } catch (Exception e) { Console.WriteLine("Error: " + e.ToString()); Environment.Exit(-1); } }
public void EnableReader() { try { // Make sure reader is connected _ObjReader = ReadMgr.GetReader(); if (_ObjReader == null) { //if (scannerstatuslabel != null) //{ // scannerstatuslabel.Text = "RFID Reader Failed!"; // scannerstatuslabel.Visible = true; //} if (OnTagReadException != null) { OnTagReadException.Invoke(this, new ReaderExceptionEventArgs(new ReaderException("RFID Reader Failed!"))); } return; } System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); Cursor.Current = Cursors.WaitCursor; try { // MCS++ //Check the battery power level switch (BatteryStatusCheck()) { case 1: //Battery percentage low throw new Exception("Battery level is too low to read tags."); //MessageBox.Show(); //return; case 2: //Battery Voltage low throw new Exception("Battery voltage is too low to read tags."); //MessageBox.Show(); //return; } // MCS-- properties["isreading"] = "yes"; Utility.SaveConfigurations(properties); //disable read power coverage ReadMgr.GetReader().ParamSet("/reader/transportTimeout", 2000); string storagevalue = properties["readpower"]; int powerLevel = Convert.ToInt32(storagevalue); ReadMgr.GetReader().ParamSet("/reader/radio/readPower", powerLevel); Utility.SwitchRegion(properties["region"]); // MCS++ #if MCS_NOMAD ReadMgr.GetReader().ParamSet("/reader/antenna/txRxMap", new int[][] { new int[] { 1, 1, 1 } }); ant.Add(1); #else // MCS++ - Will we use 1 or 2 antenna? ReadMgr.GetReader().ParamSet("/reader/antenna/txRxMap", new int[][] { new int[] { 2, 2, 2 } }); // MCS-- #endif // MCS-- SimpleReadPlan plan = new SimpleReadPlan(ant.ToArray(), TagProtocol.GEN2); ReadMgr.GetReader().ParamSet("/reader/read/plan", plan); //set properties ReadMgr.GetReader().ParamSet("/reader/read/asyncOffTime", 50); ReadMgr.GetReader().ParamSet("/reader/powerMode", Reader.PowerMode.FULL); //set the tag population settings ReadMgr.GetReader().ParamSet("/reader/gen2/target", Gen2.Target.A);//default target string tagPopulation = properties["tagpopulation"]; switch (tagPopulation) { case "small": ReadMgr.GetReader().ParamSet("/reader/gen2/q", new Gen2.StaticQ(2)); ReadMgr.GetReader().ParamSet("/reader/gen2/session", Gen2.Session.S0); ReadMgr.GetReader().ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M4); break; case "medium": ReadMgr.GetReader().ParamSet("/reader/gen2/q", new Gen2.StaticQ(4)); ReadMgr.GetReader().ParamSet("/reader/gen2/session", Gen2.Session.S1); ReadMgr.GetReader().ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M4); break; case "large": ReadMgr.GetReader().ParamSet("/reader/gen2/q", new Gen2.StaticQ(6)); ReadMgr.GetReader().ParamSet("/reader/gen2/session", Gen2.Session.S1); ReadMgr.GetReader().ParamSet("/reader/gen2/tagEncoding", Gen2.TagEncoding.M2); break; default: break; } if (null != properties) { Utility.SetReaderSettings(ReadMgr.GetReader(), properties); } else { throw new Exception("properties are null"); } //MessageBox.Show("properties are null"); //set the read plan and filter TagFilter filter; int addressToRead = int.Parse(properties["selectionaddress"]); Gen2.Bank bank = Gen2.Bank.EPC; switch (properties["tagselection"].ToLower()) { case "None": case "epc": bank = Gen2.Bank.EPC; break; case "tid": bank = Gen2.Bank.TID; break; case "user": bank = Gen2.Bank.USER; break; case "reserved": bank = Gen2.Bank.RESERVED; break; default: break; } if ("yes" == properties["ismaskselected"]) { filter = new Gen2.Select(true, bank, (uint)addressToRead * 8, (ushort)(properties["selectionmask"].Length * 4), ByteFormat.FromHex(properties["selectionmask"])); } else { filter = new Gen2.Select(false, bank, (uint)addressToRead * 8, (ushort)(properties["selectionmask"].Length * 4), ByteFormat.FromHex(properties["selectionmask"])); } // MCS++ #if MCS_NOMAD SimpleReadPlan srp; if (properties["tagselection"].ToLower() == "none") { srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, null, 0); } else { srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, filter, 0); } ReadMgr.GetReader().ParamSet("/reader/read/plan", srp); #else // MCS++ - use antenna 2 SimpleReadPlan srp; if (properties["tagselection"].ToLower() == "none") { //srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, null, 0); srp = new SimpleReadPlan(new int[] { 2 }, TagProtocol.GEN2, null, 0); } else { //srp = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2, filter, 0); srp = new SimpleReadPlan(new int[] { 2 }, TagProtocol.GEN2, filter, 0); } ReadMgr.GetReader().ParamSet("/reader/read/plan", srp); // MCS-- #endif // MCS-- ReadMgr.GetReader().ReadException += _ObjReader_ReadException; ReadMgr.GetReader().TagRead += _ObjReader_TagRead; ReadMgr.GetReader().StartReading(); } catch (Exception ex) { writeErrorLog(ex.Message, ex); ReadMgr.GetReader().ParamSet("/reader/powerMode", Reader.PowerMode.MAXSAVE); properties["isreading"] = "no"; Utility.SaveConfigurations(properties); throw ex; } finally { Cursor.Current = Cursors.Default; } } catch (Exception ex) { writeErrorLog(ex.ToString(), ex); if (-1 != ex.Message.IndexOf("RFID reader was not found")) { //MessageBox.Show(ex.Message, "Error"); throw ex; } else { properties["isreading"] = "no"; Utility.SaveConfigurations(properties); throw ex; } } }