private void OnDetected(IFeliCaReader reader) { Idm.Value = string.Empty; Access.Value = null; Logs.Clear(); var idm = reader.ExecutePolling(0x0003); if (idm.Length == 0) { return; } var block = new ReadBlock { BlockNo = 0 }; if (!reader.ExecuteReadWoe(idm, 0x008B, block)) { return; } var blocks1 = Enumerable.Range(0, 8).Select(x => new ReadBlock { BlockNo = (byte)x }).ToArray(); var blocks2 = Enumerable.Range(8, 8).Select(x => new ReadBlock { BlockNo = (byte)x }).ToArray(); var blocks3 = Enumerable.Range(16, 4).Select(x => new ReadBlock { BlockNo = (byte)x }).ToArray(); if (!reader.ExecuteReadWoe(idm, 0x090F, blocks1) || !reader.ExecuteReadWoe(idm, 0x090F, blocks2) || !reader.ExecuteReadWoe(idm, 0x090F, blocks3)) { return; } Idm.Value = HexEncoder.ToHex(idm); Access.Value = Suica.ConvertToAccessData(block.BlockData); Logs.AddRange(blocks1.Concat(blocks2).Concat(blocks3) .Select(x => Suica.ConvertToLogData(x.BlockData)) .Where(x => x != null) .ToArray()); }
public static bool ExecuteReadWoe(this IFeliCaReader reader, byte[] idm, short serviceCode, params ReadBlock[] blocks) { var command = new byte[14 + (blocks.Length * 2)]; command[0] = (byte)command.Length; command[1] = 0x06; Buffer.BlockCopy(idm, 0, command, 2, idm.Length); command[10] = 1; command[11] = (byte)(serviceCode & 0xff); command[12] = (byte)(serviceCode >> 8); command[13] = (byte)blocks.Length; for (var i = 0; i < blocks.Length; i++) { var offset = 14 + (i * 2); command[offset] = 0x80; command[offset + 1] = blocks[i].BlockNo; } var response = reader.Access(command); if (response.Length < 12) { return(false); } if ((response[10] != 0x00) || (response[11] != 0x00)) { return(false); } if (response.Length < (13 + (response[12] * 16))) { return(false); } for (var i = 0; i < blocks.Length; i++) { var offset = 13 + (16 * i); blocks[i].BlockData = response.SubArray(offset, 16); } return(true); }
public static byte[] ExecutePolling(this IFeliCaReader reader, short systemCode) { var command = new byte[6]; command[0] = (byte)command.Length; command[1] = 0x00; command[2] = (byte)(systemCode >> 8); command[3] = (byte)(systemCode & 0xFF); command[4] = 0x01; command[5] = 0x00; var response = reader.Access(command); if (response.Length < 18) { return(Array.Empty <byte>()); } return(response.SubArray(2, 8)); }