При использовании устройства чтения карт, которое я использую, протокол для получения серийного номера карты MIFARE выглядит следующим образом:
Антиколлизия Mifare,
0x0202
:
Функциональная карта антиколлизии
Форматaa bb 05 00 00 00 02 02 00
Ответaa bb 0a 00 52 51 02 02 00 46 ff a6 b8 a4
Где 46 ff a6 b8
— серийный номер карты в приведенном выше ответе.
Я реализую этот протокол на С# следующим образом:
private SerialPort _serialPort = new SerialPort();
private string _receivedData = null;
public MifareCardReader(string comPort, int baudRate)
{
_serialPort = new SerialPort();
_serialPort.PortName = comPort;
_serialPort.BaudRate = baudRate;
_serialPort.DataBits = 8;
_serialPort.Parity = Parity.None;
_serialPort.StopBits = StopBits.One;
_serialPort.Handshake = Handshake.None;
_serialPort.Open();
// Add event
_serialPort.DataReceived += SerialPort_DataReceived;
}
public string MifareAnticollision()
{
if (_serialPort != null && _serialPort.IsOpen)
{
string message = "AABB050000000202000D";
byte[] data = StringToByteArray(message);
_serialPort.Write(data, 0, data.Length);
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
_receivedData += _serialPort.ReadExisting();
byte[] data = Encoding.ASCII.GetBytes(receivedData);
if (data.Length >= 9)
{
if (data[8] == 0) // OK
{
// Response data is complete
if (data.Length == 14)
{
StringBuilder hex = new StringBuilder(8);
hex.AppendFormat("{0:X2}", data[9]);
hex.AppendFormat("{0:X2}", data[10]);
hex.AppendFormat("{0:X2}", data[11]);
hex.AppendFormat("{0:X2}", data[12]);
string cardID = hex.ToString();
_receivedData = string.Empty;
}
}
else // fail
{
_receivedData = string.Empty;
}
}
}
Я проверил это с 3 разными картами MIFARE, однако результат оказался не таким, как я ожидал:
- Карта 1: получено:
3F463F3F
, ожидается:974682D6
- Карта 2: получено:
3F450B3F
, ожидается:EA450B91
- Карточка 3: получено:
070D3F3F
, ожидается:070DEBD6
Что мне нужно изменить, чтобы получить правильный результат?
REQA
(в вашем случае команда 0x0201) должна предшествоватьCL1
(в вашем случае команда 0x0202). - person vlp   schedule 10.11.2015