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());
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
        }