();
+ list.Add(FrameTypeNo);
+ list.Add(MsgBodyCount);
+ list.AddRange(BitConverter.GetBytes(TransReason));
+ list.AddRange(BitConverter.GetBytes(PublicAddr));
+ list.AddRange(MsgBodyAddr);
+
+ list.AddRange(ModelConvert.Encode(this));
+ return list.ToArray();
+ }
+
+
+ public static void ParseHeader(IByteBuffer byteBuffer, ASDU asdu)
+ {
+ int start = ChargerConst.ApciStartChar.Length - 1;
+
+ asdu.PackLen = byteBuffer.GetUnsignedShortLE(start + 1);
+ asdu.CtlArea = byteBuffer.GetUnsignedInt(start + 3);
+ asdu.DestAddr = new[]
+ {
+ byteBuffer.GetByte(start + 7),
+ byteBuffer.GetByte(start + 8),
+ byteBuffer.GetByte(start + 9),
+ byteBuffer.GetByte(start + 10),
+ };
+ asdu.SrcAddr = byteBuffer.GetUnsignedInt(start + 11);
+ asdu.FrameTypeNo = byteBuffer.GetByte(start + 15);
+ asdu.MsgBodyCount = byteBuffer.GetByte(start + 16);
+ asdu.TransReason = byteBuffer.GetUnsignedShortLE(start + 17);
+ asdu.PublicAddr = byteBuffer.GetUnsignedShortLE(start + 19);
+ asdu.MsgBodyAddr = new[]
+ {
+ byteBuffer.GetByte(start + 21),
+ byteBuffer.GetByte(start + 22),
+ byteBuffer.GetByte(start + 23),
+ };
+ }
+ }
+}
\ No newline at end of file
diff --git a/HybirdFrameworkServices/Charger/Msg/Charger/Req/Login.cs b/HybirdFrameworkServices/Charger/Msg/Charger/Req/Login.cs
new file mode 100644
index 0000000..d3ddbec
--- /dev/null
+++ b/HybirdFrameworkServices/Charger/Msg/Charger/Req/Login.cs
@@ -0,0 +1,88 @@
+using HybirdFrameworkCore.Autofac.Attribute;
+
+namespace HybirdFrameworkServices.Charger.Msg.Charger.Req
+{
+ ///
+ /// 3.3.3 充放电机登陆签到
+ ///
+ public class Login : ASDU
+ {
+ ///
+ /// 记录类型
+ ///
+ [Property(0, 8)]
+ public byte RecordType { get; set; }
+ ///
+ /// 监控网关编号
+ ///
+ [Property(8, 16)]
+ public UInt16 GatewayNo { get; set; }
+ ///
+ /// 设备属性
+ ///
+ [Property(24, 8)]
+ public byte EquipType { get; set; }
+ ///
+ /// 通讯协议版本
+ ///
+ [Property(32, 8)]
+ public byte ConnProtocolVersion0 { get; set; }
+ [Property(40, 8)]
+ public byte ConnProtocolVersion1 { get; set; }
+ [Property(48, 8)]
+ public byte ConnProtocolVersion2 { get; set; }
+ public string ConnProtocolVersion { get; set; }
+ ///
+ /// 充电控制器硬件版本号
+ ///
+ [Property(56, 8)]
+ public byte ControllerHardwareVersion0 { get; set; }
+ [Property(64, 8)]
+ public byte ControllerHardwareVersion1 { get; set; }
+ [Property(72, 8)]
+ public byte ControllerHardwareVersion2 { get; set; }
+ public string ControllerHardwareVersion { get; set; }
+ ///
+ /// 充电控制器软件版本
+ ///
+ [Property(80, 8)]
+ public byte ControllerSoftwareVersion0 { get; set; }
+ [Property(88, 8)]
+ public byte ControllerSoftwareVersion1 { get; set; }
+ [Property(96, 8)]
+ public byte ControllerSoftwareVersion2 { get; set; }
+ public string ControllerSoftwareVersion { get; set; }
+ ///
+ /// 充电枪口数目
+ ///
+ [Property(104, 8)]
+ public byte GunNum { get; set; }
+ ///
+ /// 充电模块数目
+ ///
+ [Property(112, 8)]
+ public byte GunModuleNum { get; set; }
+ ///
+ /// 额定功率
+ ///
+ [Property(128, 16)]
+ public ushort RatedPower { get; set; }
+ ///
+ /// 当前功率
+ ///
+ [Property(136, 8)]
+ public byte CurrentPower { get; set; }
+ ///
+ /// 当前速率
+ ///
+ [Property(144, 8)]
+ public byte CurrentSpeed { get; set; }
+ ///
+ /// 分流器量程
+ ///
+ [Property(152, 16)]
+ public ushort DiverterRange { get; set; }
+
+
+ }
+}
diff --git a/HybirdFrameworkServices/Charger/Msg/Charger/Resp/AuthRes.cs b/HybirdFrameworkServices/Charger/Msg/Charger/Resp/AuthRes.cs
new file mode 100644
index 0000000..f8ef764
--- /dev/null
+++ b/HybirdFrameworkServices/Charger/Msg/Charger/Resp/AuthRes.cs
@@ -0,0 +1,35 @@
+using HybirdFrameworkCore.Autofac.Attribute;
+
+namespace HybirdFrameworkServices.Charger.Msg.Charger.Resp
+{
+ ///
+ /// 3.3.2 充放电机应答鉴权认证
+ ///
+ public class AuthRes : ASDU
+
+ {
+ ///
+ /// 记录类型
+ ///
+ [Property(0, 8)]
+ public byte RecordType { get; set; }
+ ///
+ /// 连接序号
+ ///
+ [Property(8, 16)]
+ public ushort ConnSeq { get; set; }
+
+ ///
+ /// 鉴权结果
+ ///
+ [Property(24, 8)]
+ public byte AuthResult { get; set; }
+
+ ///
+ /// 失败原因
+ ///
+ [Property(32, 8)]
+ public byte FailReason { get; set; }
+
+ }
+}
diff --git a/HybirdFrameworkServices/Charger/Msg/Cmd106.cs b/HybirdFrameworkServices/Charger/Msg/Cmd106.cs
deleted file mode 100644
index c0f3ecd..0000000
--- a/HybirdFrameworkServices/Charger/Msg/Cmd106.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using HybirdFrameworkCore.Autofac.Attribute;
-
-namespace HybirdFrameworkServices.Charger.Msg;
-
-[Scope("InstancePerDependency")]
-public class Cmd106
-{
-
-}
\ No newline at end of file
diff --git a/HybirdFrameworkServices/Charger/Msg/Host/Req/Auth.cs b/HybirdFrameworkServices/Charger/Msg/Host/Req/Auth.cs
new file mode 100644
index 0000000..b522b8f
--- /dev/null
+++ b/HybirdFrameworkServices/Charger/Msg/Host/Req/Auth.cs
@@ -0,0 +1,57 @@
+using HybirdFrameworkCore.Autofac.Attribute;
+
+namespace HybirdFrameworkServices.Charger.Msg.Host.Req
+{
+ ///
+ /// 3.3.1 监控平台鉴权认证
+ ///
+ public class Auth : ASDU
+ {
+ ///
+ /// 记录类型
+ ///
+ public byte RecordType { get; set; }
+ ///
+ /// 客户端类型.1站控 2本地控制器 3测试客户端 4TCU模式 0未知设备
+ ///
+ [Property(0, 8)]
+ public byte ClientType { get; set; }
+
+ ///
+ /// 连接序号
+ ///
+ [Property(8, 16)]
+ public ushort ConnSeq { get; set; }
+
+ ///
+ /// 鉴权码字节数组
+ ///
+ [Property(24, 64)]
+ public byte[] AuthCodes { get; set; }
+
+ ///
+ /// 鉴码KEY
+ ///
+ [Property(88, 8)]
+ public byte AuthCodeKey { get; set; }
+
+ public Auth(ushort connseq, byte[] authcodes, byte authcodekey)
+ {
+ PackLen = 0;
+ CtlArea = 0;
+ SrcAddr = 0;
+
+ FrameTypeNo = 45;
+ MsgBodyCount = 1;
+ TransReason = 3;
+ PublicAddr = 0;
+ MsgBodyAddr = new byte[] { 0, 0, 0 };
+
+ RecordType = 24;
+ ClientType = 1;
+ ConnSeq = connseq;
+ AuthCodes = authcodes;
+ AuthCodeKey = authcodekey;
+ }
+ }
+}
\ No newline at end of file
diff --git a/HybirdFrameworkServices/Charger/Msg/Host/Resp/LogSignMessage.cs b/HybirdFrameworkServices/Charger/Msg/Host/Resp/LogSignMessage.cs
new file mode 100644
index 0000000..5fe2b00
--- /dev/null
+++ b/HybirdFrameworkServices/Charger/Msg/Host/Resp/LogSignMessage.cs
@@ -0,0 +1,89 @@
+using HybirdFrameworkCore.Autofac.Attribute;
+
+namespace HybirdFrameworkServices.Charger.Msg.Host.Resp
+{
+ ///
+ /// 3.3.4 监控平台应答充电设备登录签到报文
+ ///
+ public class LogSignMessage : ASDU
+ {
+ [Property(0, 8)] public byte RecordType { get; set; }
+
+ ///
+ /// 结果
+ /// 0:成功/确认
+ ///1:失败-平台处理该消息失败
+ ///2:消息有误-消息校验错误/消息长度有误
+ ///4:该设备编码在系统没有找到
+ ///5:该设备编码在系统中异常,可能存在冲突
+ ///6:充电控制器数目不对
+ ///255:其它错误
+ ///
+ [Property(8, 8)]
+ public byte Result { get; set; }
+
+ ///
+ /// 年
+ ///
+ [Property(16, 16)]
+ public ushort TimeYear { get; set; }
+
+ ///
+ /// 月
+ ///
+ [Property(32, 8)]
+ public byte TimeMonth { get; set; }
+
+ ///
+ /// 日
+ ///
+ [Property(40, 8)]
+ public byte TimeDay { get; set; }
+
+ ///
+ /// 时
+ ///
+ [Property(48, 8)]
+ public byte TimeHour { get; set; }
+
+ ///
+ /// 分
+ ///
+ [Property(56, 8)]
+ public byte TimeMinute { get; set; }
+
+ ///
+ /// 秒
+ ///
+ [Property(64, 8)]
+ public byte TimeSecond { get; set; }
+
+ ///
+ /// 保留:1位, 默认0xFF
+ ///
+ [Property(72, 8)]
+ public byte Time { get; set; }
+
+ public LogSignMessage(byte result)
+ {
+ Result = result;
+
+ CtlArea = 0;
+ SrcAddr = 0;
+ FrameTypeNo = 45;
+ MsgBodyCount = 1;
+ TransReason = 4;
+ PublicAddr = 0;
+ MsgBodyAddr = new byte[] { 0, 0, 0 };
+ RecordType = 12;
+
+ DateTime dtime = DateTime.Now;
+ TimeYear = Convert.ToUInt16(dtime.Year.ToString());
+ TimeMonth = Convert.ToByte(dtime.Month);
+ TimeDay = Convert.ToByte(dtime.Day);
+ TimeHour = Convert.ToByte(dtime.Hour);
+ TimeMinute = Convert.ToByte(dtime.Minute);
+ TimeSecond = Convert.ToByte(dtime.Second);
+ }
+ }
+}
\ No newline at end of file
diff --git a/WebStarter/Program.cs b/WebStarter/Program.cs
index 5fe1276..8e62897 100644
--- a/WebStarter/Program.cs
+++ b/WebStarter/Program.cs
@@ -65,7 +65,4 @@ app.MapControllers();
AppInfo.Container = app.Services.GetAutofacRoot();
-Server server = AppInfo.Container.Resolve();
-server.Start(9000);
-
app.Run();
\ No newline at end of file
diff --git a/WinFormStarter/Form2.cs b/WinFormStarter/Form2.cs
index 317e02a..ef85d94 100644
--- a/WinFormStarter/Form2.cs
+++ b/WinFormStarter/Form2.cs
@@ -1,15 +1,9 @@
-using HybirdFrameworkDriver.TcpServer;
-
-namespace WinFormStarter;
+namespace WinFormStarter;
public partial class Form2 : Form
{
-
- private Server _server;
- public Form2(Server server)
+ public Form2()
{
- _server = server;
InitializeComponent();
- _server.Start(9000);
}
}
\ No newline at end of file
diff --git a/WinFormStarter/bin/Debug/net6.0-windows/Microsoft.Extensions.Logging.Abstractions.dll b/WinFormStarter/bin/Debug/net6.0-windows/Microsoft.Extensions.Logging.Abstractions.dll
index 2c87f798a33608d70f582b601ec528347ec93a4c..bb27a2fcaa36c520c62d59c12ed48aad23ad088a 100644
GIT binary patch
literal 62064
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