ClientsMainHub.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using Microsoft.AspNetCore.Http.Features;
  2. using SqlSugarORM;
  3. namespace EEMSServerCore.Hubs;
  4. internal partial class ClientsMainHub(DeviceManager deviceManager, IEEMSBaseServerProvider provider, SqlSugarCustom orm, IUIProvider uiCaller) : Hub, IClientCaller
  5. {
  6. public override Task OnConnectedAsync()
  7. {
  8. if (Context.Features.Get<IHttpConnectionFeature>() is IHttpConnectionFeature feature)
  9. provider?.OnConnected(feature.RemoteIpAddress!.ToString(), (ushort)feature.RemotePort, ServiceHub.ClinetHub);
  10. if (deviceManager.TryGetDevice(Context.ConnectionId, out DeviceInfo? device) && device is not null && device.Guid is not null)
  11. uiCaller.OnlineStatusNotify(device.Guid.Value, true);
  12. return base.OnConnectedAsync();
  13. }
  14. public override Task OnDisconnectedAsync(Exception? exception)
  15. {
  16. deviceManager.RemoveDevice(Context.ConnectionId, out DeviceInfo? device);
  17. if (device is not null && device.Guid.HasValue)
  18. {
  19. ClientManager.DeviceClients.TryRemove(device.Guid.Value, out _);
  20. uiCaller.OnlineStatusNotify(device.Guid.Value, false);
  21. }
  22. if (Context.Features.Get<IHttpConnectionFeature>() is IHttpConnectionFeature feature)
  23. provider?.OnDisConnected(feature.RemoteIpAddress!.ToString(), (ushort)feature.RemotePort, ServiceHub.ClinetHub);
  24. return base.OnDisconnectedAsync(exception);
  25. }
  26. public Task<Guid> RegisterDevice(DeviceInfo deviceInfo)
  27. {
  28. deviceInfo.IP ??= string.Empty;
  29. bool newDevice = (deviceInfo.Guid is null || deviceInfo.Guid == Guid.Empty);
  30. deviceInfo.Guid ??= Guid.NewGuid();
  31. if (!orm.AddOrUpdate("Devices", deviceInfo, t => t.Guid == deviceInfo.Guid))
  32. return Task.FromResult(Guid.Empty);
  33. deviceManager.LoginDevice(Context.ConnectionId, deviceInfo);
  34. ClientManager.DeviceClients[deviceInfo.Guid.Value] = Clients.Caller;
  35. if (newDevice)
  36. uiCaller.InsertNewDevice(deviceInfo);
  37. else
  38. uiCaller.UpdateDevice(deviceInfo);
  39. return Task.FromResult(deviceInfo.Guid.Value);
  40. }
  41. public Task<bool> UpdateRealTimeData(Dictionary<string, object> realtimeData)
  42. {
  43. if (!deviceManager.TryGetDevice(Context.ConnectionId, out DeviceInfo? device) || device is null || device.Guid is null)
  44. return Task.FromResult(false);
  45. return uiCaller.UpdateRealtimeData(device.Guid.Value, realtimeData);
  46. }
  47. }