水冷通讯

master
tq 4 months ago
parent cf62970006
commit a75052942b

@ -6,6 +6,7 @@ public static class ChargerConst
{
public static readonly AttributeKey<string> ChargerSn = AttributeKey<string>.ValueOf("charger_sn");
public static readonly AttributeKey<string> WaterCoolSn = AttributeKey<string>.ValueOf("water_cool_sn");
public static readonly AttributeKey<string> EqmTypeNo = AttributeKey<string>.ValueOf("eqm_type_no");
public static readonly AttributeKey<string> EqmCode = AttributeKey<string>.ValueOf("eqm_code");
public static readonly AttributeKey<string> DestAddr = AttributeKey<string>.ValueOf("dest_addr");

@ -0,0 +1,61 @@
using HybirdFrameworkCore.Autofac.Attribute;
using HybirdFrameworkDriver.Session;
using HybirdFrameworkDriver.TcpClient;
using log4net;
using Service.Charger.Common;
using Service.Charger.Handler;
using Service.WaterCool.Msg.WaterCool;
using Decoder = Service.Charger.Codec.Decoder;
using Encoder = Service.Charger.Codec.Encoder;
namespace Service.WaterCool.Client;
/// <summary>
/// 水冷客户端
/// </summary>
[Scope("InstancePerDependency")]
public class WaterCoolClient : TcpClient<IBaseHandler, Decoder, Encoder>
{
/// <summary>
/// 水冷数据主动上报
/// </summary>
public WaterCoolStatus? WaterCoolStatus { get; set; }
/// <summary>
/// 水冷是否连接成功
/// </summary>
public bool IsConnect { get; set; } = false;
private ILog Log()
{
var name = "WaterCool" + this.Sn;
ILog logger = LogManager.GetLogger(name);
Console.WriteLine(name + "-" + logger.GetHashCode());
return logger;
}
/// <summary>
/// 水冷机编号
/// </summary>
public string Sn { get; set; }
/// <summary>
///
/// </summary>
/// <param name="sn"></param>
/// <param name="destAddr"></param>
public void SessionAttr(string sn, string destAddr)
{
ChannelUtils.AddAttr(Channel, ChargerConst.WaterCoolSn, sn);
ChannelUtils.AddAttr(Channel, ChargerConst.EqmTypeNo, sn);
ChannelUtils.AddAttr(Channel, ChargerConst.EqmCode, sn);
ChannelUtils.AddAttr(Channel, ChargerConst.DestAddr, destAddr);
}
public bool Connect()
{
base.BaseConnect();
Log().Info($"charger {Sn} connect succeed");
return Connected;
}
}

@ -0,0 +1,115 @@
using System.Collections.Concurrent;
using Autofac;
using Common.Const;
using DotNetty.Transport.Channels;
using Entity.DbModel.Station;
using HybirdFrameworkCore.Autofac;
using HybirdFrameworkCore.Autofac.Attribute;
using HybirdFrameworkDriver.Session;
using log4net;
using Repository.Station;
using Service.Charger.Common;
namespace Service.WaterCool.Client;
/// <summary>
/// 水冷连接管理
/// </summary>
[Scope]
public class WaterCoolClientMgr
{
public static readonly ConcurrentDictionary<string, WaterCoolClient> Dictionary = new();
private static readonly ILog Log = LogManager.GetLogger(typeof(WaterCoolClientMgr));
/// <summary>
///
/// </summary>
/// <param name="sn"></param>
/// <returns></returns>
public static WaterCoolClient? GetBySn(string sn)
{
Dictionary.TryGetValue(sn, out var o);
return o;
}
/// <summary>
/// 通过channel获取client
/// </summary>
/// <param name="channel"></param>
/// <param name="sn"></param>
/// <param name="client">获取不到client则为空</param>
/// <returns></returns>
public static bool TryGetClient(IChannel channel, out string sn, out WaterCoolClient? client)
{
string? snt = ChannelUtils.GetAttr(channel, ChargerConst.WaterCoolSn);
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, WaterCoolClient client)
{
Dictionary[sn] = client;
}
public static void InitClient()
{
EquipInfoRepository equipInfoRepository = AppInfo.Container.Resolve<EquipInfoRepository>();
EquipNetInfoRepository netInfoRepository = AppInfo.Container.Resolve<EquipNetInfoRepository>();
BinInfoRepository binInfoRepository = AppInfo.Container.Resolve<BinInfoRepository>();
List<EquipInfo> equipInfos =
equipInfoRepository.QueryListByClause(it => it.TypeCode == (int)EquipmentType.WaterCool);
if (equipInfos.Count > 0)
{
Dictionary<string, EquipInfo> set = equipInfos.ToDictionary(it => it.Code, it => it);
List<EquipNetInfo> equipNetInfos = netInfoRepository.QueryListByClause(it => set.Keys.Contains(it.Code));
Dictionary<string, BinInfo> binInfoMap = binInfoRepository
.QueryListByClause(it => set.Keys.Contains(it.ChargerNo))
.ToDictionary(it => it.ChargerNo, it => it);
foreach (EquipNetInfo netInfo in equipNetInfos)
{
Task.Run(() =>
{
binInfoMap.TryGetValue(netInfo.Code, out var binInfo);
ConnClient(netInfo, binInfo);
});
}
}
}
private static void ConnClient(EquipNetInfo netInfo, BinInfo? binInfo)
{
Log.Info($"begin to connect {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}");
WaterCoolClient client = AppInfo.Container.Resolve<WaterCoolClient>();
client.AutoReconnect = true;
client.Sn = netInfo.Code;
client.LogName = "WaterCool" + netInfo.Code;
client.ConnectedEventHandler += (sender, b) => { client.SessionAttr(netInfo.Code, netInfo.DestAddr); };
client.InitBootstrap(netInfo.NetAddr, int.Parse(netInfo.NetPort));
Task.Run(() =>
{
client.Connect();
client.SessionAttr(netInfo.Code, netInfo.DestAddr);
Log.Info($"succeed to connect {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}");
});
AddBySn(netInfo.Code, client);
Log.Info($"begin to connect {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}");
}
}

@ -30,7 +30,7 @@ public class Decoder : ByteToMessageDecoder
BaseMsg baseMsg = id switch
{
0x18FFC13A => ModelConvert.Decode<WaterCoolStatus>(bytes),
_ => ModelConvert.Decode<WaterCoolStatus>(bytes),
_ => throw new InvalidOperationException("This should never be reached"),
};
Log.Info($"receive={BitUtls.BytesToHexStr(bytes)}, msg={JsonConvert.SerializeObject(baseMsg)}");

@ -2,8 +2,8 @@
using HybirdFrameworkCore.Autofac.Attribute;
using log4net;
using Service.Charger.Handler;
using Service.WaterCool.Client;
using Service.WaterCool.Msg.WaterCool;
using Service.WaterCool.Server;
namespace Service.WaterCool.Handler;
@ -17,7 +17,11 @@ public class WaterCoolStatusHandler : SimpleChannelInboundHandler<WaterCoolStatu
protected override void ChannelRead0(IChannelHandlerContext ctx, WaterCoolStatus msg)
{
Log.Info($"receive OtherMsg={msg}");
var server = WaterCoolServerMgr.Server;
if (server != null) server.WaterCoolStatus = msg;
if (WaterCoolClientMgr.TryGetClient(ctx.Channel, out string sn, out WaterCoolClient? client))
{
WaterCoolClientMgr.Dictionary[sn].WaterCoolStatus = msg;
WaterCoolClientMgr.Dictionary[sn].IsConnect = true;
}
}
}

@ -1,18 +0,0 @@
using HybirdFrameworkCore.Autofac.Attribute;
using HybirdFrameworkDriver.TcpServer;
using log4net;
using Service.Charger.Handler;
using Service.WaterCool.Codec;
using Service.WaterCool.Msg.WaterCool;
namespace Service.WaterCool.Server;
[Scope]
public class WaterCoolServer: TcpServer<IBaseHandler, Decoder, Encoder>
{
private static readonly ILog Log = LogManager.GetLogger(typeof(WaterCoolServer));
public WaterCoolStatus? WaterCoolStatus { get; set; }
}

@ -1,18 +0,0 @@
using Autofac;
using HybirdFrameworkCore.Autofac;
namespace Service.WaterCool.Server;
public class WaterCoolServerMgr
{
public static WaterCoolServer? Server { get; private set; }
public static void InitWaterCoolServer(int port)
{
if (Server == null)
{
Server = AppInfo.Container.Resolve<WaterCoolServer>();
Server.Start(port);
}
}
}

@ -7,6 +7,7 @@ using HybirdFrameworkCore.Entity;
using HybirdFrameworkCore.Redis;
using log4net;
using Service.Charger.Client;
using Service.WaterCool.Client;
using SqlSugar;
using SqlSugar.IOC;
@ -96,5 +97,7 @@ AppInfo.Container = app.Services.GetAutofacRoot();
ClientMgr.InitClient();
TaskInit.Init();
// 水冷连接
WaterCoolClientMgr.InitClient();
app.Run();

Loading…
Cancel
Save