using Application.Domain.Entities; using Infrastructure.Data; using Infrastructure.Extensions; using Microsoft.AspNetCore.SignalR.Client; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; using System.Linq; using System.Net.Http; using System.Threading.Tasks; namespace IoT.Shared.Infrastructure { public class ClientService : BaseClientService { public ClientService(IServiceProvider applicationServices, IConfiguration configuration) : base(applicationServices, configuration) { } public override void OnConnected() { using (var scope = this.applicationServices.CreateScope()) { var deviceInfoRepo = scope.ServiceProvider.GetService>(); var deviceInfos = deviceInfoRepo.ReadOnlyTable().ToList(); foreach (var deviceInfo in deviceInfos) { this.SendDeviceInfo(deviceInfo); } var deviceRepo = scope.ServiceProvider.GetService>(); var devices = deviceRepo.ReadOnlyTable().Include(o => o.Data).ToList(); foreach (var device in devices) { this.SendDevice(device); } } } public override void OnServerToClient(string method, string message, string fromConnectionId) { if (method == "GetDeviceInfo") { var infoNumber = message; using (var scope = this.applicationServices.CreateScope()) { var deviceInfoRepo = scope.ServiceProvider.GetService>(); var deviceInfo = deviceInfoRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == infoNumber); if (deviceInfo == null) { throw new Exception($"not has infoNumber:{infoNumber}"); } this.SendDeviceInfo(deviceInfo); } } else if (method == "CallDeviceMethod") { using (var scope = this.applicationServices.CreateScope()) { var serviceProvider = scope.ServiceProvider; var cfg = serviceProvider.GetService(); var port = cfg["server.urls"].Split(':')[2]; var url = $"http://localhost:{port}{message}"; var httpClient = serviceProvider.GetService().CreateClient(); var result = httpClient.GetStringAsync(url).Result; this.Connection.SendAsync("ClientToServer", "ApiCallback", result, cfg["connectId"]); } } } public void SendDevice(Device device) { Task.Run(() => { try { Console.WriteLine("send device to server"); var device2 = device.ToJson().FromJson(); device2.Data.RemoveAll(o => o.Hidden); this.ClientToServer("UpdateDevice", device2.ToJson()); } catch (Exception ex) { ex.PrintStack(); } }); } public void SendDeviceInfo(DeviceInfo deviceInfo) { Task.Run(() => { try { Console.WriteLine("send device to server"); this.ClientToServer("UpdateDeviceInfo", deviceInfo.ToJson()); } catch (Exception ex) { ex.PrintStack(); } }); } } }