如何有选择地写入 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;
注:
- 首先,
FooBar
与 P2
具有相同的字段偏移量;
- 其次,
FooBar
与P2
属于不同类型;和
- 第三,
FooBar
占用内存space与P2
和P3
要么FooBar
要么P2
和P3
包含有效数据。
- 检查字段的大小不要混淆
byte
和int
(4字节);即使用 int
然后偏移多一个字节的东西会出现问题(例如 SendBuff(7) = CInt(i): Sendbuf(8) = &H60
)。
- 检查C#和RFID芯片是否同意"endianess"。
参考资料
- 见MSDN about the StructLayout-attribute
- 见MSDN about using structs
- 参见MSDN Structs tutorial;它包含有关内存布局的详细信息,如果您愿意,结构中的字段可以重叠。
如何在不使用 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;
注:
- 首先,
FooBar
与P2
具有相同的字段偏移量; - 其次,
FooBar
与P2
属于不同类型;和 - 第三,
FooBar
占用内存space与P2
和P3
要么FooBar
要么P2
和P3
包含有效数据。
- 首先,
- 检查字段的大小不要混淆
byte
和int
(4字节);即使用int
然后偏移多一个字节的东西会出现问题(例如SendBuff(7) = CInt(i): Sendbuf(8) = &H60
)。 - 检查C#和RFID芯片是否同意"endianess"。
参考资料
- 见MSDN about the StructLayout-attribute
- 见MSDN about using structs
- 参见MSDN Structs tutorial;它包含有关内存布局的详细信息,如果您愿意,结构中的字段可以重叠。