diff --git a/HybirdFrameworkDriver/Session/SessionMgr.cs b/HybirdFrameworkDriver/Session/SessionMgr.cs index 431901e..8bdb383 100644 --- a/HybirdFrameworkDriver/Session/SessionMgr.cs +++ b/HybirdFrameworkDriver/Session/SessionMgr.cs @@ -1,5 +1,4 @@ using System.Collections.Concurrent; -using DotNetty.Buffers; using DotNetty.Transport.Channels; using log4net; @@ -22,8 +21,8 @@ public class SessionMgr IoSession? value; Dictionary.TryGetValue(key, out value); - return value; - } + return value; + } return null; } @@ -149,4 +148,4 @@ public class SessionMgr return 0; } -} \ No newline at end of file +} diff --git a/Service/Car/Handler/ElecMsgHandler.cs b/Service/Car/Handler/ElecMsgHandler.cs index fa85d6e..15a4b34 100644 --- a/Service/Car/Handler/ElecMsgHandler.cs +++ b/Service/Car/Handler/ElecMsgHandler.cs @@ -1,33 +1,39 @@ using DotNetty.Transport.Channels; using HybirdFrameworkCore.Autofac.Attribute; +using HybirdFrameworkDriver.Session; +using log4net; using Service.Car.Msg.Car.Req; using Service.Car.Msg.Host.Resp; -using Service.Car.Server; namespace Service.Car.Handler; /// -/// +/// /// [Order(8)] [Scope("InstancePerDependency")] public class ElecMsgHandler : SimpleChannelInboundHandler, IBaseHandler { + private static readonly ILog Log = LogManager.GetLogger(typeof(ElecMsgHandler)); /// - /// + /// /// /// /// /// protected override void ChannelRead0(IChannelHandlerContext ctx, ElecMsg msg) { - CarServerMgr.CarServer.Connected = true; - CarServerMgr.CarServer.ElecMsg = msg; - ElecMsgResp resp = new ElecMsgResp( 0) + Log.Info($"receive ElecMsg = {msg}"); + IoSession? ioSession = SessionMgr.GetSession(msg.CarNo); + + ioSession?.BusinessMap.AddOrUpdate("ElecMsg", msg, ((s, o) => msg)); + ioSession?.BusinessMap.AddOrUpdate("Connected", true, ((s, o) => true)); + + ElecMsgResp resp = new ElecMsgResp(0) { CarNo = msg.CarNo }; resp.InitCurrentTime(); ctx.Channel.WriteAndFlushAsync(resp); } -} \ No newline at end of file +} diff --git a/Service/Car/Handler/HeartBeatMsgHandler.cs b/Service/Car/Handler/HeartBeatMsgHandler.cs index dc9212a..03eb7d4 100644 --- a/Service/Car/Handler/HeartBeatMsgHandler.cs +++ b/Service/Car/Handler/HeartBeatMsgHandler.cs @@ -1,6 +1,7 @@ using DotNetty.Transport.Channels; using HybirdFrameworkCore.Autofac.Attribute; using HybirdFrameworkDriver.Session; +using log4net; using Service.Car.Msg.Car.Req; using Service.Car.Msg.Host.Resp; using Service.Car.Server; @@ -8,35 +9,43 @@ using Service.Car.Server; namespace Service.Car.Handler; /// -/// +/// /// [Order(8)] [Scope("InstancePerDependency")] public class HeartBeatMsgHandler : SimpleChannelInboundHandler, IBaseHandler { + + private static readonly ILog Log = LogManager.GetLogger(typeof(HeartBeatMsgHandler)); /// - /// + /// /// /// /// /// protected override void ChannelRead0(IChannelHandlerContext ctx, HeartBeatMsg msg) { - CarServerMgr.CarServer.Connected = true; + Log.Info($"receive HeartBeatMsg = {msg}"); IoSession? ioSession = SessionMgr.GetSession(ctx.Channel.Id.ToString()); if (ioSession != null && ioSession.Key != msg.CarNo) { SessionMgr.ChangeSessionKey(ioSession, msg.CarNo); } - CarServerMgr.CarServer.CarNo = msg.CarNo; - CarServerMgr.CarServer.HeartBeatMsg = msg; - HeartBeatMsgResp resp = new HeartBeatMsgResp( CarServerMgr.CarServer.StationStatus) + if (ioSession == null) + { + ioSession = SessionMgr.GetSession(msg.CarNo); + } + + ioSession.BusinessMap.AddOrUpdate("HeartBeatMsg", msg, ((s, o) => msg)); + ioSession?.BusinessMap.AddOrUpdate("Connected", true, ((s, o) => true)); + + HeartBeatMsgResp resp = new HeartBeatMsgResp(CarServerMgr.CarServer.StationStatus) { CarNo = msg.CarNo }; resp.InitCurrentTime(); ctx.Channel.WriteAndFlushAsync(resp); } -} \ No newline at end of file +} diff --git a/Service/Car/Handler/LockMsgRespHandler.cs b/Service/Car/Handler/LockMsgRespHandler.cs index 61448dd..7ee18dc 100644 --- a/Service/Car/Handler/LockMsgRespHandler.cs +++ b/Service/Car/Handler/LockMsgRespHandler.cs @@ -1,26 +1,35 @@ using DotNetty.Transport.Channels; using HybirdFrameworkCore.Autofac.Attribute; +using log4net; using Service.Car.Msg.Car.Resp; +using Service.Car.Msg.Host.Req; using Service.Car.Server; namespace Service.Car.Handler; /// -/// +/// /// [Order(8)] [Scope("InstancePerDependency")] public class LockMsgRespHandler : SimpleChannelInboundHandler, IBaseHandler { + private static readonly ILog Log = LogManager.GetLogger(typeof(LockMsgRespHandler)); + /// - /// + /// /// /// /// /// protected override void ChannelRead0(IChannelHandlerContext ctx, LockMsgResp msg) { - CarServerMgr.CarServer.Connected = true; - CarServerMgr.CarServer.LockMsgPair.SetResp(msg); + LockMsg? lockMsg = CarServerMgr.CarServer.LockMsgPair.Req; + + Log.Info($"receive LockMsgResp = {msg}, lockMsg={lockMsg}"); + if (lockMsg != null && lockMsg.CarNo == msg.CarNo) + { + CarServerMgr.CarServer.LockMsgPair.SetResp(msg); + } } -} \ No newline at end of file +} diff --git a/Service/Car/Handler/SetParamMsgRespHandler.cs b/Service/Car/Handler/SetParamMsgRespHandler.cs index 6b0ad8a..9a7efad 100644 --- a/Service/Car/Handler/SetParamMsgRespHandler.cs +++ b/Service/Car/Handler/SetParamMsgRespHandler.cs @@ -1,26 +1,28 @@ using DotNetty.Transport.Channels; using HybirdFrameworkCore.Autofac.Attribute; +using log4net; using Service.Car.Msg.Car.Resp; using Service.Car.Server; namespace Service.Car.Handler; /// -/// +/// /// [Order(8)] [Scope("InstancePerDependency")] public class SetParamMsgRespHandler : SimpleChannelInboundHandler, IBaseHandler { + private static readonly ILog Log = LogManager.GetLogger(typeof(SetParamMsgRespHandler)); /// - /// + /// /// /// /// /// protected override void ChannelRead0(IChannelHandlerContext ctx, SetParamMsgResp msg) { - CarServerMgr.CarServer.Connected = true; + Log.Info($"receive SetParamMsgResp = {msg}"); CarServerMgr.CarServer.SetParamMsgPair.SetResp(msg); } -} \ No newline at end of file +} diff --git a/Service/Car/Handler/SettleConfirmMsgRespHandler.cs b/Service/Car/Handler/SettleConfirmMsgRespHandler.cs index b991704..f2d024b 100644 --- a/Service/Car/Handler/SettleConfirmMsgRespHandler.cs +++ b/Service/Car/Handler/SettleConfirmMsgRespHandler.cs @@ -1,26 +1,29 @@ using DotNetty.Transport.Channels; using HybirdFrameworkCore.Autofac.Attribute; +using log4net; using Service.Car.Msg.Car.Resp; using Service.Car.Server; namespace Service.Car.Handler; /// -/// +/// /// [Order(8)] [Scope("InstancePerDependency")] public class SettleConfirmMsgRespHandler : SimpleChannelInboundHandler, IBaseHandler { + + private static readonly ILog Log = LogManager.GetLogger(typeof(SettleConfirmMsgRespHandler)); /// - /// + /// /// /// /// /// protected override void ChannelRead0(IChannelHandlerContext ctx, SettleConfirmMsgResp msg) { - CarServerMgr.CarServer.Connected = true; + Log.Info($"receive SettleConfirmMsgResp = {msg}"); CarServerMgr.CarServer.SettleConfirmMsgPair.SetResp(msg); } -} \ No newline at end of file +} diff --git a/Service/Car/Handler/UnLockMsgRespHandler.cs b/Service/Car/Handler/UnLockMsgRespHandler.cs index 73f0588..a35cbf4 100644 --- a/Service/Car/Handler/UnLockMsgRespHandler.cs +++ b/Service/Car/Handler/UnLockMsgRespHandler.cs @@ -1,26 +1,34 @@ using DotNetty.Transport.Channels; using HybirdFrameworkCore.Autofac.Attribute; +using log4net; using Service.Car.Msg.Car.Resp; +using Service.Car.Msg.Host.Req; using Service.Car.Server; namespace Service.Car.Handler; /// -/// +/// /// [Order(8)] [Scope("InstancePerDependency")] public class UnLockMsgRespHandler : SimpleChannelInboundHandler, IBaseHandler { + private static readonly ILog Log = LogManager.GetLogger(typeof(UnLockMsgRespHandler)); + /// - /// + /// /// /// /// /// protected override void ChannelRead0(IChannelHandlerContext ctx, UnLockMsgResp msg) { - CarServerMgr.CarServer.Connected = true; - CarServerMgr.CarServer.UnLockMsgPair.SetResp(msg); + UnLockMsg? unLockMsg = CarServerMgr.CarServer.UnLockMsgPair.Req; + Log.Info($"receive UnLockMsgResp = {msg} unLockMsg={unLockMsg}"); + if (unLockMsg != null && unLockMsg.CarNo == msg.CarNo) + { + CarServerMgr.CarServer.UnLockMsgPair.SetResp(msg); + } } -} \ No newline at end of file +} diff --git a/Service/Car/Server/CarServer.cs b/Service/Car/Server/CarServer.cs index dc59c83..1f4c4be 100644 --- a/Service/Car/Server/CarServer.cs +++ b/Service/Car/Server/CarServer.cs @@ -3,7 +3,6 @@ using HybirdFrameworkDriver.Common; using HybirdFrameworkDriver.TcpServer; using Service.Car.Codec; using Service.Car.Handler; -using Service.Car.Msg.Car.Req; using Service.Car.Msg.Car.Resp; using Service.Car.Msg.Host.Req; @@ -12,31 +11,20 @@ namespace Service.Car.Server; [Scope("SingleInstance")] public class CarServer : TcpServer { - /// - /// 客户端连接状态 - /// - public bool Connected { get; set; } - public string? CarNo { get; set; } + public MsgPair LockMsgPair { get; set; } = new (); + + public MsgPair UnLockMsgPair { get; set; } = new (); - public MsgPair LockMsgPair { get; set; } = new (); - - public MsgPair UnLockMsgPair { get; set; } = new (); - - public MsgPair SetParamMsgPair { get; set; } = new (); - - public MsgPair SettleConfirmMsgPair { get; set; } = new (); - public HeartBeatMsg? HeartBeatMsg { get; set; } + public MsgPair SetParamMsgPair { get; set; } = new (); + + public MsgPair SettleConfirmMsgPair { get; set; } = new (); /// /// 1 待机 2 换电 /// public byte StationStatus { get; set; } = 1; - /// - /// 度电数据车载设备连接上换电站的 Wifi 网络时,主动上送度电数据报文(命令代码: 0x01),发送周期 60s,服务器回复相应的报文(命令代码:0x02) - /// - public ElecMsg? ElecMsg { get; set; } public CarServer() : base() { @@ -49,13 +37,9 @@ public class CarServer : TcpServer /// public void Clean() { - Connected = false; - CarNo = null; - HeartBeatMsg = null; - ElecMsg = null; LockMsgPair.ClearResp(); UnLockMsgPair.ClearResp(); SetParamMsgPair.ClearResp(); SettleConfirmMsgPair.ClearResp(); } -} \ No newline at end of file +} diff --git a/WebStarter/Controllers/CarController.cs b/WebStarter/Controllers/CarController.cs index 7b9739e..4ceacbb 100644 --- a/WebStarter/Controllers/CarController.cs +++ b/WebStarter/Controllers/CarController.cs @@ -1,6 +1,8 @@ using HybirdFrameworkDriver.Session; using log4net; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using Service.Car.Msg.Car.Req; using Service.Car.Msg.Host.Req; using Service.Car.Server; using WebStarter.Dto.Req; @@ -13,27 +15,73 @@ namespace WebStarter.Controllers; /// [ApiController] [Route("[controller]")] -public class CarController : ControllerBase -{ +public class CarController : ControllerBase{ private static readonly ILog Log = LogManager.GetLogger(typeof(CarController)); /// /// 获取车辆数据 /// /// - [HttpGet("/getCarInfo")] - public CarInfoResp GetCarInfo() + [HttpGet("/getCarInfo/{carNo}")] + public CarInfoResp? GetCarInfo(string carNo) { + IoSession? ioSession = SessionMgr.GetSession(carNo); CarInfoResp carInfoResp = new CarInfoResp() { - Connected = CarServerMgr.CarServer != null && CarServerMgr.CarServer.Connected, - CarNo = CarServerMgr.CarServer?.HeartBeatMsg?.CarNo, - ElecMsg = CarServerMgr.CarServer?.ElecMsg, - HeartBeatMsg = CarServerMgr.CarServer?.HeartBeatMsg + Connected = CarServerMgr.CarServer != null && ioSession != null, }; + + ioSession.BusinessMap.TryGetValue("ElecMsg", out var elecMsg); + if (elecMsg != null) + { + carInfoResp.ElecMsg = (ElecMsg)elecMsg; + } + + ioSession.BusinessMap.TryGetValue("HeartBeatMsg", out var heartBeatMsg); + if (heartBeatMsg != null) + { + carInfoResp.HeartBeatMsg = (HeartBeatMsg)heartBeatMsg; + } return carInfoResp; } + + /// + /// 获取车辆数据 + /// + /// + [HttpGet("/getCarInfoList")] + public List GetCarInfoList() + { + List result = new List(); + List sessionList = SessionMgr.GetSessionList(); + foreach (var ioSession in sessionList) + { + + CarInfoResp carInfoResp = new CarInfoResp() + { + Connected = true, + CarNo = ioSession.Key, + }; + + ioSession.BusinessMap.TryGetValue("ElecMsg", out var elecMsg); + if (elecMsg != null) + { + carInfoResp.ElecMsg = (ElecMsg)elecMsg; + } + + ioSession.BusinessMap.TryGetValue("HeartBeatMsg", out var heartBeatMsg); + if (heartBeatMsg != null) + { + carInfoResp.HeartBeatMsg = (HeartBeatMsg)heartBeatMsg; + } + + result.Add(carInfoResp); + + } + return result; + } + /// /// 加锁 /// @@ -42,9 +90,12 @@ public class CarController : ControllerBase [HttpGet("/lock/{carNo}")] public bool Lock(string carNo) { - Log.Info("Lock "); - if (CarServerMgr.CarServer == null || !CarServerMgr.CarServer.Connected) + Log.Info($"Lock {carNo}"); + + IoSession? ioSession = SessionMgr.GetSession(carNo); + if (CarServerMgr.CarServer == null || ioSession?.Channel == null) { + Log.Info("ioSession is null return false"); return false; } @@ -53,7 +104,7 @@ public class CarController : ControllerBase CarNo = carNo }; CarServerMgr.CarServer.LockMsgPair.Req = lockMsg; - SessionMgr.Broadcast(lockMsg); + ioSession.Channel.WriteAndFlushAsync(lockMsg); return CarServerMgr.CarServer.LockMsgPair.GetResp(TimeSpan.FromSeconds(5))?.Result == 0; } @@ -66,9 +117,11 @@ public class CarController : ControllerBase [HttpGet("/unLock/{carNo}")] public bool UnLock(string carNo) { - Log.Info("UnLock "); - if (CarServerMgr.CarServer == null || !CarServerMgr.CarServer.Connected) + Log.Info($"UnLock {carNo} "); + IoSession? ioSession = SessionMgr.GetSession(carNo); + if (CarServerMgr.CarServer == null || ioSession?.Channel == null) { + Log.Info("ioSession is null return false"); return false; } @@ -78,7 +131,7 @@ public class CarController : ControllerBase }; CarServerMgr.CarServer.UnLockMsgPair.Req = unLockMsg; - SessionMgr.Broadcast(unLockMsg); + ioSession.Channel.WriteAndFlushAsync(unLockMsg); return CarServerMgr.CarServer.UnLockMsgPair.GetResp(TimeSpan.FromSeconds(5))?.Result == 0; } @@ -91,15 +144,17 @@ public class CarController : ControllerBase [HttpGet("/SettleConfirm/{carNo}")] public bool SettleConfirm(string carNo) { - Log.Info("SettleConfirm "); - if (CarServerMgr.CarServer == null || !CarServerMgr.CarServer.Connected) + Log.Info($"SettleConfirm {carNo}"); + IoSession? ioSession = SessionMgr.GetSession(carNo); + if (CarServerMgr.CarServer == null || ioSession?.Channel == null) { + Log.Info("ioSession is null return false"); return false; } var settleConfirmMsg = new SettleConfirmMsg() { CarNo = carNo }; CarServerMgr.CarServer.SettleConfirmMsgPair.Req = settleConfirmMsg; - SessionMgr.Broadcast(settleConfirmMsg); + ioSession.Channel.WriteAndFlushAsync(settleConfirmMsg); return CarServerMgr.CarServer.SettleConfirmMsgPair.GetResp(TimeSpan.FromSeconds(5))?.Result == 0; } @@ -111,9 +166,11 @@ public class CarController : ControllerBase [HttpPost("/setParam")] public bool SetParam(SetParam setParam) { - Log.Info("SetParam"); - if (CarServerMgr.CarServer == null || !CarServerMgr.CarServer.Connected) + Log.Info($"SetParam {JsonConvert.SerializeObject(setParam)}"); + IoSession? ioSession = SessionMgr.GetSession(setParam.CarNo); + if (CarServerMgr.CarServer == null || ioSession?.Channel == null) { + Log.Info("ioSession is null return false"); return false; } @@ -138,21 +195,21 @@ public class CarController : ControllerBase return CarServerMgr.CarServer.SetParamMsgPair.GetResp(TimeSpan.FromSeconds(5))?.Result ==0; } - + /// /// 清空数据 /// /// - [HttpGet("/clear")] - public bool Clear() + [HttpGet("/clear/{carNo}")] + public bool Clear(string carNo) { - if (CarServerMgr.CarServer?.CarNo == null) + if (CarServerMgr.CarServer == null) { CarServerMgr.CarServer.Clean(); return true; } - IoSession? session = SessionMgr.GetSession(CarServerMgr.CarServer.CarNo); + IoSession? session = SessionMgr.GetSession(carNo); if (session == null) { CarServerMgr.CarServer.Clean(); @@ -163,4 +220,4 @@ public class CarController : ControllerBase CarServerMgr.CarServer.Clean(); return true; } -} \ No newline at end of file +} diff --git a/WebStarter/Dto/Req/SetParam.cs b/WebStarter/Dto/Req/SetParam.cs index d24598b..fad9784 100644 --- a/WebStarter/Dto/Req/SetParam.cs +++ b/WebStarter/Dto/Req/SetParam.cs @@ -2,6 +2,10 @@ public class SetParam { + /// + /// 车vin + /// + public string CarNo { get; set; } /// /// 车辆累计放电量 /// @@ -66,4 +70,4 @@ public class SetParam /// 14 待结算电费电量 /// public double ElectricityToBeSettled { get; set; } -} \ No newline at end of file +}