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));
}
}