如何有选择地写入 RFID 标签?

How to write selectively to an RFID tag?

如何在不使用 For 循环的情况下有效地写入 RFID 标签。现在我正在循环并填充系列中的所有块。我想制作一个程序,我可以用特定的值填充特定的块。我想知道是否有其他方法可以在 RFID 上写入。下面的代码显示了使用跳过整数的 for 循环在 RFID 上写入。

这是我的代码:

Private Sub RFIDAuth()
    Dim SkipBlock As String
    SkipBlock = ",3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,"
    For i = 1 To 62
        If SkipBlock.Contains("," & CStr(i) & ",") = False Then
            Call ClearBuffers()
            SendBuff(0) = &HFF                      'CLA
            SendBuff(2) = &H0                       'P1: same for all source types
            SendBuff(1) = &H86                      'INS: for stored key input
            SendBuff(3) = &H0                       'P2: for stored key input
            SendBuff(4) = &H5                       'P3: for stored key input
            SendBuff(5) = &H1                       'Byte 1: version number
            SendBuff(6) = &H0                       'Byte 2
            SendBuff(7) = CInt(i)         'Byte 3: sectore no. for stored key input

            SendBuff(8) = &H60                  'Byte 4 : Key A for stored key input
            'SendBuff(8) = &H61                  'Byte 4 : Key B for stored key input
            SendBuff(9) = &H20                  'Byte 5 : Session key for volatile memory
            'SendBuff(9) = CDec(<INPUT>)    'Byte 5 : Session key for non-volatile memory
            SendLen = &HA
            RecvLen = &H2

            retCode = SendAPDUandDisplay(0)
            Base64StrfrmRFID = Base64StrfrmRFID & RFIDRead(i)

        End If
    Next
End Sub

SkipBlock:HashSet 而不是字符串

SkipBlock 字符串和 Contains(…) 对我来说很奇怪,使用 HashSet<int> 除非有充分的理由使用字符串:

HashSet<int> SkipBlock = new HashSet<int>(){ 3, 7, 11, … };

及以后:

if (SkipBlock.Contains(i)) {

RFID 布局的结构

使用struct指定RFID的布局:

[StructLayout (LayoutKind.Explicit, Pack=1, Size=…)]
struct RFID_Block {
     [FieldOffset(0)] public const byte CLA = 0xFF;
     [FieldOffset(1)] public const byte INS = 0x86;
     [FieldOffset(2)] public const byte P1 = 0x0;
     …
     [FieldOffset(7)] public int SectorNumber; // Should this be an int or a byte?
};

RFID_Block block1 = new RFID_Block();
block1.SectorNumber = i;
…
  • 对每个块都相同的字段使用常量,对可能不同的字段使用非常量字段。
  • 如果一个字段在不同种类的RFID块中有不同的含义,可以定义相同的FieldOffset字段,即:

    struct DualUseRFID_Block {
         …
         // Stored key input block
         [FieldOffset(2)] public byte P2;
         [FieldOffset(3)] public byte P3;
    
         // Some other kind of RFID Block:
         [FieldOffset(2)] public word FooBar;
    

    注:

    • 首先,FooBarP2 具有相同的字段偏移量;
    • 其次,FooBarP2属于不同类型;和
    • 第三,FooBar占用内存space与P2P3要么FooBar要么P2P3 包含有效数据。
  • 检查字段的大小不要混淆byteint(4字节);即使用 int 然后偏移多一个字节的东西会出现问题(例如 SendBuff(7) = CInt(i): Sendbuf(8) = &H60)。
  • 检查C#和RFID芯片是否同意"endianess"。

参考资料