diff --git a/README.md b/README.md index f153e8c..ba4ccfb 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,41 @@ > 根据对应消息ID:MsgId + + +## NuGet安装 + +| Package Name | Version | Downloads +|--------------| ------- | ---- +| Install-Package JTNewEnergy | ![JTNewEnergy](https://img.shields.io/nuget/v/JTNewEnergy.svg) | ![JTNewEnergy](https://img.shields.io/nuget/dt/JTNewEnergy.svg) + +## 使用BenchmarkDotNet性能测试报告(只是玩玩,不能当真) + +``` ini +BenchmarkDotNet=v0.11.3, OS=Windows 10.0.17134.472 (1803/April2018Update/Redstone4) +Intel Core i7-8700K CPU 3.70GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores + [Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3260.0 + Job-FVMQGI : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3260.0 + Job-LGLQDK : .NET Core 2.2.0 (CoreCLR 4.6.27110.04, CoreFX 4.6.27110.04), 64bit RyuJIT + +Platform=AnyCpu Runtime=Clr Server=False + +``` +| Method | Toolchain | N | Mean | Error | StdDev | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op | +|---------------------- |-------------- |------- |-------------:|-----------:|-----------:|------------:|------------:|------------:|--------------------:| +| **JTNE_0x02_Serialize** | **Default** | **100** | **5.997 ms** | **0.0704 ms** | **0.0659 ms** | **156.2500** | **-** | **-** | **1000.83 KB** | +| JTNE_0x02_Deserialize | Default | 100 | 5.713 ms | 0.0654 ms | 0.0611 ms | 140.6250 | - | - | 906.31 KB | +| JTNE_0x02_Serialize | .NET Core 2.2 | 100 | 5.003 ms | 0.0706 ms | 0.0660 ms | 140.6250 | - | - | 878.13 KB | +| JTNE_0x02_Deserialize | .NET Core 2.2 | 100 | 4.591 ms | 0.0876 ms | 0.0899 ms | 125.0000 | - | - | 780.47 KB | +| **JTNE_0x02_Serialize** | **Default** | **10000** | **621.248 ms** | **12.0181 ms** | **11.8034 ms** | **16000.0000** | **-** | **-** | **100081.45 KB** | +| JTNE_0x02_Deserialize | Default | 10000 | 569.567 ms | 9.4221 ms | 8.8135 ms | 14000.0000 | - | - | 90629.45 KB | +| JTNE_0x02_Serialize | .NET Core 2.2 | 10000 | 509.149 ms | 9.9488 ms | 9.3061 ms | 14000.0000 | - | - | 87812.5 KB | +| JTNE_0x02_Deserialize | .NET Core 2.2 | 10000 | 457.481 ms | 8.6865 ms | 8.9204 ms | 12000.0000 | - | - | 78046.88 KB | +| **JTNE_0x02_Serialize** | **Default** | **100000** | **6,038.592 ms** | **37.8782 ms** | **35.4313 ms** | **162000.0000** | **1000.0000** | **-** | **1000795.95 KB** | +| JTNE_0x02_Deserialize | Default | 100000 | 5,676.756 ms | 51.2919 ms | 47.9785 ms | 147000.0000 | 1000.0000 | - | 906264.57 KB | +| JTNE_0x02_Serialize | .NET Core 2.2 | 100000 | 5,112.387 ms | 66.7348 ms | 59.1586 ms | 142000.0000 | 1000.0000 | - | 878125 KB | +| JTNE_0x02_Deserialize | .NET Core 2.2 | 100000 | 4,469.358 ms | 20.2586 ms | 15.8166 ms | 127000.0000 | 1000.0000 | - | 780468.75 KB | + ## JTNewEnergy终端通讯协议消息对照表 | 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 | diff --git a/src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj b/src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj new file mode 100644 index 0000000..ac9089d --- /dev/null +++ b/src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj @@ -0,0 +1,19 @@ + + + + netcoreapp2.2;net472 + Exe + + + + + + + + + + + + + + diff --git a/src/JTNE.Protocol.Benchmark/JTNESerializerContext.cs b/src/JTNE.Protocol.Benchmark/JTNESerializerContext.cs new file mode 100644 index 0000000..66b74ee --- /dev/null +++ b/src/JTNE.Protocol.Benchmark/JTNESerializerContext.cs @@ -0,0 +1,220 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Environments; +using BenchmarkDotNet.Jobs; +using BenchmarkDotNet.Toolchains.CsProj; +using System; +using System.Collections.Generic; +using System.Text; +using JTNE.Protocol; +using JTNE.Protocol.Extensions; +using JTNE.Protocol.MessageBody; +using JTNE.Protocol.Enums; + +namespace JTNE.Protocol.Benchmark +{ + [Config(typeof(JTNESerializerConfig))] + [MemoryDiagnoser] + public class JTNESerializerContext + { + private byte[] bytes; + + [Params(100, 10000, 100000)] + public int N; + + [GlobalSetup] + public void Setup() + { + bytes = "2323020131323334353637383900000000000000000100D001040507003A00001A0A00640063030602007B02030202010201004100370300EC00640203020042023605085800650308AE006F0C9600030102030D1B221A0A560D086502040100CB006605010031AD030012D1CB061115007B0709000832124211320607110000159D03000003E8000003E9000003EA03000007D0000007D1000007D20300000BB800000BB900000BBA0300000FA000000FA100000FA20802010002007B0037006F03006F00DE014D03000504D2004200DE0301BC022B029A0902010004010203040200040506070867".ToHexBytes(); + } + + [Benchmark(Description = "JTNE_0x02_Serialize")] + public void JTNE_0x02_Serialize() + { + for (int i = 0; i < N; i++) + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = JTNEAskId.Success.ToByteValue(); + jTNEPackage.MsgId = JTNEMsgId.uploadim.ToByteValue(); + jTNEPackage.VIN = "123456789"; + JTNE_0x02 jTNE_0X02 = new JTNE_0x02(); + jTNE_0X02.Values = new Dictionary(); + + JTNE_0x02_0x01 jTNE_0X02_0X01 = new JTNE_0x02_0x01(); + jTNE_0X02_0X01.Accelerator = 0x02; + jTNE_0X02_0X01.Brakes = 0x03; + jTNE_0X02_0X01.CarStatus = 0x04; + jTNE_0X02_0X01.ChargeStatus = 0x05; + jTNE_0X02_0X01.DCStatus = 0x06; + jTNE_0X02_0X01.OperationMode = 0x07; + jTNE_0X02_0X01.Resistance = 123; + jTNE_0X02_0X01.SOC = 0x03; + jTNE_0X02_0X01.Speed = 58; + jTNE_0X02_0X01.Stall = 0x02; + jTNE_0X02_0X01.TotalDis = 6666; + jTNE_0X02_0X01.TotalTemp = 99; + jTNE_0X02_0X01.TotalVoltage = 100; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x01, jTNE_0X02_0X01); + + JTNE_0x02_0x02 jTNE_0X02_0X02 = new JTNE_0x02_0x02(); + jTNE_0X02_0X02.Electricals = new List(); + JTNE.Protocol.Metadata.Electrical electrical1 = new JTNE.Protocol.Metadata.Electrical(); + electrical1.ElControlTemp = 0x01; + electrical1.ElCurrent = 100; + electrical1.ElNo = 0x01; + electrical1.ElSpeed = 65; + electrical1.ElStatus = 0x02; + electrical1.ElTemp = 0x03; + electrical1.ElTorque = 55; + electrical1.ElVoltage = 236; + JTNE.Protocol.Metadata.Electrical electrical2 = new JTNE.Protocol.Metadata.Electrical(); + electrical2.ElControlTemp = 0x02; + electrical2.ElCurrent = 101; + electrical2.ElNo = 0x02; + electrical2.ElSpeed = 66; + electrical2.ElStatus = 0x03; + electrical2.ElTemp = 0x05; + electrical2.ElTorque = 566; + electrical2.ElVoltage = 2136; + jTNE_0X02_0X02.Electricals.Add(electrical1); + jTNE_0X02_0X02.Electricals.Add(electrical2); + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x02, jTNE_0X02_0X02); + + JTNE_0x02_0x03 jTNE_0X02_0X03 = new JTNE_0x02_0x03(); + jTNE_0X02_0X03.DCStatus = 0x02; + jTNE_0X02_0X03.FuelBatteryCurrent = 111; + jTNE_0X02_0X03.FuelBatteryVoltage = 2222; + jTNE_0X02_0X03.FuelConsumptionRate = 3222; + jTNE_0X02_0X03.HydrogenSystemMaxConcentrations = 6666; + jTNE_0X02_0X03.HydrogenSystemMaxConcentrationsNo = 0x56; + jTNE_0X02_0X03.HydrogenSystemMaxPressure = 3336; + jTNE_0X02_0X03.HydrogenSystemMaxPressureNo = 0x65; + jTNE_0X02_0X03.HydrogenSystemMaxTemp = 3355; + jTNE_0X02_0X03.HydrogenSystemMaxTempNo = 0x22; + jTNE_0X02_0X03.Temperatures = new byte[] + { + 0x01,0x02,0x03 + }; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x03, jTNE_0X02_0X03); + + JTNE_0x02_0x04 jTNE_0X02_0X04 = new JTNE_0x02_0x04(); + jTNE_0X02_0X04.EngineStatus = 0x01; + jTNE_0X02_0X04.FuelRate = 102; + jTNE_0X02_0X04.Revs = 203; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x04, jTNE_0X02_0X04); + + JTNE_0x02_0x05 jTNE_0X02_0X05 = new JTNE_0x02_0x05(); + jTNE_0X02_0X05.Lat = 1233355; + jTNE_0X02_0X05.Lng = 3255555; + jTNE_0X02_0X05.PositioStatus = 0x01; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x05, jTNE_0X02_0X05); + + JTNE_0x02_0x06 jTNE_0X02_0X06 = new JTNE_0x02_0x06(); + jTNE_0X02_0X06.MaxTempBatteryAssemblyNo = 0x12; + jTNE_0X02_0X06.MaxTempProbeBatteryNo = 0x32; + jTNE_0X02_0X06.MaxTempProbeBatteryValue = 0x42; + jTNE_0X02_0X06.MaxVoltageBatteryAssemblyNo = 0x11; + jTNE_0X02_0X06.MaxVoltageSingleBatteryNo = 0x15; + jTNE_0X02_0X06.MaxVoltageSingleBatteryValue = 123; + jTNE_0X02_0X06.MinTempBatteryAssemblyNo = 0x32; + jTNE_0X02_0X06.MinTempProbeBatteryNo = 0x11; + jTNE_0X02_0X06.MinTempProbeBatteryValue = 0x06; + jTNE_0X02_0X06.MinVoltageBatteryAssemblyNo = 0x07; + jTNE_0X02_0X06.MinVoltageSingleBatteryNo = 0x09; + jTNE_0X02_0X06.MinVoltageSingleBatteryValue = 0x08; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x06, jTNE_0X02_0X06); + + JTNE_0x02_0x07 jTNE_0X02_0X07 = new JTNE_0x02_0x07(); + jTNE_0X02_0X07.AlarmBatteryFlag = 5533; + jTNE_0X02_0X07.AlarmLevel = 0x11; + jTNE_0X02_0X07.AlarmBatteryOthers = new List + { + 1000,1001,1002 + }; + jTNE_0X02_0X07.AlarmEls = new List + { + 2000,2001,2002 + }; + jTNE_0X02_0X07.AlarmEngines = new List + { + 3000,3001,3002 + }; + jTNE_0X02_0X07.AlarmOthers = new List + { + 4000,4001,4002 + }; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x07, jTNE_0X02_0X07); + + JTNE_0x02_0x08 jTNE_0X02_0X08 = new JTNE_0x02_0x08(); + jTNE_0X02_0X08.BatteryAssemblies = new List(); + JTNE.Protocol.Metadata.BatteryAssembly batteryAssembly1 = new JTNE.Protocol.Metadata.BatteryAssembly(); + batteryAssembly1.BatteryAssemblyCurrent = 123; + batteryAssembly1.BatteryAssemblyNo = 0x01; + batteryAssembly1.BatteryAssemblyVoltage = 0x02; + batteryAssembly1.SingleBatteryCount = 55; + batteryAssembly1.ThisSingleBatteryBeginCount = 0x02; + batteryAssembly1.ThisSingleBatteryBeginNo = 111; + batteryAssembly1.SingleBatteryVoltages = new List { + 111,222,333 + }; + JTNE.Protocol.Metadata.BatteryAssembly batteryAssembly2 = new JTNE.Protocol.Metadata.BatteryAssembly(); + batteryAssembly2.BatteryAssemblyCurrent = 1234; + batteryAssembly2.BatteryAssemblyNo = 0x03; + batteryAssembly2.BatteryAssemblyVoltage = 0x05; + batteryAssembly2.SingleBatteryCount = 66; + batteryAssembly2.ThisSingleBatteryBeginCount = 0x02; + batteryAssembly2.ThisSingleBatteryBeginNo = 222; + batteryAssembly2.SingleBatteryVoltages = new List { + 444,555,666 + }; + jTNE_0X02_0X08.BatteryAssemblies.Add(batteryAssembly1); + jTNE_0X02_0X08.BatteryAssemblies.Add(batteryAssembly2); + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x08, jTNE_0X02_0X08); + + + JTNE_0x02_0x09 jTNE_0X02_0X09 = new JTNE_0x02_0x09(); + jTNE_0X02_0X09.BatteryTemperatures = new List(); + + JTNE.Protocol.Metadata.BatteryTemperature batteryTemperature1 = new JTNE.Protocol.Metadata.BatteryTemperature(); + batteryTemperature1.BatteryAssemblyNo = 0x01; + batteryTemperature1.Temperatures = new byte[] + { + 0x01,0x02,0x03,0x04 + }; + + JTNE.Protocol.Metadata.BatteryTemperature batteryTemperature2 = new JTNE.Protocol.Metadata.BatteryTemperature(); + batteryTemperature2.BatteryAssemblyNo = 0x02; + batteryTemperature2.Temperatures = new byte[] + { + 0x05,0x06,0x07,0x08 + }; + + jTNE_0X02_0X09.BatteryTemperatures.Add(batteryTemperature1); + jTNE_0X02_0X09.BatteryTemperatures.Add(batteryTemperature2); + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x09, jTNE_0X02_0X09); + + jTNEPackage.Bodies = jTNE_0X02; + + var hex = JTNESerializer.Serialize(jTNEPackage); + } + } + + [Benchmark(Description = "JTNE_0x02_Deserialize")] + public void JTNE_0x02_Deserialize() + { + for (int i = 0; i < N; i++) + { + JTNEPackage jTNEPackage = JTNESerializer.Deserialize(bytes); + } + } + } + + public class JTNESerializerConfig : ManualConfig + { + public JTNESerializerConfig() + { + Add(Job.Default.WithGcServer(false).With(Runtime.Clr).With(Platform.AnyCpu)); + Add(Job.Default.WithGcServer(false).With(CsProjCoreToolchain.NetCoreApp22).With(Platform.AnyCpu)); + } + } +} diff --git a/src/JTNE.Protocol.Benchmark/Program.cs b/src/JTNE.Protocol.Benchmark/Program.cs new file mode 100644 index 0000000..2992122 --- /dev/null +++ b/src/JTNE.Protocol.Benchmark/Program.cs @@ -0,0 +1,14 @@ +using BenchmarkDotNet.Reports; +using BenchmarkDotNet.Running; +using System; + +namespace JTNE.Protocol.Benchmark +{ + class Program + { + static void Main(string[] args) + { + Summary summary = BenchmarkRunner.Run(); + } + } +} diff --git a/src/JTNE.Protocol.Test/Package/JTNE_0x02_PackageTest.cs b/src/JTNE.Protocol.Test/Package/JTNE_0x02_PackageTest.cs new file mode 100644 index 0000000..8ba535b --- /dev/null +++ b/src/JTNE.Protocol.Test/Package/JTNE_0x02_PackageTest.cs @@ -0,0 +1,340 @@ +using JTNE.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JTNE.Protocol.Enums; +using JTNE.Protocol.MessageBody; +using JTNE.Protocol.Internal; + +namespace JTNE.Protocol.Test.Package +{ + public class JTNE_0x02_PackageTest + { + [Fact] + public void Test1() + { + JTNEPackage jTNEPackage = new JTNEPackage(); + jTNEPackage.AskId = JTNEAskId.Success.ToByteValue(); + jTNEPackage.MsgId = JTNEMsgId.uploadim.ToByteValue(); + jTNEPackage.VIN = "123456789"; + JTNE_0x02 jTNE_0X02 = new JTNE_0x02(); + jTNE_0X02.Values = new Dictionary(); + + JTNE_0x02_0x01 jTNE_0X02_0X01 = new JTNE_0x02_0x01(); + jTNE_0X02_0X01.Accelerator = 0x02; + jTNE_0X02_0X01.Brakes = 0x03; + jTNE_0X02_0X01.CarStatus = 0x04; + jTNE_0X02_0X01.ChargeStatus = 0x05; + jTNE_0X02_0X01.DCStatus = 0x06; + jTNE_0X02_0X01.OperationMode = 0x07; + jTNE_0X02_0X01.Resistance = 123; + jTNE_0X02_0X01.SOC = 0x03; + jTNE_0X02_0X01.Speed = 58; + jTNE_0X02_0X01.Stall = 0x02; + jTNE_0X02_0X01.TotalDis = 6666; + jTNE_0X02_0X01.TotalTemp = 99; + jTNE_0X02_0X01.TotalVoltage = 100; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x01, jTNE_0X02_0X01); + + JTNE_0x02_0x02 jTNE_0X02_0X02 = new JTNE_0x02_0x02(); + jTNE_0X02_0X02.Electricals = new List(); + Metadata.Electrical electrical1 = new Metadata.Electrical(); + electrical1.ElControlTemp = 0x01; + electrical1.ElCurrent = 100; + electrical1.ElNo = 0x01; + electrical1.ElSpeed = 65; + electrical1.ElStatus = 0x02; + electrical1.ElTemp = 0x03; + electrical1.ElTorque = 55; + electrical1.ElVoltage = 236; + Metadata.Electrical electrical2 = new Metadata.Electrical(); + electrical2.ElControlTemp = 0x02; + electrical2.ElCurrent = 101; + electrical2.ElNo = 0x02; + electrical2.ElSpeed = 66; + electrical2.ElStatus = 0x03; + electrical2.ElTemp = 0x05; + electrical2.ElTorque = 566; + electrical2.ElVoltage = 2136; + jTNE_0X02_0X02.Electricals.Add(electrical1); + jTNE_0X02_0X02.Electricals.Add(electrical2); + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x02, jTNE_0X02_0X02); + + JTNE_0x02_0x03 jTNE_0X02_0X03 = new JTNE_0x02_0x03(); + jTNE_0X02_0X03.DCStatus = 0x02; + jTNE_0X02_0X03.FuelBatteryCurrent = 111; + jTNE_0X02_0X03.FuelBatteryVoltage = 2222; + jTNE_0X02_0X03.FuelConsumptionRate = 3222; + jTNE_0X02_0X03.HydrogenSystemMaxConcentrations = 6666; + jTNE_0X02_0X03.HydrogenSystemMaxConcentrationsNo = 0x56; + jTNE_0X02_0X03.HydrogenSystemMaxPressure = 3336; + jTNE_0X02_0X03.HydrogenSystemMaxPressureNo = 0x65; + jTNE_0X02_0X03.HydrogenSystemMaxTemp = 3355; + jTNE_0X02_0X03.HydrogenSystemMaxTempNo = 0x22; + jTNE_0X02_0X03.Temperatures = new byte[] + { + 0x01,0x02,0x03 + }; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x03, jTNE_0X02_0X03); + + JTNE_0x02_0x04 jTNE_0X02_0X04 = new JTNE_0x02_0x04(); + jTNE_0X02_0X04.EngineStatus = 0x01; + jTNE_0X02_0X04.FuelRate = 102; + jTNE_0X02_0X04.Revs = 203; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x04, jTNE_0X02_0X04); + + JTNE_0x02_0x05 jTNE_0X02_0X05 = new JTNE_0x02_0x05(); + jTNE_0X02_0X05.Lat = 1233355; + jTNE_0X02_0X05.Lng = 3255555; + jTNE_0X02_0X05.PositioStatus = 0x01; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x05, jTNE_0X02_0X05); + + JTNE_0x02_0x06 jTNE_0X02_0X06 = new JTNE_0x02_0x06(); + jTNE_0X02_0X06.MaxTempBatteryAssemblyNo = 0x12; + jTNE_0X02_0X06.MaxTempProbeBatteryNo = 0x32; + jTNE_0X02_0X06.MaxTempProbeBatteryValue = 0x42; + jTNE_0X02_0X06.MaxVoltageBatteryAssemblyNo = 0x11; + jTNE_0X02_0X06.MaxVoltageSingleBatteryNo = 0x15; + jTNE_0X02_0X06.MaxVoltageSingleBatteryValue = 123; + jTNE_0X02_0X06.MinTempBatteryAssemblyNo = 0x32; + jTNE_0X02_0X06.MinTempProbeBatteryNo = 0x11; + jTNE_0X02_0X06.MinTempProbeBatteryValue = 0x06; + jTNE_0X02_0X06.MinVoltageBatteryAssemblyNo = 0x07; + jTNE_0X02_0X06.MinVoltageSingleBatteryNo = 0x09; + jTNE_0X02_0X06.MinVoltageSingleBatteryValue = 0x08; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x06, jTNE_0X02_0X06); + + JTNE_0x02_0x07 jTNE_0X02_0X07 = new JTNE_0x02_0x07(); + jTNE_0X02_0X07.AlarmBatteryFlag = 5533; + jTNE_0X02_0X07.AlarmLevel = 0x11; + jTNE_0X02_0X07.AlarmBatteryOthers = new List + { + 1000,1001,1002 + }; + jTNE_0X02_0X07.AlarmEls = new List + { + 2000,2001,2002 + }; + jTNE_0X02_0X07.AlarmEngines = new List + { + 3000,3001,3002 + }; + jTNE_0X02_0X07.AlarmOthers = new List + { + 4000,4001,4002 + }; + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x07, jTNE_0X02_0X07); + + JTNE_0x02_0x08 jTNE_0X02_0X08 = new JTNE_0x02_0x08(); + jTNE_0X02_0X08.BatteryAssemblies = new List(); + Metadata.BatteryAssembly batteryAssembly1 = new Metadata.BatteryAssembly(); + batteryAssembly1.BatteryAssemblyCurrent = 123; + batteryAssembly1.BatteryAssemblyNo = 0x01; + batteryAssembly1.BatteryAssemblyVoltage = 0x02; + batteryAssembly1.SingleBatteryCount = 55; + batteryAssembly1.ThisSingleBatteryBeginCount = 0x02; + batteryAssembly1.ThisSingleBatteryBeginNo = 111; + batteryAssembly1.SingleBatteryVoltages = new List { + 111,222,333 + }; + Metadata.BatteryAssembly batteryAssembly2 = new Metadata.BatteryAssembly(); + batteryAssembly2.BatteryAssemblyCurrent = 1234; + batteryAssembly2.BatteryAssemblyNo = 0x03; + batteryAssembly2.BatteryAssemblyVoltage = 0x05; + batteryAssembly2.SingleBatteryCount = 66; + batteryAssembly2.ThisSingleBatteryBeginCount = 0x02; + batteryAssembly2.ThisSingleBatteryBeginNo = 222; + batteryAssembly2.SingleBatteryVoltages = new List { + 444,555,666 + }; + jTNE_0X02_0X08.BatteryAssemblies.Add(batteryAssembly1); + jTNE_0X02_0X08.BatteryAssemblies.Add(batteryAssembly2); + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x08, jTNE_0X02_0X08); + + + JTNE_0x02_0x09 jTNE_0X02_0X09 = new JTNE_0x02_0x09(); + jTNE_0X02_0X09.BatteryTemperatures = new List(); + + Metadata.BatteryTemperature batteryTemperature1 = new Metadata.BatteryTemperature(); + batteryTemperature1.BatteryAssemblyNo = 0x01; + batteryTemperature1.Temperatures = new byte[] + { + 0x01,0x02,0x03,0x04 + }; + + Metadata.BatteryTemperature batteryTemperature2 = new Metadata.BatteryTemperature(); + batteryTemperature2.BatteryAssemblyNo = 0x02; + batteryTemperature2.Temperatures = new byte[] + { + 0x05,0x06,0x07,0x08 + }; + + jTNE_0X02_0X09.BatteryTemperatures.Add(batteryTemperature1); + jTNE_0X02_0X09.BatteryTemperatures.Add(batteryTemperature2); + jTNE_0X02.Values.Add(JTNE_0x02_Body.JTNE_0x02_0x09, jTNE_0X02_0X09); + + jTNEPackage.Bodies = jTNE_0X02; + var hex = JTNESerializer.Serialize(jTNEPackage).ToHexString(); + Assert.Equal("2323020131323334353637383900000000000000000100D001040507003A00001A0A00640063030602007B02030202010201004100370300EC00640203020042023605085800650308AE006F0C9600030102030D1B221A0A560D086502040100CB006605010031AD030012D1CB061115007B0709000832124211320607110000159D03000003E8000003E9000003EA03000007D0000007D1000007D20300000BB800000BB900000BBA0300000FA000000FA100000FA20802010002007B0037006F03006F00DE014D03000504D2004200DE0301BC022B029A0902010004010203040200040506070867", hex); + } + + [Fact] + public void Test2() + { + var data = "2323020131323334353637383900000000000000000100D001040507003A00001A0A00640063030602007B02030202010201004100370300EC00640203020042023605085800650308AE006F0C9600030102030D1B221A0A560D086502040100CB006605010031AD030012D1CB061115007B0709000832124211320607110000159D03000003E8000003E9000003EA03000007D0000007D1000007D20300000BB800000BB900000BBA0300000FA000000FA100000FA20802010002007B0037006F03006F00DE014D03000504D2004200DE0301BC022B029A0902010004010203040200040506070867".ToHexBytes(); + JTNEPackage jTNEPackage = JTNESerializer.Deserialize(data); + JTNE_0x02 jTNE_0X02 = jTNEPackage.Bodies as JTNE_0x02; + + JTNE_0x02_0x01 jTNE_0X02_0X01 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x01] as JTNE_0x02_0x01; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x01, jTNE_0X02_0X01.TypeCode); + Assert.Equal(0x02, jTNE_0X02_0X01.Accelerator); + Assert.Equal(0x03, jTNE_0X02_0X01.Brakes); + Assert.Equal(0x04, jTNE_0X02_0X01.CarStatus); + Assert.Equal(0x05, jTNE_0X02_0X01.ChargeStatus); + Assert.Equal(0x06, jTNE_0X02_0X01.DCStatus); + Assert.Equal(0x07, jTNE_0X02_0X01.OperationMode); + Assert.Equal(123, jTNE_0X02_0X01.Resistance); + Assert.Equal(0x03, jTNE_0X02_0X01.SOC); + Assert.Equal(58, jTNE_0X02_0X01.Speed); + Assert.Equal(0x02, jTNE_0X02_0X01.Stall); + Assert.Equal((uint)6666, jTNE_0X02_0X01.TotalDis); + Assert.Equal(99, jTNE_0X02_0X01.TotalTemp); + Assert.Equal(100, jTNE_0X02_0X01.TotalVoltage); + + + JTNE_0x02_0x02 jTNE_0X02_0X02 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x02] as JTNE_0x02_0x02; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x02, jTNE_0X02_0X02.TypeCode); + Assert.Equal(2, jTNE_0X02_0X02.ElectricalCount); + Metadata.Electrical electrical1 = jTNE_0X02_0X02.Electricals[0]; + Assert.Equal(0x01, electrical1.ElControlTemp); + Assert.Equal(100, electrical1.ElCurrent); + Assert.Equal(0x01, electrical1.ElNo); + Assert.Equal(65, electrical1.ElSpeed); + Assert.Equal(0x02, electrical1.ElStatus); + Assert.Equal(0x03, electrical1.ElTemp); + Assert.Equal(55, electrical1.ElTorque); + Assert.Equal(236, electrical1.ElVoltage); + Metadata.Electrical electrical2 = jTNE_0X02_0X02.Electricals[1]; + Assert.Equal(0x02, electrical2.ElControlTemp); + Assert.Equal(101, electrical2.ElCurrent); + Assert.Equal(0x02, electrical2.ElNo); + Assert.Equal(66, electrical2.ElSpeed); + Assert.Equal(0x03, electrical2.ElStatus); + Assert.Equal(0x05, electrical2.ElTemp); + Assert.Equal(566, electrical2.ElTorque); + Assert.Equal(2136, electrical2.ElVoltage); + + JTNE_0x02_0x03 jTNE_0X02_0X03 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x03] as JTNE_0x02_0x03; + + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x03, jTNE_0X02_0X03.TypeCode); + Assert.Equal(0x02, jTNE_0X02_0X03.DCStatus); + Assert.Equal(111, jTNE_0X02_0X03.FuelBatteryCurrent); + Assert.Equal(2222, jTNE_0X02_0X03.FuelBatteryVoltage); + Assert.Equal(3222, jTNE_0X02_0X03.FuelConsumptionRate); + Assert.Equal(6666, jTNE_0X02_0X03.HydrogenSystemMaxConcentrations); + Assert.Equal(0x56, jTNE_0X02_0X03.HydrogenSystemMaxConcentrationsNo); + Assert.Equal(3336, jTNE_0X02_0X03.HydrogenSystemMaxPressure); + Assert.Equal(0x65, jTNE_0X02_0X03.HydrogenSystemMaxPressureNo); + Assert.Equal(3355, jTNE_0X02_0X03.HydrogenSystemMaxTemp); + Assert.Equal(0x22, jTNE_0X02_0X03.HydrogenSystemMaxTempNo); + Assert.Equal(new byte[] { 0x01, 0x02, 0x03 }, jTNE_0X02_0X03.Temperatures); + + JTNE_0x02_0x04 jTNE_0X02_0X04 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x04] as JTNE_0x02_0x04; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x04, jTNE_0X02_0X04.TypeCode); + Assert.Equal(0x01, jTNE_0X02_0X04.EngineStatus); + Assert.Equal(102, jTNE_0X02_0X04.FuelRate); + Assert.Equal(203, jTNE_0X02_0X04.Revs); + + JTNE_0x02_0x05 jTNE_0X02_0X05 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x05] as JTNE_0x02_0x05; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x05, jTNE_0X02_0X05.TypeCode); + Assert.Equal((uint)1233355, jTNE_0X02_0X05.Lat); + Assert.Equal((uint)3255555, jTNE_0X02_0X05.Lng); + Assert.Equal(0x01, jTNE_0X02_0X05.PositioStatus); + + + JTNE_0x02_0x06 jTNE_0X02_0X06 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x06] as JTNE_0x02_0x06; + Assert.Equal(0x12, jTNE_0X02_0X06.MaxTempBatteryAssemblyNo); + Assert.Equal(0x32, jTNE_0X02_0X06.MaxTempProbeBatteryNo); + Assert.Equal(0x42, jTNE_0X02_0X06.MaxTempProbeBatteryValue); + Assert.Equal(0x11, jTNE_0X02_0X06.MaxVoltageBatteryAssemblyNo); + Assert.Equal(0x15, jTNE_0X02_0X06.MaxVoltageSingleBatteryNo); + Assert.Equal(123, jTNE_0X02_0X06.MaxVoltageSingleBatteryValue); + Assert.Equal(0x11, jTNE_0X02_0X06.MinTempProbeBatteryNo); + Assert.Equal(0x06, jTNE_0X02_0X06.MinTempProbeBatteryValue); + Assert.Equal(0x07, jTNE_0X02_0X06.MinVoltageBatteryAssemblyNo); + Assert.Equal(0x09, jTNE_0X02_0X06.MinVoltageSingleBatteryNo); + Assert.Equal(0x08, jTNE_0X02_0X06.MinVoltageSingleBatteryValue); + + JTNE_0x02_0x07 jTNE_0X02_0X07 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x07] as JTNE_0x02_0x07; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x07, jTNE_0X02_0X07.TypeCode); + Assert.Equal(0x11, jTNE_0X02_0X07.AlarmLevel); + Assert.Equal(3, jTNE_0X02_0X07.AlarmBatteryOthers.Count); + Assert.Equal(new List + { + 1000,1001,1002 + }, jTNE_0X02_0X07.AlarmBatteryOthers); + Assert.Equal(3, jTNE_0X02_0X07.AlarmEls.Count); + Assert.Equal(new List + { + 2000,2001,2002 + }, jTNE_0X02_0X07.AlarmEls); + Assert.Equal(3, jTNE_0X02_0X07.AlarmEngines.Count); + Assert.Equal(new List + { + 3000,3001,3002 + }, jTNE_0X02_0X07.AlarmEngines); + Assert.Equal(3, jTNE_0X02_0X07.AlarmOthers.Count); + Assert.Equal(new List + { + 4000,4001,4002 + }, jTNE_0X02_0X07.AlarmOthers); + + JTNE_0x02_0x08 jTNE_0X02_0X08 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x08] as JTNE_0x02_0x08; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x08, jTNE_0X02_0X08.TypeCode); + Assert.Equal(2, jTNE_0X02_0X08.BatteryAssemblyCount); + + Metadata.BatteryAssembly batteryAssembly1 = jTNE_0X02_0X08.BatteryAssemblies[0]; + Assert.Equal(123, batteryAssembly1.BatteryAssemblyCurrent); + Assert.Equal(0x01, batteryAssembly1.BatteryAssemblyNo); + Assert.Equal(0x02, batteryAssembly1.BatteryAssemblyVoltage); + Assert.Equal(55, batteryAssembly1.SingleBatteryCount); + Assert.Equal(111, batteryAssembly1.ThisSingleBatteryBeginNo); + Assert.Equal(3, batteryAssembly1.ThisSingleBatteryBeginCount); + Assert.Equal(new List { + 111,222,333 + }, batteryAssembly1.SingleBatteryVoltages); + + Metadata.BatteryAssembly batteryAssembly2 = jTNE_0X02_0X08.BatteryAssemblies[1]; + Assert.Equal(1234, batteryAssembly2.BatteryAssemblyCurrent); + Assert.Equal(0x03, batteryAssembly2.BatteryAssemblyNo); + Assert.Equal(0x05, batteryAssembly2.BatteryAssemblyVoltage); + Assert.Equal(66, batteryAssembly2.SingleBatteryCount); + Assert.Equal(222, batteryAssembly2.ThisSingleBatteryBeginNo); + Assert.Equal(3, batteryAssembly2.ThisSingleBatteryBeginCount); + Assert.Equal(new List { + 444,555,666 + }, batteryAssembly2.SingleBatteryVoltages); + + JTNE_0x02_0x09 jTNE_0X02_0X09 = jTNE_0X02.Values[JTNE_0x02_Body.JTNE_0x02_0x09] as JTNE_0x02_0x09; + Assert.Equal(JTNE_0x02_Body.JTNE_0x02_0x09, jTNE_0X02_0X09.TypeCode); + Assert.Equal(2, jTNE_0X02_0X09.BatteryTemperatureCount); + + Metadata.BatteryTemperature batteryTemperature1 = jTNE_0X02_0X09.BatteryTemperatures[0]; + Assert.Equal(0x01, batteryTemperature1.BatteryAssemblyNo); + Assert.Equal(4, batteryTemperature1.TemperatureProbeCount); + Assert.Equal(new byte[] + { + 0x01,0x02,0x03,0x04 + }, batteryTemperature1.Temperatures); + + Metadata.BatteryTemperature batteryTemperature2 = jTNE_0X02_0X09.BatteryTemperatures[1]; + Assert.Equal(0x02, batteryTemperature2.BatteryAssemblyNo); + Assert.Equal(4, batteryTemperature2.TemperatureProbeCount); + Assert.Equal(new byte[] + { + 0x05,0x06,0x07,0x08 + }, batteryTemperature2.Temperatures); + } + } +} diff --git a/src/JTNE.Protocol/Enums/JTNEMsgId.cs b/src/JTNE.Protocol/Enums/JTNEMsgId.cs index ce439c5..a242f88 100644 --- a/src/JTNE.Protocol/Enums/JTNEMsgId.cs +++ b/src/JTNE.Protocol/Enums/JTNEMsgId.cs @@ -19,6 +19,7 @@ namespace JTNE.Protocol.Enums /// /// 实时信息上传 /// + [JTNEBodiesType(typeof(JTNE_0x02))] uploadim = 0x02, /// /// 补传信息上传 diff --git a/src/JTNE.Protocol/JTNE.Protocol.csproj b/src/JTNE.Protocol/JTNE.Protocol.csproj index 5086dd5..30dcbfb 100644 --- a/src/JTNE.Protocol/JTNE.Protocol.csproj +++ b/src/JTNE.Protocol/JTNE.Protocol.csproj @@ -5,8 +5,8 @@ latest Copyright 2018. SmallChi - JTNE.Protocol - JTNE.Protocol + JTNewEnergy + JTNewEnergy JTNE协议、JTNewEnergy协议、GBNewEnergy协议、新能源协议、电动汽车远程服务与管理系统平台数据交换 JTNE协议、JTNewEnergy协议、GBNewEnergy协议、新能源协议、电动汽车远程服务与管理系统平台数据交换 false diff --git a/src/JTNewEnergy.sln b/src/JTNewEnergy.sln index 1808432..3ce629a 100644 --- a/src/JTNewEnergy.sln +++ b/src/JTNewEnergy.sln @@ -7,7 +7,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JTNE.Protocol", "JTNE.Proto EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JTNE.Protocol.Test", "JTNE.Protocol.Test\JTNE.Protocol.Test.csproj", "{30BB532E-4E49-4BB4-A1D4-61DC40F320DB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GBNewEnergy.Protocol", "GBNewEnergy.Protocol\GBNewEnergy.Protocol.csproj", "{5F7A89EB-2417-420A-839D-A878A648BAE1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTNE.Protocol.Benchmark", "JTNE.Protocol.Benchmark\JTNE.Protocol.Benchmark.csproj", "{CC6DFCDE-4A75-4643-9416-D459EE9CC88C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -23,10 +23,10 @@ Global {30BB532E-4E49-4BB4-A1D4-61DC40F320DB}.Debug|Any CPU.Build.0 = Debug|Any CPU {30BB532E-4E49-4BB4-A1D4-61DC40F320DB}.Release|Any CPU.ActiveCfg = Release|Any CPU {30BB532E-4E49-4BB4-A1D4-61DC40F320DB}.Release|Any CPU.Build.0 = Release|Any CPU - {5F7A89EB-2417-420A-839D-A878A648BAE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F7A89EB-2417-420A-839D-A878A648BAE1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F7A89EB-2417-420A-839D-A878A648BAE1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F7A89EB-2417-420A-839D-A878A648BAE1}.Release|Any CPU.Build.0 = Release|Any CPU + {CC6DFCDE-4A75-4643-9416-D459EE9CC88C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC6DFCDE-4A75-4643-9416-D459EE9CC88C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC6DFCDE-4A75-4643-9416-D459EE9CC88C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC6DFCDE-4A75-4643-9416-D459EE9CC88C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE