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

时间:2015-04-08 08:34:23

标签: vb.net rfid

如何在不使用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

1 个答案:

答案 0 :(得分:0)

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占用与P2P3相同的内存空间,FooBarP2P3包含有效数据。< / LI>
  • 检查字段的大小不要混淆byteint(4个字节);即,使用int,然后使用偏移量超过一个字节的内容就会出现问题(例如SendBuff(7) = CInt(i): Sendbuf(8) = &H60)。
  • 检查C#和RFID芯片是否同意&#34; endianess&#34;。

参考