/// <summary>
        /// Command that implements extended write mode to facilitate communications with an ISO 7816-4 based credential to a PD.
        /// </summary>
        /// <summary>Request to get the capabilities of the PD.</summary>
        /// <param name="connectionId">Identify the connection for communicating to the device.</param>
        /// <param name="address">Address assigned to the device.</param>
        /// <param name="extendedWrite">The extended write data.</param>
        /// <returns>Reply data that is returned after sending the command. There is the possibility of different replies can be returned from PD.</returns>
        public async Task <ReturnReplyData <ExtendedRead> > ExtendedWriteData(Guid connectionId, byte address,
                                                                              ExtendedWrite extendedWrite)
        {
            var reply = await SendCommand(connectionId,
                                          new ExtendedWriteDataCommand(address, extendedWrite)).ConfigureAwait(false);

            return(new ReturnReplyData <ExtendedRead>
            {
                Ack = reply.Type == ReplyType.Ack,
                Nak = reply.Type == ReplyType.Nak ? Nak.ParseData(reply.ExtractReplyData) : null,
                ReplyData = reply.Type == ReplyType.ExtendedRead ? ExtendedRead.ParseData(reply.ExtractReplyData) : null
            });
        }
Exemple #2
0
        private static async Task Main()
        {
            var builder = new ConfigurationBuilder()
                          .AddJsonFile($"appsettings.json", true, true);
            var    config        = builder.Build();
            var    osdpSection   = config.GetSection("OSDP");
            string portName      = osdpSection["PortName"];
            int    baudRate      = int.Parse(osdpSection["BaudRate"]);
            byte   deviceAddress = byte.Parse(osdpSection["DeviceAddress"]);
            byte   readerNumber  = byte.Parse(osdpSection["ReaderNumber"]);

            var panel = new ControlPanel();

            panel.ConnectionStatusChanged += (sender, eventArgs) =>
            {
                Console.WriteLine($"Device is {(eventArgs.IsConnected ? "Online" : "Offline")}");
            };
            panel.NakReplyReceived += (sender, args) =>
            {
                Console.WriteLine($"Received NAK {args.Nak}");
            };
            panel.ExtendedReadReplyReceived += (sender, eventArgs) =>
            {
                Task.Run(async() =>
                {
                    if (!_readyForSmartCardRead)
                    {
                        return;
                    }

                    try
                    {
                        if (eventArgs.ExtendedRead.Mode == 1 && eventArgs.ExtendedRead.PReply == 1)
                        {
                            _readyForSmartCardRead = false;

                            var response = await panel.ExtendedWriteData(_connectionId, deviceAddress,
                                                                         ExtendedWrite.ModeOneSmartCardScan(readerNumber));
                            if (eventArgs.ExtendedRead.Mode == 1 && response.ReplyData?.PReply == 1)
                            {
                                Console.WriteLine("Card Present");
                                while (true)
                                {
                                    Console.WriteLine("Enter APDU data, leave blank to terminate:");
                                    var data = Console.ReadLine()?.Trim();
                                    if (string.IsNullOrWhiteSpace(data))
                                    {
                                        break;
                                    }

                                    response = await panel.ExtendedWriteData(_connectionId, deviceAddress,
                                                                             ExtendedWrite.ModeOnePassAPDUCommand(readerNumber, StringToByteArray(data)));
                                    if (response.ReplyData == null)
                                    {
                                        break;
                                    }

                                    Console.WriteLine(
                                        $"Received extended reply {response.ReplyData.Mode}:{response.ReplyData.PReply}:{BitConverter.ToString(response.ReplyData.PData).Replace("-", string.Empty)}");
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }

                    if (eventArgs.ExtendedRead.Mode == 1)
                    {
                        try
                        {
                            Console.WriteLine("Disconnecting from SmartCard");
                            await panel.ExtendedWriteData(_connectionId, deviceAddress,
                                                          ExtendedWrite.ModeOneTerminateSmartCardConnection(readerNumber));
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e);
                        }
                        finally
                        {
                            _readyForSmartCardRead = true;
                        }
                    }
                });
            };
            panel.RawCardDataReplyReceived += (sender, eventArgs) =>
            {
                Console.WriteLine($"Raw card read {FormatData(eventArgs.RawCardData.Data)}");
            };

            _connectionId = panel.StartConnection(new SerialPortOsdpConnection(portName, baudRate));
            panel.AddDevice(_connectionId, 0, true, true);

            Timer timer = new Timer(5000);

            timer.Elapsed += (sender, eventArgs) =>
            {
                Task.Run(async() =>
                {
                    timer.Stop();
                    try
                    {
                        if (_readyForSmartCardRead && panel.IsOnline(_connectionId, deviceAddress))
                        {
                            Console.WriteLine("Checking SmartCard settings");
                            var response = await panel.ExtendedWriteData(_connectionId, deviceAddress, ExtendedWrite.ReadModeSetting());
                            if (response.ReplyData == null)
                            {
                                panel.ResetDevice(_connectionId, 0);
                            }
                            else if (response.ReplyData.Mode == 0 && response.ReplyData.PReply == 1 && response.ReplyData.PData[0] == 0)
                            {
                                await panel.ExtendedWriteData(_connectionId, 0, ExtendedWrite.ModeOneConfiguration());
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                    finally
                    {
                        timer.Start();
                    }
                });
            };

            timer.Start();

            await Task.Delay(TimeSpan.FromDays(7));
        }
 public ExtendedWriteDataCommand(byte address, ExtendedWrite extendedWrite)
 {
     _extendedWrite = extendedWrite;
     Address        = address;
 }