using Akari.Provider.WaveshareUART.Users; using System; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using WaveshareUARTFingerprintSensor; namespace Akari.Provider.WaveshareUART { public class TcpService { public FingerprintSensor FingerprintSensor => WaveshareUARTProvider.Instance.FingerprintSensor; public UsersManager UsersManager => WaveshareUARTProvider.Instance.UsersManager; private string _ip; private int _port; public TcpService() { } public void Start() { Console.WriteLine("Starting Tcp service..."); InitTcp(); Console.WriteLine($"There is {UsersManager.Count} users registered"); FingerprintSensor.Waked += FingerprintSensor_Waked; FingerprintSensor.Sleep(); Console.WriteLine("Waiting for fingerprints..."); Thread.Sleep(-1); FingerprintSensor.Waked -= FingerprintSensor_Waked; } private void InitTcp() { try { _ip = File.ReadAllText(WaveshareUARTProvider.ServerIPFilePath); _port = int.Parse(File.ReadAllText(WaveshareUARTProvider.ServerPortFilePath)); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(e); Console.WriteLine(); Console.WriteLine($"Couldn't read setting files"); Console.WriteLine($"Launch the program with '-c' to config the provider"); Environment.Exit(1); } } private void SendAuth(User user) { using (var client = new TcpClient(_ip, _port)) { var stream = client.GetStream(); var data = Convert.FromBase64String(user.Token); stream.Write(data, 0, data.Length); } } private void FingerprintSensor_Waked(FingerprintSensor sender) { FingerprintSensor.Wake(); if (FingerprintSensor.TryComparison1N(out var userInfo)) { if (TryFindUser(userInfo.userID, out var user)) { Console.WriteLine($"{user.Name} fingerprint recognized"); try { SendAuth(user); } catch (Exception e) { var oldColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Tried to send an auth packet but an error occured."); Console.WriteLine(); Console.WriteLine(e); Console.ForegroundColor = oldColor; } } else { Console.WriteLine($"Found unknown fingerprint with id {userInfo.userID}"); } } FingerprintSensor.Sleep(); } private bool TryFindUser(ushort userID, out User user) { ushort id = (ushort)((userID / UsersManager.RangeLength) * UsersManager.RangeLength + UsersManager.RangeStart); if (UsersManager[id] is User u) { user = u; return true; } user = default; return false; } } }