diff --git a/CardReaderService/CardReaderService/CardReaderService.csproj b/CardReaderService/CardReaderService/CardReaderService.csproj index 8720927..b2fd0d4 100644 --- a/CardReaderService/CardReaderService/CardReaderService.csproj +++ b/CardReaderService/CardReaderService/CardReaderService.csproj @@ -38,8 +38,8 @@ ..\packages\Newtonsoft.Json.10.0.1\lib\net45\Newtonsoft.Json.dll True - - ..\packages\PCSC.3.6.0\lib\net40\pcsc-sharp.dll + + ..\packages\PCSC.4.2.0\lib\net40\PCSC.dll True diff --git a/CardReaderService/CardReaderService/Service1.cs b/CardReaderService/CardReaderService/Service1.cs index 9302933..1943312 100644 --- a/CardReaderService/CardReaderService/Service1.cs +++ b/CardReaderService/CardReaderService/Service1.cs @@ -1,11 +1,13 @@ using PCSC; using System; +using System.CodeDom; using System.Collections.Generic; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading; using Logger; +using PCSC.Monitoring; namespace CardReaderService { @@ -13,10 +15,9 @@ namespace CardReaderService { private Thread _mainWorkThread; private bool _stopMainWorkerThread; - private AutoResetEvent _mainWorkerTerminationSignal; - private string _readerName = ""; + + private string _readerName = string.Empty; private SCardMonitor _cardMonitor; - private bool _initialised=false; public Service1() { @@ -28,65 +29,53 @@ namespace CardReaderService OnStart(new string[] { }); } + public new void Stop() + { + OnStop(); + base.Stop(); + } + protected override void OnStart(string[] args) { -<<<<<<< HEAD - StartWorkerThread(); - } -======= - Console.WriteLine("Starting.. Getting available readers"); - MessageLogger.Log("Starting.. Getting available readers"); + MessageLogger.Log("Starting.. "); var ctxFactory = ContextFactory.Instance; - using(var context = ctxFactory.Establish(SCardScope.System)) + using (var context = ctxFactory.Establish(SCardScope.System)) { + MessageLogger.Log("Getting Card Readers"); var readerNames = context.GetReaders(); if (NoReaderAvailable(readerNames)) { - Console.WriteLine("No Card Reader is available, Exiting.."); - MessageLogger.Log("No Card Reader is available, Exiting.."); - return; + MessageLogger.Log("No Card Reader available, Exiting.."); } - Console.WriteLine("Choosing first available reader: " + readerNames.First()); - MessageLogger.Log("Choosing first available reader: " + readerNames.First()); - _readerName = readerNames.First(); - _cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System); - _cardMonitor.CardInserted += _cardMonitor_CardInserted; - _cardMonitor.Start(_readerName); ->>>>>>> retarget for .net 4.5 (from 4.5.2) for mono support. - - private bool WeHaveValidCardReader() - { - if (_cardMonitor == null) - { - return false; + else + { + MessageLogger.Log("Choosing first available reader: " + readerNames.First()); + _readerName = readerNames.First(); + _cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System); + _cardMonitor.CardInserted += CardMonitor_CardInserted; + _cardMonitor.StatusChanged += CardMonitorOnStatusChanged; + _cardMonitor.Start(_readerName); + } + StartWorkerThread(); } - Console.WriteLine(_cardMonitor.GetCurrentState(0)); - if (_cardMonitor.GetCurrentState(0) == SCRState.Unknown - || _cardMonitor.GetCurrentState(0) == SCRState.Unavailable - || _cardMonitor.GetCurrentState(0) == (SCRState.Ignore | SCRState.Unavailable) - //|| _cardMonitor.GetCurrentState(0) == SCRState.Unaware //if we say this is an invalid state, we cause a memory leak where we create a duplicate card monitor, subscribe and overwrite. - ) - { - return false; - } - return true; - } - - public void Stop() - { - OnStop(); } protected override void OnStop() { + MessageLogger.Log("Stopping.."); _stopMainWorkerThread = true; - _mainWorkerTerminationSignal.Set(); if (_mainWorkThread != null && _mainWorkThread.IsAlive) { - _mainWorkThread.Interrupt(); + _mainWorkThread.Join(3000); + if (_mainWorkThread.IsAlive) + { + _mainWorkThread.Interrupt(); + } } if (_cardMonitor != null) { + _cardMonitor.CardInserted -= CardMonitor_CardInserted; + _cardMonitor.StatusChanged -= CardMonitorOnStatusChanged; _cardMonitor.Cancel(); _cardMonitor.Dispose(); _cardMonitor = null; @@ -101,96 +90,101 @@ namespace CardReaderService Name = "CardServiceMainThread", IsBackground = false }; - _mainWorkerTerminationSignal = new AutoResetEvent(false); _mainWorkThread.Start(); } - private void _cardMonitor_CardInserted(object sender, CardStatusEventArgs e) + private void CardMonitor_CardInserted(object sender, CardStatusEventArgs e) { var ctxFac = ContextFactory.Instance; using (var ctx = ctxFac.Establish(SCardScope.System)) { var reader = new SCardReader(ctx); - var pioSendPci = new IntPtr(); byte[] rcvBuffer = new byte[256]; if (_readerName == string.Empty) { - Console.WriteLine("Reader name is somehow empty... WTF!"); + MessageLogger.Log("Reader name is somehow empty... WTF!"); _stopMainWorkerThread = true; return; } - var err = reader.Connect(_readerName, SCardShareMode.Shared, SCardProtocol.T0 | SCardProtocol.T1); - + var err = reader.Connect(_readerName, SCardShareMode.Shared, SCardProtocol.Any); if (err == SCardError.Success) { - var uIdcmd = new byte[] { 0xFF, 0xCA, 0x00, 0x00, 0x00 }; + var pci = SCardPCI.GetPci(reader.ActiveProtocol); + + err = reader.Transmit(pci, CardCommands.GetUid, ref rcvBuffer); - err = reader.Transmit(pioSendPci, uIdcmd, ref rcvBuffer); if (err == SCardError.Success) { var uid = ConvertByteUIDToString(rcvBuffer); var atrString = ConvertByteUIDToString(e.Atr); - Console.WriteLine("Card Inserted, ATR: " + atrString + ", and UID is: " + uid); - CardDataPost postObj = new CardDataPost { CardUId = uid }; + MessageLogger.Log("Card Inserted, ATR: " + atrString + ", and UID is: " + uid); + + CardDataPost postObj = new CardDataPost { CardUId = uid, UtcTimeStamp = DateTime.UtcNow}; DataCenterHelper.PostAsync(postObj, "/api/swipedata"); - Console.WriteLine("Posted to Server"); + MessageLogger.Log("Posted to Server"); + } + else + { + MessageLogger.Log("Failed to Read UID, Error: "+ err); } } else { - Console.WriteLine("Reader failed to connect, error: " + Enum.GetName(typeof(SCardError), err)); + MessageLogger.Log("Reader failed to connect, error: " + Enum.GetName(typeof(SCardError), err)); } - } } private void MainWorkerThread() { + var minimumLoopTimemS = 5000; + while (!_stopMainWorkerThread) { - if (!WeHaveValidCardReader()) - { //only do this if we don't have a valid card reader - if (_initialised) - { - //card reader no longer available, tidy up. - _cardMonitor.Cancel(); - _cardMonitor.CardInserted -= _cardMonitor_CardInserted; - _cardMonitor.Dispose(); - _cardMonitor = null; - _initialised = false; - } - Console.WriteLine("Starting.. Getting available readers"); + if (_cardMonitor == null) + { var ctxFactory = ContextFactory.Instance; using (var context = ctxFactory.Establish(SCardScope.System)) { var readerNames = context.GetReaders(); - if (!NoReaderAvailable(readerNames)) + if (NoReaderAvailable(readerNames)) { - //we have a reader available, so initialise! - Console.WriteLine("Choosing first available reader: " + readerNames.First()); - _readerName = readerNames.First(); - _cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System); - _cardMonitor.CardInserted += _cardMonitor_CardInserted; - _cardMonitor.Start(_readerName); - - _initialised = true; + MessageLogger.Log("No Card Reader available, Waiting.."); } else { - Console.WriteLine("No Card Reader is available.."); + MessageLogger.Log("Choosing first available reader: " + readerNames.First()); + _readerName = readerNames.First(); + _cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System); + _cardMonitor.CardInserted += CardMonitor_CardInserted; + _cardMonitor.StatusChanged += CardMonitorOnStatusChanged; + _cardMonitor.Start(_readerName); } } } - _mainWorkerTerminationSignal.WaitOne(3000); + //dont actually need to do anything.. but cannot exit right away? + } + } + + private void CardMonitorOnStatusChanged(object sender, StatusChangeEventArgs e) + { + if ((e.NewState & SCRState.Unavailable) == SCRState.Unavailable && (e.NewState & SCRState.Ignore) == SCRState.Ignore) + { + Console.WriteLine("Card Reader Disconnected"); + _cardMonitor.CardInserted -= CardMonitor_CardInserted; + _cardMonitor.Cancel(); + _cardMonitor.Dispose(); + _cardMonitor = null; + _readerName = string.Empty; } } private string ConvertByteUIDToString(byte[] uid) { - var sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); foreach (var b in uid) { @@ -205,4 +199,9 @@ namespace CardReaderService return readerNames == null || readerNames.Count < 1; } } + + internal class CardCommands + { + public static readonly byte[] GetUid = {0xFF, 0xCA, 0x00, 0x00, 0x08}; + } } diff --git a/CardReaderService/CardReaderService/packages.config b/CardReaderService/CardReaderService/packages.config index 7559bf1..9067d0d 100644 --- a/CardReaderService/CardReaderService/packages.config +++ b/CardReaderService/CardReaderService/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/CardReaderService/CardReaderServiceHost/CardReaderServiceHost.csproj b/CardReaderService/CardReaderServiceHost/CardReaderServiceHost.csproj index d1273a2..db0a5cd 100644 --- a/CardReaderService/CardReaderServiceHost/CardReaderServiceHost.csproj +++ b/CardReaderService/CardReaderServiceHost/CardReaderServiceHost.csproj @@ -34,8 +34,8 @@ 4 - - ..\CardReaderService\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.10.0.1\lib\net45\Newtonsoft.Json.dll True diff --git a/CardReaderService/CardReaderServiceHost/Program.cs b/CardReaderService/CardReaderServiceHost/Program.cs index fc8886a..4e9511f 100644 --- a/CardReaderService/CardReaderServiceHost/Program.cs +++ b/CardReaderService/CardReaderServiceHost/Program.cs @@ -9,7 +9,7 @@ namespace CardReaderServiceHost { Service1 service1 = new Service1(); service1.Start(); - Console.WriteLine("Service Running..."); + Console.WriteLine("Service Running... Enter To Stop"); Console.ReadLine(); service1.Stop(); } diff --git a/CardReaderService/CardReaderServiceHost/packages.config b/CardReaderService/CardReaderServiceHost/packages.config index 9d64bf3..4ffc59b 100644 --- a/CardReaderService/CardReaderServiceHost/packages.config +++ b/CardReaderService/CardReaderServiceHost/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/CardReaderService/Logger/MessageLogger.cs b/CardReaderService/Logger/MessageLogger.cs index 3659624..e8aa791 100644 --- a/CardReaderService/Logger/MessageLogger.cs +++ b/CardReaderService/Logger/MessageLogger.cs @@ -13,6 +13,7 @@ namespace Logger public static void Log(string message) { + Console.WriteLine(message); System.IO.File.WriteAllText(_logPath, string.Format("{0} | {1}", DateTime.Now, message)); } }