From e1efbf7282598c9803c93a723d9287fc9a3b0bc0 Mon Sep 17 00:00:00 2001
From: rszn <645583145@qq.com>
Date: Mon, 3 Jun 2024 12:08:28 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9F=A5=E8=AF=A2=E5=85=A8?=
=?UTF-8?q?=E9=83=A8=E8=BD=A6=E8=BE=86=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
HybirdFrameworkDriver/Session/SessionMgr.cs | 7 +-
Service/Car/Handler/ElecMsgHandler.cs | 20 ++--
Service/Car/Handler/HeartBeatMsgHandler.cs | 23 ++--
Service/Car/Handler/LockMsgRespHandler.cs | 19 +++-
Service/Car/Handler/SetParamMsgRespHandler.cs | 10 +-
.../Handler/SettleConfirmMsgRespHandler.cs | 11 +-
Service/Car/Handler/UnLockMsgRespHandler.cs | 18 ++-
Service/Car/Server/CarServer.cs | 30 ++---
WebStarter/Controllers/CarController.cs | 107 ++++++++++++++----
WebStarter/Dto/Req/SetParam.cs | 6 +-
10 files changed, 166 insertions(+), 85 deletions(-)
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
+}