using Autofac; using DotNetty.Transport.Channels; using Entity.DbModel.Station; using HybirdFrameworkCore.Autofac; using HybirdFrameworkCore.Autofac.Attribute; using HybirdFrameworkCore.Entity; using HybirdFrameworkDriver.Session; using log4net; using Repository.Station; using Service.Charger.Common; using Service.Equipment; namespace Service.Charger.Client; /// /// 示例程序 /// [Scope("SingleInstance")] public static class ClientMgr { private static readonly ILog Log = LogManager.GetLogger(typeof(ClientMgr)); private static readonly Dictionary Dictionary = new(); private static bool AutoChargeWorking { get; set; } public static ChargerClient? GetBySn(string sn) { Dictionary.TryGetValue(sn, out var o); return o; } public static bool TryGetClient(IChannel channel, out string sn, out ChargerClient? client) { string? snt = ChannelUtils.GetAttr(channel, ChargerConst.ChargerSn); if (!string.IsNullOrWhiteSpace(snt)) { var chargerClient = GetBySn(snt); if (chargerClient != null) { sn = snt; client = chargerClient; return true; } } sn = string.Empty; client = null; return false; } public static void AddBySn(string sn, ChargerClient client) { Dictionary[sn] = client; } //TODO 连接、鉴权,开始充电,结束充电,设置尖峰平谷,读取尖峰平谷,发送功率调节指令,发送辅助源控制指令,下发掉线停止充电, public static void InitClient() { EquipInfoRepository equipInfoRepository = AppInfo.Container.Resolve(); EquipNetInfoRepository netInfoRepository = AppInfo.Container.Resolve(); List equipInfos = equipInfoRepository.QueryListByClause(it => it.TypeCode == (int)EquipmentType.Charger); if (equipInfos.Count > 0) { Dictionary set = equipInfos.ToDictionary(it => it.Code, it => it); List equipNetInfos = netInfoRepository.QueryListByClause(it => set.Keys.Contains(it.Code)); foreach (EquipNetInfo netInfo in equipNetInfos) { Task.Run(() => { ConnClient(netInfo); }); } StartAutoChargeThread(); } } /// /// /// public static void StartAutoChargeThread() { if (!AutoChargeWorking) { Thread thread = new Thread(AutoChargeThread) { Name = @"auto-charge" }; thread.Start(); AutoChargeWorking = true; } } /// /// /// private static void AutoChargeThread() { ElecPriceModelVersionRepository elecPriceModelVersionRepository = AppInfo.Container.Resolve(); ElecPriceModelVersionDetailRepository elecPriceModelVersionDetailRepository = AppInfo.Container.Resolve(); while (true) { Thread.Sleep(1000 * 30); try { DateTime now = DateTime.Now; ElecPriceModelVersion elecPriceModelVersion = elecPriceModelVersionRepository.QueryByClause(i => i.StartTime >= now && i.EndTime < now); if (elecPriceModelVersion == null) { Log.Info("lack of effective elec price model"); continue; } List elecPriceModelVersionDetails = elecPriceModelVersionDetailRepository.QueryListByClause(it => it.Version == elecPriceModelVersion.Version); ElecPriceModelVersionDetail? elecPriceModelVersionDetail = elecPriceModelVersionDetails.Where(i => i.StartHour <= now.Hour && i.StartMinute <= now.Minute && i.EndHour > now.Hour && i.EndMinute > now.Minute).FirstOrDefault(); if (elecPriceModelVersionDetail == null) { Log.Info("lack of effective elec price model detail"); continue; } //int batteryCount = elecPriceModelVersionDetail.BatteryCount; foreach (KeyValuePair pair in Dictionary) { Result result = pair.Value.StartCharge(); Log.Info($"start {pair.Key} charge {result.IsSuccess}:{result.Msg}"); } } catch (Exception e) { Log.Error("AutoChargeThread error", e); } } } private static void ConnClient(EquipNetInfo netInfo) { Log.Info($"begin to connect {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}"); ChargerClient client = AppInfo.Container.Resolve(); client.InitBootstrap(netInfo.NetAddr, int.Parse(netInfo.NetPort)); client.Connect(); client.SessionAttr(netInfo.Code, netInfo.DestAddr); AddBySn(netInfo.Code, client); Log.Info($"connected {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}"); } }