using System; using System.Net.Http; using System.Threading.Tasks; using OpenCvSharp; using Newtonsoft.Json; namespace AIParkingApplication { public class ApiController : IDisposable { private HttpClient httpClient; private bool isHttpClientDisposabled; private int numberOfRetry; public ApiController(string baseAddress, int numberOfRetry = 5) { httpClient = new HttpClient { BaseAddress = new Uri(baseAddress), Timeout = TimeSpan.FromSeconds(5) }; isHttpClientDisposabled = false; this.numberOfRetry = numberOfRetry; } ~ApiController() { Dispose(); } public async Task Login(LoginModel loginData) { try { HttpResponseMessage response = await httpClient.PostAsJsonAsync("/api/login", loginData); response.EnsureSuccessStatusCode(); var loginResult = await response.Content.ReadAsAsync(); return loginResult; } catch (Exception ex) { Console.WriteLine($"Login Exception:\t{DateTime.Now.ToString(AppConstant.DATETIME_FORMAT)} \t {ex.Message}"); return new LoginDataModel { IsLoginSuccess = false }; } } public async Task GetStatisticInfo() { try { HttpResponseMessage response = await httpClient.GetAsync("/api/statistics"); response.EnsureSuccessStatusCode(); Statistic.ParkInfo parkingInfo = await response.Content.ReadAsAsync(); if (string.IsNullOrEmpty(parkingInfo.TotalIn)) { parkingInfo.TotalIn = "0"; } if (string.IsNullOrEmpty(parkingInfo.TotalOut)) { parkingInfo.TotalOut = "0"; } return parkingInfo; } catch (Exception ex) { Console.WriteLine($"GetStatisticInfo Exception:\t{DateTime.Now.ToString(AppConstant.DATETIME_FORMAT)} \t {ex.Message}"); return new Statistic.ParkInfo(); } } public async Task GetCardInformation(string cardNumber) { try { var request = new CardModel() { CardNumber = cardNumber }; HttpResponseMessage response = await httpClient.PostAsJsonAsync("/api/check-card", request); response.EnsureSuccessStatusCode(); var cardValication = await response.Content.ReadAsAsync(); return cardValication; } catch (Exception ex) { Console.WriteLine($"CheckCard Exception:\t{DateTime.Now.ToString(AppConstant.DATETIME_FORMAT)} \t {ex.Message}"); return new CardInformation(); } } //Neu Dicrection la Out thi logID la logID lay ve khi check the public async Task SaveLog(LaneDirection direction, string cardID, string cameraID, PlateType plateType, string timestamp, string plateString, Mat plateImage, Mat plateImageResult, Mat PlateFrameImage, Mat FrameImage, string logID = "") { string plateImageBase64 = Convert.ToBase64String(plateImage.ToBytes()); string plateImageResultBase64 = Convert.ToBase64String(plateImageResult.ToBytes()); string PlateFrameImageBase64 = Convert.ToBase64String(PlateFrameImage.ToBytes()); string FrameImageBase64 = Convert.ToBase64String(FrameImage.ToBytes()); try { var request = new SaveLogModel { Direction = direction == LaneDirection.In ? "in" : "out", LogID = logID, CardID = cardID, TextPlate = plateString, CameraID = cameraID, ModePlate = plateType == PlateType.Square ? "1":"0", Timestamp = timestamp, PlateImage = plateImageBase64, PlateResultImage = plateImageResultBase64, PlateFrameImage = PlateFrameImageBase64, FrameImage = FrameImageBase64 }; HttpResponseMessage response = await httpClient.PostAsJsonAsync("/api/save-logs", request); response.EnsureSuccessStatusCode(); SaveLogRespone saveLogRespone = await response.Content.ReadAsAsync(); return saveLogRespone; } catch (Exception ex) { Console.WriteLine($"SaveLog Exception:\t{DateTime.Now.ToString(AppConstant.DATETIME_FORMAT)} \t {ex.Message}"); return new SaveLogRespone(); } } public void Dispose() { if (httpClient != null && !isHttpClientDisposabled) { isHttpClientDisposabled = true; httpClient.Dispose(); } } } #region Check card validation API Data Model public class CardModel { [JsonProperty("card")] public string CardNumber { get; set; } } public class CardInformation { [JsonProperty("status")] public bool IsValid { get; set; } [JsonProperty("type")] public string Direction { get; set; } [JsonProperty("cardID")] public string CardIP { get; set; } [JsonProperty("cardRealID")] public int CardRealID { get; set; } [JsonProperty("log_id")] public int LogID { get; set; } [JsonProperty("cardType")] public string CardType { get; set; } [JsonProperty("vehicleType")] public string VehicleType { get; set; } [JsonProperty("autoOpen")] public bool AutoOpenDoor { get; set; } [JsonProperty("plate")] public string Plate { get; set; } [JsonProperty("time")] public string TimeIn { get; set; } [JsonProperty("plateImage")] public string PlateImageBase64 { get; set; } [JsonProperty("frameImage")] public string FrameImageBase64 { get; set; } [JsonProperty("faceImage")] public string FaceImageBase64 { get; set; } [JsonProperty("name")] public string CustomerName { get; set; } } #endregion #region Save Log API Data Model public class SaveLogRespone { [JsonProperty("status")] public bool Status { get; set; } [JsonProperty("logID")] public int LogID { get; set; } [JsonProperty("cost")] public string Cost { get; set; } } public class SaveLogModel { [JsonProperty("card")] public string CardID { get; set; } [JsonProperty("plate")] public string TextPlate { get; set; } [JsonProperty("type")] public string Direction { get; set; } [JsonProperty("mod")] public string ModePlate { get; set; } [JsonProperty("log_id")] public string LogID { get; set; } [JsonProperty("camera")] public string CameraID { get; set; } [JsonProperty("time")] public string Timestamp { get; set; } [JsonProperty("plateImage")] public string PlateImage { get; set; } [JsonProperty("plateResultImage")] public string PlateResultImage { get; set; } [JsonProperty("plateFrameImage")] public string PlateFrameImage { get; set; } [JsonProperty("frameImage")] public string FrameImage { get; set; } } #endregion #region Get Config API Data Model public class LoginModel { [JsonProperty("username")] public string Username { get; set; } [JsonProperty("password")] public string Password { get; set; } } public class LoginDataModel { [JsonProperty("status")] public bool IsLoginSuccess { get; set; } [JsonProperty("data")] public Config LoginData { get; set; } } public class Config { [JsonProperty("userID")] public int UserID { get; set; } [JsonProperty("name")] public string UserName { get; set; } [JsonProperty("configROI")] public bool IsConfigROI { get; set; } [JsonProperty("configSystemLogs")] public bool IsSaveSystemLogs { get; set; } [JsonProperty("api")] public APIPathModel APIPath { get; set; } [JsonProperty("camera1")] public CameraData CameraData1 { get; set; } [JsonProperty("camera2")] public CameraData CameraData2 { get; set; } [JsonProperty("camera3")] public CameraData CameraData3 { get; set; } [JsonProperty("camera4")] public CameraData CameraData4 { get; set; } [JsonProperty("camera5")] public CameraData CameraData5 { get; set; } [JsonProperty("camera6")] public CameraData CameraData6 { get; set; } [JsonProperty("camera7")] public CameraData CameraData7 { get; set; } [JsonProperty("camera8")] public CameraData CameraData8 { get; set; } [JsonProperty("statistic")] public Statistics StatisticsData { get; set; } [JsonProperty("cascadeConfig")] public CascadeConfig CascadeConfigData { get; set; } [JsonProperty("laneConfig")] public LaneConfig LaneConfigData { get; set; } } #region API Path public class APIPathModel { [JsonProperty("apiStatistics")] public APIProperties ApiStatistics { get; set; } [JsonProperty("apiPlateRecognize")] public APIProperties ApiPlateRecognize { get; set; } [JsonProperty("apiCheckCard")] public APIProperties ApiCheckCard { get; set; } [JsonProperty("apiSaveLogs")] public APIProperties ApiSaveLogs { get; set; } [JsonProperty("apiUpdateLogs")] public APIProperties ApiUpdateLogs { get; set; } } public class APIProperties { [JsonProperty("ip")] public string IP { get; set; } [JsonProperty("port")] public string Port { get; set; } [JsonProperty("path")] public string Path { get; set; } } #endregion public class CameraData { [JsonProperty("id")] public int Id { get; set; } [JsonProperty("gate")] public int Gate { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("type")] public string Type { get; set; } [JsonProperty("stream_url")] public string Stream_url { get; set; } [JsonProperty("minWidth")] public double MinWidth { get; set; } [JsonProperty("maxWidth")] public double MaxWidth { get; set; } [JsonProperty("minHeight")] public double MinHeight { get; set; } [JsonProperty("maxHeight")] public double MaxHeight { get; set; } [JsonProperty("scaleFactor")] public double ScaleFactor { get; set; } [JsonProperty("minNeighbors")] public double MinNeighbors { get; set; } [JsonProperty("status")] public double Status { get; set; } [JsonProperty("isRecognizeCamera")] public bool IsRecognizeCamera { get; set; } [JsonProperty("isLongPlate")] public bool IsLongPlate { get; set; } [JsonProperty("stt")] public int Stt { get; set; } [JsonProperty("roi_config")] public string Roi_config { get; set; } [JsonProperty("created_at")] public int Created_at { get; set; } [JsonProperty("modified_at")] public int Modified_at { get; set; } } public class Statistics { [JsonProperty("moto")] public string Moto { get; set; } [JsonProperty("oto")] public string Oto { get; set; } [JsonProperty("vip")] public string Vip { get; set; } [JsonProperty("total_in")] public string Total_in { get; set; } [JsonProperty("total_out")] public string Total_out { get; set; } } public class CascadeConfig { [JsonProperty("minWidthPlate")] public int MinWidthPlate { get; set; } [JsonProperty("maxWidthPlate")] public int MaxWidthPlate { get; set; } [JsonProperty("minHeightPlate")] public int MinHeightPlate { get; set; } [JsonProperty("maxHeightPlate")] public int MaxHeightPlate { get; set; } [JsonProperty("minWidthLongPlate")] public int MinWidthLongPlate { get; set; } [JsonProperty("maxWidthLongPlate")] public int MaxWidthLongPlate { get; set; } [JsonProperty("minHeightLongPlate")] public int MinHeightLongPlate { get; set; } [JsonProperty("maxHeightLongPlate")] public int MaxHeightLongPlate { get; set; } [JsonProperty("scaleFactor")] public double ScaleFactor { get; set; } [JsonProperty("scaleFactorLong")] public double ScaleFactorLong { get; set; } [JsonProperty("minNeighbors")] public double MinNeighbors { get; set; } [JsonProperty("minNeighborsLong")] public double MinNeighborsLong { get; set; } [JsonProperty("timeOut")] public int TimeOut { get; set; } [JsonProperty("logs")] public int Logs { get; set; } } #region LaneConfig public class LaneConfig { [JsonProperty("laneConfig")] public LaneConfigPosision Posision { get; set; } } public class LaneConfigPosision { [JsonProperty("left")] public LaneConfigParam LeftLane { get; set; } [JsonProperty("right")] public LaneConfigParam RightLane { get; set; } } public class LaneConfigParam { [JsonProperty("name")] public string LaneName { get; set; } [JsonProperty("default")] public string DefaultLane { get; set; } [JsonProperty("longPlate")] public bool IsLongPlate { get; set; } } #endregion #endregion }