From 2e9a9fd19427327502365d96dad920bdf062f014 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Sun, 5 Apr 2020 20:41:15 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=AE=8C=E5=96=84=E6=B6=88=E6=81=AF=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E5=8F=8A=E6=B5=8B=E8=AF=95=202.=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 +- .../JT1078DependencyInjectionExtensions.cs | 6 +- .../JT1078/JT808_JT1078_0x1700.cs | 66 ++- .../JT1078/JT808_JT1078_0x1700_0x1701.cs | 22 +- .../JT808_JT1078_0x1700_0x1701_Formatter.cs | 24 -- .../JT1078/JT808_JT1078_0x1700_Formatter.cs | 50 --- .../JT809SubPackageExtensionsTest.cs | 4 +- .../Extensions/JT809ConfigExtensions.cs | 3 - .../JT809PackageExtensionsTemplate.cs | 60 +-- .../JT809SubPackageExtensionsTemplate.cs | 180 ++++----- .../Formatters/JT809BodiesFormatter.cs | 74 ---- .../Interfaces/IJT809BusinessTypeFactory.cs | 15 +- .../IJT809SubBusinessTypeFactory.cs | 15 +- .../Internal/JT809BusinessTypeFactory.cs | 121 ++---- .../Internal/JT809FormatterFactory.cs | 4 + .../Internal/JT809SubBusinessTypeFactory.cs | 92 ++--- src/JT809.Protocol/JT809.Protocol.csproj | 4 + src/JT809.Protocol/JT809.Protocol.xml | 376 ++++++++++-------- src/JT809.Protocol/JT809HeaderPackage.cs | 5 +- src/JT809.Protocol/JT809Package.cs | 35 +- src/JT809.Protocol/JT809Serializer.cs | 27 +- .../MessageBody/JT809_0x1200.cs | 61 ++- .../MessageBody/JT809_0x1300.cs | 44 +- .../MessageBody/JT809_0x1400.cs | 61 ++- .../MessageBody/JT809_0x1500.cs | 60 ++- .../MessageBody/JT809_0x1600.cs | 61 ++- .../MessageBody/JT809_0x9200.cs | 61 ++- .../MessageBody/JT809_0x9300.cs | 44 +- .../MessageBody/JT809_0x9400.cs | 60 ++- .../MessageBody/JT809_0x9500.cs | 60 ++- .../MessageBody/JT809_0x9600.cs | 61 ++- .../SubMessageBody/JT809_0x1200_0x1203.cs | 8 +- .../SubMessageBody/JT809_0x9200_0x9203.cs | 8 +- .../SubMessageBody/JT809_0x9400_0x9401.cs | 2 +- 34 files changed, 1078 insertions(+), 722 deletions(-) delete mode 100644 src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_0x1701_Formatter.cs delete mode 100644 src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_Formatter.cs delete mode 100644 src/JT809.Protocol/Formatters/JT809BodiesFormatter.cs diff --git a/README.md b/README.md index b98fcf0..38863d9 100644 --- a/README.md +++ b/README.md @@ -198,8 +198,8 @@ JT809Package jT809Package = JT809BusinessType.从链路报警信息交互消息. { VehicleNo = "粤A12345", VehicleColor = JT809VehicleColorType.黄色, - SubBusinessType = JT809SubBusinessType.报警督办请求.ToUInt16Value(), - SubBodies = JT809SubBusinessType.报警督办请求.Create_报警督办请求( + SubBusinessType = JT809SubBusinessType.报警督办请求消息.ToUInt16Value(), + SubBodies = JT809SubBusinessType.报警督办请求消息.Create_报警督办请求消息( new JT809_0x9400_0x9401 { WarnSrc = JT809WarnSrc.车载终端, @@ -250,21 +250,21 @@ static void Main(string[] args) BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18363 Intel Core i7-8700K CPU 3.70GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores -.NET Core SDK=3.1.100 - [Host] : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT - Job-RQJOPV : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT +.NET Core SDK=3.1.201 + [Host] : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT + Job-BAIJRX : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT Platform=AnyCpu Server=False Toolchain=.NET Core 3.1 ``` -| Method | N | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | -|---------------------------------------- |------- |-------------:|-------------:|------------:|-----------:|------:|------:|-------------:| -| **JT809_0x9400_0x9401_Package_Deserialize** | **100** | **629.9 us** | **11.09 us** | **9.83 us** | **15.6250** | **-** | **-** | **100.79 KB** | -| JT809_0x9400_0x9401_Package_Serialize | 100 | 501.0 us | 8.63 us | 8.07 us | 13.1836 | - | - | 83.59 KB | -| **JT809_0x9400_0x9401_Package_Deserialize** | **10000** | **63,018.0 us** | **954.14 us** | **845.82 us** | **1625.0000** | **-** | **-** | **10078.74 KB** | -| JT809_0x9400_0x9401_Package_Serialize | 10000 | 48,890.0 us | 1,107.12 us | 1,136.93 us | 1363.6364 | - | - | 8359.38 KB | -| **JT809_0x9400_0x9401_Package_Deserialize** | **100000** | **623,675.9 us** | **10,185.67 us** | **9,527.68 us** | **16000.0000** | **-** | **-** | **100787.23 KB** | -| JT809_0x9400_0x9401_Package_Serialize | 100000 | 486,690.2 us | 6,158.00 us | 5,458.90 us | 13000.0000 | - | - | 83595.03 KB | +| Method | N | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | +|---------------------------------------- |------- |-------------:|------------:|------------:|-----------:|------:|------:|-------------:| +| **JT809_0x9400_0x9401_Package_Deserialize** | **100** | **509.5 us** | **2.50 us** | **2.22 us** | **15.6250** | **-** | **-** | **100.78 KB** | +| JT809_0x9400_0x9401_Package_Serialize | 100 | 203.6 us | 1.95 us | 1.82 us | 13.4277 | - | - | 83.59 KB | +| **JT809_0x9400_0x9401_Package_Deserialize** | **10000** | **48,343.9 us** | **580.83 us** | **543.31 us** | **1636.3636** | **-** | **-** | **10078.13 KB** | +| JT809_0x9400_0x9401_Package_Serialize | 10000 | 20,705.0 us | 165.58 us | 154.88 us | 1343.7500 | - | - | 8359.38 KB | +| **JT809_0x9400_0x9401_Package_Deserialize** | **100000** | **476,503.3 us** | **4,965.19 us** | **4,401.51 us** | **16000.0000** | **-** | **-** | **100781.25 KB** | +| JT809_0x9400_0x9401_Package_Serialize | 100000 | 207,481.3 us | 1,467.56 us | 1,372.76 us | 13333.3333 | - | - | 83594.04 KB | ## JT809协议消息对照表 diff --git a/src/JT809.Protocol.Test/JT1078/JT1078DependencyInjectionExtensions.cs b/src/JT809.Protocol.Test/JT1078/JT1078DependencyInjectionExtensions.cs index d66e3d2..9526459 100644 --- a/src/JT809.Protocol.Test/JT1078/JT1078DependencyInjectionExtensions.cs +++ b/src/JT809.Protocol.Test/JT1078/JT1078DependencyInjectionExtensions.cs @@ -10,9 +10,9 @@ namespace JT809.Protocol.Test.JT1078 public static IJT809Builder AddJT1078Configure(this IJT809Builder builder) { builder.Config.Register(Assembly.GetExecutingAssembly()); - builder.Config.BusinessTypeFactory.SetMap(0x1700); - #warning 不知道是不是jt1078协议的809结构有问题,先按交换的格式(少了数据交换的头部) - builder.Config.SubBusinessTypeFactory.SetMap(0x1701); + builder.Config.BusinessTypeFactory.SetMap(); + //#warning 不知道是不是jt1078协议的809结构有问题,先按交换的格式(少了数据交换的头部) + builder.Config.SubBusinessTypeFactory.SetMap(); return builder; } } diff --git a/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700.cs b/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700.cs index e3b0398..4f894f5 100644 --- a/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700.cs +++ b/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700.cs @@ -1,16 +1,74 @@ using JT809.Protocol.Enums; +using JT809.Protocol.Exceptions; +using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; using System; using System.Collections.Generic; using System.Text; namespace JT809.Protocol.Test.JT1078 { - public class JT808_JT1078_0x1700 : JT809ExchangeMessageBodies + public class JT808_JT1078_0x1700 : JT809ExchangeMessageBodies,IJT809MessagePackFormatter { - public override ushort MsgId => throw new NotImplementedException(); + public override ushort MsgId => 0x1700; - public override JT809_LinkType LinkType => throw new NotImplementedException(); + public override JT809_LinkType LinkType => JT809_LinkType.main; - public override string Description => throw new NotImplementedException(); + public override string Description => "0x1700"; + + public JT808_JT1078_0x1700 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT808_JT1078_0x1700 jT808_JT1078_0X1700 = new JT808_JT1078_0x1700(); + jT808_JT1078_0X1700.VehicleNo = reader.ReadString(21); + jT808_JT1078_0X1700.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + jT808_JT1078_0X1700.SubBusinessType = reader.ReadUInt16(); + jT808_JT1078_0X1700.DataLength = reader.ReadUInt32(); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(jT808_JT1078_0X1700.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + jT808_JT1078_0X1700.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{jT808_JT1078_0X1700.SubBusinessType.ToString()}"); + } + return jT808_JT1078_0X1700; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT808_JT1078_0x1700 value, IJT809Config config) + { + try + { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); + writer.WriteUInt16(value.SubBusinessType); + // 先写入内容,然后在根据内容反写内容长度 + writer.Skip(4, out int subContentLengthPosition); + if (value.SubBodies != null) + { + + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } + writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType}"); + } + } } } diff --git a/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_0x1701.cs b/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_0x1701.cs index 76bfa81..cecad61 100644 --- a/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_0x1701.cs +++ b/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_0x1701.cs @@ -1,10 +1,12 @@ -using System; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT809.Protocol.Test.JT1078 { - public class JT808_JT1078_0x1700_0x1701 : JT809SubBodies + public class JT808_JT1078_0x1700_0x1701 : JT809SubBodies, IJT809MessagePackFormatter { /// /// 企业视频监控平台唯一编码,平台所属企业行政区域代码+平台公共编号 @@ -22,5 +24,21 @@ namespace JT809.Protocol.Test.JT1078 public override ushort SubMsgId => 0x1701; public override string Description => "测试"; + + public JT808_JT1078_0x1700_0x1701 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT808_JT1078_0x1700_0x1701 jT808_JT1078_0X1701 = new JT808_JT1078_0x1700_0x1701(); + jT808_JT1078_0X1701.PlateFormId = reader.ReadArray(11).ToArray(); + jT808_JT1078_0X1701.AuthorizeCode1 = reader.ReadArray(64).ToArray(); + jT808_JT1078_0X1701.AuthorizeCode2 = reader.ReadArray(64).ToArray(); + return jT808_JT1078_0X1701; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT808_JT1078_0x1700_0x1701 value, IJT809Config config) + { + writer.WriteArray(value.PlateFormId); + writer.WriteArray(value.AuthorizeCode1); + writer.WriteArray(value.AuthorizeCode2); + } } } diff --git a/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_0x1701_Formatter.cs b/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_0x1701_Formatter.cs deleted file mode 100644 index a14f478..0000000 --- a/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_0x1701_Formatter.cs +++ /dev/null @@ -1,24 +0,0 @@ -using JT809.Protocol.Formatters; -using JT809.Protocol.MessagePack; - -namespace JT809.Protocol.Test.JT1078 -{ - public class JT808_JT1078_0x1700_0x1701_Formatter : IJT809MessagePackFormatter - { - public JT808_JT1078_0x1700_0x1701 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) - { - JT808_JT1078_0x1700_0x1701 jT808_JT1078_0X1701 = new JT808_JT1078_0x1700_0x1701(); - jT808_JT1078_0X1701.PlateFormId = reader.ReadArray(11).ToArray(); - jT808_JT1078_0X1701.AuthorizeCode1 = reader.ReadArray(64).ToArray(); - jT808_JT1078_0X1701.AuthorizeCode2 = reader.ReadArray(64).ToArray(); - return jT808_JT1078_0X1701; - } - - public void Serialize(ref JT809MessagePackWriter writer, JT808_JT1078_0x1700_0x1701 value, IJT809Config config) - { - writer.WriteArray(value.PlateFormId); - writer.WriteArray(value.AuthorizeCode1); - writer.WriteArray(value.AuthorizeCode2); - } - } -} \ No newline at end of file diff --git a/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_Formatter.cs b/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_Formatter.cs deleted file mode 100644 index 0f40227..0000000 --- a/src/JT809.Protocol.Test/JT1078/JT808_JT1078_0x1700_Formatter.cs +++ /dev/null @@ -1,50 +0,0 @@ -using JT809.Protocol.Enums; -using JT809.Protocol.Exceptions; -using JT809.Protocol.Extensions; -using JT809.Protocol.Formatters; -using JT809.Protocol.MessagePack; -using System; - -namespace JT809.Protocol.Test.JT1078 -{ - public class JT808_JT1078_0x1700_Formatter : IJT809MessagePackFormatter - { - public JT808_JT1078_0x1700 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) - { - JT808_JT1078_0x1700 jT808_JT1078_0X1700 = new JT808_JT1078_0x1700(); - jT808_JT1078_0X1700.SubBusinessType = reader.ReadUInt16(); - try - { - Type jT809SubBodiesImplType = config.SubBusinessTypeFactory.GetSubBodiesImplTypeBySubBusinessType(jT808_JT1078_0X1700.SubBusinessType); - if (jT809SubBodiesImplType != null) - jT808_JT1078_0X1700.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( - config.GetMessagePackFormatterByType(jT809SubBodiesImplType), - ref reader, config); - } - catch - { - throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{jT808_JT1078_0X1700.SubBusinessType.ToString()}"); - } - return jT808_JT1078_0X1700; - } - - public void Serialize(ref JT809MessagePackWriter writer, JT808_JT1078_0x1700 value, IJT809Config config) - { - try - { - writer.WriteUInt16(value.SubBusinessType); - if (value.SubBodies != null) - { - JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( - config.GetMessagePackFormatterByType(value.SubBodies.GetType()), - ref writer, value.SubBodies, - config); - } - } - catch - { - throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); - } - } - } -} \ No newline at end of file diff --git a/src/JT809.Protocol.Test/JT809Extensions/JT809SubPackageExtensionsTest.cs b/src/JT809.Protocol.Test/JT809Extensions/JT809SubPackageExtensionsTest.cs index dbce4f5..855b319 100644 --- a/src/JT809.Protocol.Test/JT809Extensions/JT809SubPackageExtensionsTest.cs +++ b/src/JT809.Protocol.Test/JT809Extensions/JT809SubPackageExtensionsTest.cs @@ -69,7 +69,7 @@ namespace JT809.Protocol.Test.JT809Extensions VehicleNo = "粤A12345", VehicleColor = JT809VehicleColorType.黄色, SubBusinessType = JT809SubBusinessType.报警督办请求消息.ToUInt16Value(), - SubBodies = JT809SubBusinessType.报警督办请求消息.Create_报警督办请求( + SubBodies = JT809SubBusinessType.报警督办请求消息.Create_报警督办请求消息( new JT809_0x9400_0x9401 { WarnSrc = JT809WarnSrc.车载终端, @@ -85,6 +85,8 @@ namespace JT809.Protocol.Test.JT809Extensions } ); var hex = JT809Serializer.Serialize(jT809Package).ToHexString(); + //5B0000007C0000068294000133EFB8010000000000270F94010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000A6565D + //5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D Assert.Equal("5B000000920000068294000133EFB8010000000000270FD4C1413132333435000000000000000000000000000294010000005C010002000000005A01AC3F40123FFAA1000000005A01AC4D5003736D616C6C636869000000000000000031323334353637383930310000000000000000003132333435364071712E636F6D00000000000000000000000000000000000000BAD85D", hex); } } diff --git a/src/JT809.Protocol/Extensions/JT809ConfigExtensions.cs b/src/JT809.Protocol/Extensions/JT809ConfigExtensions.cs index a73fc7e..d28c93f 100644 --- a/src/JT809.Protocol/Extensions/JT809ConfigExtensions.cs +++ b/src/JT809.Protocol/Extensions/JT809ConfigExtensions.cs @@ -1,11 +1,8 @@ using JT809.Protocol.Enums; using JT809.Protocol.Exceptions; using JT809.Protocol.Formatters; -using JT809.Protocol.Interfaces; using System; using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Text; namespace JT809.Protocol { diff --git a/src/JT809.Protocol/Extensions/JT809PackageExtensionsTemplate.cs b/src/JT809.Protocol/Extensions/JT809PackageExtensionsTemplate.cs index 3a37f1c..85e8819 100644 --- a/src/JT809.Protocol/Extensions/JT809PackageExtensionsTemplate.cs +++ b/src/JT809.Protocol/Extensions/JT809PackageExtensionsTemplate.cs @@ -188,16 +188,16 @@ namespace JT809.Protocol.Extensions return Create(jT809BusinessType,jT809Header,bodies); } /// - /// UP_CLOSELINK_INFORM - 下级平台主动关闭链路通知消息 + /// UP_CLOSELINK_INFORM - 下级平台主动关闭主从链路通知消息 /// auto-generated /// - public static JT809Package Create_下级平台主动关闭链路通知消息(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x1008 bodies) + public static JT809Package Create_下级平台主动关闭主从链路通知消息(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x1008 bodies) { return Create(jT809BusinessType,bodies); } /// - /// UP_CLOSELINK_INFORM - 下级平台主动关闭链路通知消息 + /// UP_CLOSELINK_INFORM - 下级平台主动关闭主从链路通知消息 /// auto-generated /// public static JT809Package Create(this JT809BusinessType jT809BusinessType, JT809.Protocol.MessageBody.JT809_0x1008 bodies) @@ -206,24 +206,24 @@ namespace JT809.Protocol.Extensions } /// - /// UP_CLOSELINK_INFORM - 下级平台主动关闭链路通知消息 + /// UP_CLOSELINK_INFORM - 下级平台主动关闭主从链路通知消息 /// auto-generated /// - public static JT809Package Create_下级平台主动关闭链路通知消息(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x1008 bodies) + public static JT809Package Create_下级平台主动关闭主从链路通知消息(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x1008 bodies) { return Create(jT809BusinessType,jT809Header,bodies); } /// - /// UP_EXG_MSG - 主链路动态信息交换消息 + /// UP_EXG_MSG - 主链路车辆动态信息交换业务 /// auto-generated /// - public static JT809Package Create_主链路动态信息交换消息(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x1200 bodies) + public static JT809Package Create_主链路车辆动态信息交换业务(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x1200 bodies) { return Create(jT809BusinessType,bodies); } /// - /// UP_EXG_MSG - 主链路动态信息交换消息 + /// UP_EXG_MSG - 主链路车辆动态信息交换业务 /// auto-generated /// public static JT809Package Create(this JT809BusinessType jT809BusinessType, JT809.Protocol.MessageBody.JT809_0x1200 bodies) @@ -232,10 +232,10 @@ namespace JT809.Protocol.Extensions } /// - /// UP_EXG_MSG - 主链路动态信息交换消息 + /// UP_EXG_MSG - 主链路车辆动态信息交换业务 /// auto-generated /// - public static JT809Package Create_主链路动态信息交换消息(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x1200 bodies) + public static JT809Package Create_主链路车辆动态信息交换业务(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x1200 bodies) { return Create(jT809BusinessType,jT809Header,bodies); } @@ -370,16 +370,16 @@ namespace JT809.Protocol.Extensions return Create(jT809BusinessType,jT809Header,bodies); } /// - /// DOWN_CONNECT_RSP - 从链路连接应答消息 + /// DOWN_CONNECT_RSP - 从链路连接应答信息 /// auto-generated /// - public static JT809Package Create_从链路连接应答消息(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x9002 bodies) + public static JT809Package Create_从链路连接应答信息(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x9002 bodies) { return Create(jT809BusinessType,bodies); } /// - /// DOWN_CONNECT_RSP - 从链路连接应答消息 + /// DOWN_CONNECT_RSP - 从链路连接应答信息 /// auto-generated /// public static JT809Package Create(this JT809BusinessType jT809BusinessType, JT809.Protocol.MessageBody.JT809_0x9002 bodies) @@ -388,10 +388,10 @@ namespace JT809.Protocol.Extensions } /// - /// DOWN_CONNECT_RSP - 从链路连接应答消息 + /// DOWN_CONNECT_RSP - 从链路连接应答信息 /// auto-generated /// - public static JT809Package Create_从链路连接应答消息(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x9002 bodies) + public static JT809Package Create_从链路连接应答信息(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x9002 bodies) { return Create(jT809BusinessType,jT809Header,bodies); } @@ -552,16 +552,16 @@ namespace JT809.Protocol.Extensions return Create(jT809BusinessType,jT809Header,bodies); } /// - /// DOWN_TOTAL_RECV_BACK_MSG - 接收定位信息数量通知消息 + /// DOWN_TOTAL_RECV_BACK_MSG - 接收车辆定位信息数量通知消息 /// auto-generated /// - public static JT809Package Create_接收定位信息数量通知消息(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x9101 bodies) + public static JT809Package Create_接收车辆定位信息数量通知消息(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x9101 bodies) { return Create(jT809BusinessType,bodies); } /// - /// DOWN_TOTAL_RECV_BACK_MSG - 接收定位信息数量通知消息 + /// DOWN_TOTAL_RECV_BACK_MSG - 接收车辆定位信息数量通知消息 /// auto-generated /// public static JT809Package Create(this JT809BusinessType jT809BusinessType, JT809.Protocol.MessageBody.JT809_0x9101 bodies) @@ -570,24 +570,24 @@ namespace JT809.Protocol.Extensions } /// - /// DOWN_TOTAL_RECV_BACK_MSG - 接收定位信息数量通知消息 + /// DOWN_TOTAL_RECV_BACK_MSG - 接收车辆定位信息数量通知消息 /// auto-generated /// - public static JT809Package Create_接收定位信息数量通知消息(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x9101 bodies) + public static JT809Package Create_接收车辆定位信息数量通知消息(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x9101 bodies) { return Create(jT809BusinessType,jT809Header,bodies); } /// - /// DOWN_EXG_MSG - 从链路动态信息交换消息 + /// DOWN_EXG_MSG - 从链路车辆动态信息交换业务 /// auto-generated /// - public static JT809Package Create_从链路动态信息交换消息(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x9200 bodies) + public static JT809Package Create_从链路车辆动态信息交换业务(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x9200 bodies) { return Create(jT809BusinessType,bodies); } /// - /// DOWN_EXG_MSG - 从链路动态信息交换消息 + /// DOWN_EXG_MSG - 从链路车辆动态信息交换业务 /// auto-generated /// public static JT809Package Create(this JT809BusinessType jT809BusinessType, JT809.Protocol.MessageBody.JT809_0x9200 bodies) @@ -596,24 +596,24 @@ namespace JT809.Protocol.Extensions } /// - /// DOWN_EXG_MSG - 从链路动态信息交换消息 + /// DOWN_EXG_MSG - 从链路车辆动态信息交换业务 /// auto-generated /// - public static JT809Package Create_从链路动态信息交换消息(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x9200 bodies) + public static JT809Package Create_从链路车辆动态信息交换业务(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x9200 bodies) { return Create(jT809BusinessType,jT809Header,bodies); } /// - /// DOWN_PLATFORM_MSG - 从链路平台间信息交互消息 + /// DOWN_PLATFORM_MSG - 从链路平台间信息交互业务 /// auto-generated /// - public static JT809Package Create_从链路平台间信息交互消息(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x9300 bodies) + public static JT809Package Create_从链路平台间信息交互业务(this JT809BusinessType jT809BusinessType,JT809.Protocol.MessageBody.JT809_0x9300 bodies) { return Create(jT809BusinessType,bodies); } /// - /// DOWN_PLATFORM_MSG - 从链路平台间信息交互消息 + /// DOWN_PLATFORM_MSG - 从链路平台间信息交互业务 /// auto-generated /// public static JT809Package Create(this JT809BusinessType jT809BusinessType, JT809.Protocol.MessageBody.JT809_0x9300 bodies) @@ -622,10 +622,10 @@ namespace JT809.Protocol.Extensions } /// - /// DOWN_PLATFORM_MSG - 从链路平台间信息交互消息 + /// DOWN_PLATFORM_MSG - 从链路平台间信息交互业务 /// auto-generated /// - public static JT809Package Create_从链路平台间信息交互消息(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x9300 bodies) + public static JT809Package Create_从链路平台间信息交互业务(this JT809BusinessType jT809BusinessType,JT809Header jT809Header, JT809.Protocol.MessageBody.JT809_0x9300 bodies) { return Create(jT809BusinessType,jT809Header,bodies); } diff --git a/src/JT809.Protocol/Extensions/JT809SubPackageExtensionsTemplate.cs b/src/JT809.Protocol/Extensions/JT809SubPackageExtensionsTemplate.cs index 67c9184..5e68c66 100644 --- a/src/JT809.Protocol/Extensions/JT809SubPackageExtensionsTemplate.cs +++ b/src/JT809.Protocol/Extensions/JT809SubPackageExtensionsTemplate.cs @@ -11,7 +11,7 @@ namespace JT809.Protocol.Extensions { /// - /// 主链路动态信息交换消息 + /// 4608 /// UP_EXG_MSG_REGISTER - 上传车辆注册信息 /// auto-generated /// @@ -20,7 +20,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 + /// 4608 /// UP_EXG_MSG_REAL_LOCATION - 实时上传车辆定位信息 /// auto-generated /// @@ -29,43 +29,43 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 - /// UP_EXG_MSG_HISTORY_LOCATION - 车辆定位信息自动补报 + /// 4608 + /// UP_EXG_MSG_HISTORY_LOCATION - 车辆定位信息自动补报请求消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x1203 Create_车辆定位信息自动补报(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x1203 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x1203 Create_车辆定位信息自动补报请求消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x1203 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 - /// UP_EXG_MSG_RETURN_STARTUP_ACK - 启动车辆定位信息交换应答 + /// 4608 + /// UP_EXG_MSG_RETURN_STARTUP_ACK - 启动车辆定位信息交换应答消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x1205 Create_启动车辆定位信息交换应答(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x1205 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x1205 Create_启动车辆定位信息交换应答消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x1205 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 - /// UP_EXG_MSG_RETURN_END_ACK - 结束车辆定位信息交换应答 + /// 4608 + /// UP_EXG_MSG_RETURN_END_ACK - 结束车辆定位信息交换应答消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x1206 Create_结束车辆定位信息交换应答(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x1206 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x1206 Create_结束车辆定位信息交换应答消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x1206 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 - /// UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP - 申请交换指定车辆定位信息请求 + /// 4608 + /// UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP - 申请交换指定车辆定位信息请求消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x1207 Create_申请交换指定车辆定位信息请求(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x1207 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x1207 Create_申请交换指定车辆定位信息请求消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x1207 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 + /// 4608 /// UP_EXG_MSG_APPLY_FOR_MONITOR_END - 取消交换指定车辆定位信息请求 /// auto-generated /// @@ -74,7 +74,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 + /// 4608 /// UP_EXG_MSG_APPLY_HISGNSSDATA_REQ - 补发车辆定位信息请求 /// auto-generated /// @@ -83,34 +83,34 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 - /// UP_EXG_MSG_REPORT_DRIVER_INFO_ACK - 上报车辆驾驶员身份识别信息应答 + /// 4608 + /// UP_EXG_MSG_REPORT_DRIVER_INFO_ACK - 上报驾驶员身份识别信息应答消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x120A Create_上报车辆驾驶员身份识别信息应答(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x120A subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x120A Create_上报驾驶员身份识别信息应答消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x120A subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 - /// UP_EXG_MSG_TAKE_EWAYBILL_ACK - 上报车辆电子运单应答 + /// 4608 + /// UP_EXG_MSG_TAKE_EWAYBILL_ACK - 上报车辆电子运单应答消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x120B Create_上报车辆电子运单应答(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x120B subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x120B Create_上报车辆电子运单应答消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x120B subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 - /// UP_EXG_MSG_REPORT_DRIVER_INFO - 主动上报驾驶员身份信息 + /// 4608 + /// UP_EXG_MSG_REPORT_DRIVER_INFO - 主动上报驾驶员身份信息消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x120C Create_主动上报驾驶员身份信息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x120C subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1200_0x120C Create_主动上报驾驶员身份信息消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1200_0x120C subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路动态信息交换消息 + /// 4608 /// UP_EXG_MSG_REPORT_EWAYBILL_INFO - 主动上报车辆电子运单信息 /// auto-generated /// @@ -119,43 +119,43 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路平台间信息交互消息 - /// UP_PLATFORM_MSG_POST_QUERY_ACK - 平台查岗应答 + /// 4864 + /// UP_PLATFORM_MSG_POST_QUERY_ACK - 平台查岗应答消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1300_0x1301 Create_平台查岗应答(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1300_0x1301 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1300_0x1301 Create_平台查岗应答消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1300_0x1301 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路平台间信息交互消息 - /// UP_PLATFORM_MSG_INFO_ACK - 下发平台间报文应答 + /// 4864 + /// UP_PLATFORM_MSG_INFO_ACK - 下发平台间报文应答消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1300_0x1302 Create_下发平台间报文应答(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1300_0x1302 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1300_0x1302 Create_下发平台间报文应答消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1300_0x1302 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路报警信息交互消息 - /// UP_WARN_MSG_URGE_TODO_ACK - 报警督办应答 + /// 5120 + /// UP_WARN_MSG_URGE_TODO_ACK - 报警督办应答消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1400_0x1401 Create_报警督办应答(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1400_0x1401 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1400_0x1401 Create_报警督办应答消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1400_0x1401 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路报警信息交互消息 - /// UP_WARN_MSG_ADPT_INFO - 上报报警信息 + /// 5120 + /// UP_WARN_MSG_ADPT_INFO - 上报报警信息消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1400_0x1402 Create_上报报警信息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1400_0x1402 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1400_0x1402 Create_上报报警信息消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1400_0x1402 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路报警信息交互消息 + /// 5120 /// UP_WARN_MSG_ADPT_TODO_INFO - 主动上报报警处理结果信息 /// auto-generated /// @@ -164,7 +164,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路车辆监管消息 + /// 5376 /// UP_CTRL_MSG_MONITOR_VEHICLE_ACK - 车辆单向监听应答 /// auto-generated /// @@ -173,7 +173,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路车辆监管消息 + /// 5376 /// UP_CTRL_MSG_TAKE_PHOTO_ACK - 车辆拍照应答 /// auto-generated /// @@ -182,25 +182,25 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路车辆监管消息 - /// UP_CTRL_MSG_TEXT_INFO_ACK - 下发车辆报文应答 + /// 5376 + /// UP_CTRL_MSG_TEXT_INFO_ACK - 下发车辆报文应答消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1500_0x1503 Create_下发车辆报文应答(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1500_0x1503 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1500_0x1503 Create_下发车辆报文应答消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1500_0x1503 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路车辆监管消息 - /// UP_CTRL_MSG_TAKE_TRAVEL_ACK - 上报车辆行驶记录应答 + /// 5376 + /// UP_CTRL_MSG_TAKE_TRAVEL_ACK - 上报车辆行驶记录应答消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x1500_0x1504 Create_上报车辆行驶记录应答(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1500_0x1504 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x1500_0x1504 Create_上报车辆行驶记录应答消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x1500_0x1504 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路车辆监管消息 + /// 5376 /// UP_CTRL_MSG_EMERGENCY_MONITORING_ACK - 车辆应急接入监管平台应答消息 /// auto-generated /// @@ -209,7 +209,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 主链路静态信息交换消息 + /// 5632 /// UP_BASE_MSG_VEHICLE_ADDED_ACK - 补报车辆静态信息应答 /// auto-generated /// @@ -218,43 +218,43 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 - /// DOWN_EXG_MSG_CAR_LOCATION - 交换车辆定位信息 + /// 37376 + /// DOWN_EXG_MSG_CAR_LOCATION - 交换车辆定位信息消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x9202 Create_交换车辆定位信息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x9202 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x9202 Create_交换车辆定位信息消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x9202 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 - /// DOWN_EXG_MSG_HISTORY_ARCOSSAREA - 车辆定位信息交换补发 + /// 37376 + /// DOWN_EXG_MSG_HISTORY_ARCOSSAREA - 车辆定位信息交换补发消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x9203 Create_车辆定位信息交换补发(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x9203 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x9203 Create_车辆定位信息交换补发消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x9203 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 - /// DOWN_EXG_MSG_CAR_INFO - 交换车辆静态信息 + /// 37376 + /// DOWN_EXG_MSG_CAR_INFO - 交换车辆静态信息消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x9204 Create_交换车辆静态信息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x9204 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x9204 Create_交换车辆静态信息消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x9204 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 - /// DOWN_EXG_MSG_RETURN_STARTUP - 启动车辆定位信息交换请求 + /// 37376 + /// DOWN_EXG_MSG_RETURN_STARTUP - 启动车辆定位信息交换请求消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x9205 Create_启动车辆定位信息交换请求(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x9205 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x9205 Create_启动车辆定位信息交换请求消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x9205 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 + /// 37376 /// DOWN_EXG_MSG_RETURN_END - 结束车辆定位信息交换请求 /// auto-generated /// @@ -263,7 +263,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 + /// 37376 /// DOWN_EXG_MSG_APPLY_FOR_MONITOR_STARTUP_ACK - 申请交换指定车辆定位信息应答 /// auto-generated /// @@ -272,7 +272,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 + /// 37376 /// DOWN_EXG_MSG_APPLY_FOR_MONITOR_END_ACK - 取消交换指定车辆定位信息应答 /// auto-generated /// @@ -281,7 +281,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 + /// 37376 /// DOWN_EXG_MSG_APPLY_HISGNSSDATA_ACK - 补发车辆定位信息应答 /// auto-generated /// @@ -290,7 +290,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 + /// 37376 /// DOWN_EXG_MSG_REPORT_DRIVER_INFO - 上报车辆驾驶员身份识别信息请求 /// auto-generated /// @@ -299,16 +299,16 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路动态信息交换消息 - /// DOWN_EXG_MSG_TAKE_EWAYBILL_REQ - 上报车辆电子运单请求 + /// 37376 + /// DOWN_EXG_MSG_TAKE_EWAYBILL_REQ - 上报车辆电子运单请求消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x920B Create_上报车辆电子运单请求(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x920B subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9200_0x920B Create_上报车辆电子运单请求消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9200_0x920B subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路平台间信息交互消息 + /// 37632 /// DOWN_PLATFORM_MSG_POST_QUERY_REQ - 平台查岗请求 /// auto-generated /// @@ -317,7 +317,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路平台间信息交互消息 + /// 37632 /// DOWN_PLATFORM_MSG_INFO_REQ - 下发平台间报文请求 /// auto-generated /// @@ -326,16 +326,16 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路报警信息交互消息 - /// DOWN_WARN_MSG_URGE_TODO_REQ - 报警督办请求 + /// 37888 + /// DOWN_WARN_MSG_URGE_TODO_REQ - 报警督办请求消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9400_0x9401 Create_报警督办请求(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9400_0x9401 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9400_0x9401 Create_报警督办请求消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9400_0x9401 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路报警信息交互消息 + /// 37888 /// DOWN_WARN_MSG_INFORM_TIPS - 报警预警 /// auto-generated /// @@ -344,7 +344,7 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路报警信息交互消息 + /// 37888 /// DOWN_WARN_MSG_EXG_INFORM - 实时交换报警信息 /// auto-generated /// @@ -353,25 +353,25 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路车辆监管消息 - /// DOWN_CTRL_MSG_MONITOR_VEHICLE_REQ - 车辆单向监听请求 + /// 38144 + /// DOWN_CTRL_MSG_MONITOR_VEHICLE_REQ - 车辆单向监听请求消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9500_0x9501 Create_车辆单向监听请求(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9500_0x9501 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9500_0x9501 Create_车辆单向监听请求消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9500_0x9501 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路车辆监管消息 - /// DOWN_CTRL_MSG_TAKE_PHOTO_REQ - 车辆拍照请求 + /// 38144 + /// DOWN_CTRL_MSG_TAKE_PHOTO_REQ - 车辆拍照请求消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9500_0x9502 Create_车辆拍照请求(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9500_0x9502 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9500_0x9502 Create_车辆拍照请求消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9500_0x9502 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路车辆监管消息 + /// 38144 /// DOWN_CTRL_MSG_TEXT_INFO - 下发车辆报文请求 /// auto-generated /// @@ -380,16 +380,16 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路车辆监管消息 - /// DOWN_CTRL_MSG_TAKE_TRAVEL_REQ - 上报车辆行驶记录请求 + /// 38144 + /// DOWN_CTRL_MSG_TAKE_TRAVEL_REQ - 上报车辆行驶记录请求消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9500_0x9504 Create_上报车辆行驶记录请求(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9500_0x9504 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9500_0x9504 Create_上报车辆行驶记录请求消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9500_0x9504 subBodies) { return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路车辆监管消息 + /// 38144 /// DOWN_CTRL_MSG_EMERGENCY_MONITORING_REQ - 车辆应急接入监管平台请求消息 /// auto-generated /// @@ -398,11 +398,11 @@ namespace JT809.Protocol.Extensions return Create(jT809SubBusinessType,subBodies); } /// - /// 从链路静态信息交换消息 - /// DOWN_BASE_MSG_VEHICLE_ADDED - 补报车辆静态信息请求 + /// 38400 + /// DOWN_BASE_MSG_VEHICLE_ADDED - 补报车辆静态信息请求消息 /// auto-generated /// - public static JT809.Protocol.SubMessageBody.JT809_0x9600_0x9601 Create_补报车辆静态信息请求(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9600_0x9601 subBodies) + public static JT809.Protocol.SubMessageBody.JT809_0x9600_0x9601 Create_补报车辆静态信息请求消息(this JT809SubBusinessType jT809SubBusinessType,JT809.Protocol.SubMessageBody.JT809_0x9600_0x9601 subBodies) { return Create(jT809SubBusinessType,subBodies); } diff --git a/src/JT809.Protocol/Formatters/JT809BodiesFormatter.cs b/src/JT809.Protocol/Formatters/JT809BodiesFormatter.cs deleted file mode 100644 index 5319e92..0000000 --- a/src/JT809.Protocol/Formatters/JT809BodiesFormatter.cs +++ /dev/null @@ -1,74 +0,0 @@ -using JT809.Protocol.Attributes; -using JT809.Protocol.Enums; -using JT809.Protocol.Exceptions; -using JT809.Protocol.Extensions; -using System; -using System.Buffers; -using System.Collections.Generic; -using System.Text; -using JT809.Protocol.Internal; -using JT809.Protocol.Interfaces; -using JT809.Protocol.MessagePack; -using JT809.Protocol.MessageBody; - -namespace JT809.Protocol.Formatters -{ - public class JT809BodiesFormatter : IJT809MessagePackFormatter - where TJT809Bodies: JT809ExchangeMessageBodies, new () - { - public readonly static JT809BodiesFormatter Instance_0x1200 = new JT809BodiesFormatter(); - public readonly static JT809BodiesFormatter Instance_0x1400 = new JT809BodiesFormatter(); - public readonly static JT809BodiesFormatter Instance_0x1500 = new JT809BodiesFormatter(); - public readonly static JT809BodiesFormatter Instance_0x1600 = new JT809BodiesFormatter(); - public readonly static JT809BodiesFormatter Instance_0x9200 = new JT809BodiesFormatter(); - public readonly static JT809BodiesFormatter Instance_0x9400 = new JT809BodiesFormatter(); - public readonly static JT809BodiesFormatter Instance_0x9500 = new JT809BodiesFormatter(); - public readonly static JT809BodiesFormatter Instance_0x9600 = new JT809BodiesFormatter(); - - public TJT809Bodies Deserialize(ref JT809MessagePackReader reader, IJT809Config config) - { - TJT809Bodies jT809Bodies = new TJT809Bodies(); - jT809Bodies.VehicleNo = reader.ReadString(21); - jT809Bodies.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); - jT809Bodies.SubBusinessType = reader.ReadUInt16(); - jT809Bodies.DataLength = reader.ReadUInt32(); - try - { - Type jT809SubBodiesImplType = config.SubBusinessTypeFactory.GetSubBodiesImplTypeBySubBusinessType(jT809Bodies.SubBusinessType); - if (jT809SubBodiesImplType != null) - jT809Bodies.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( - config.GetMessagePackFormatterByType(jT809SubBodiesImplType), - ref reader, config); - } - catch - { - throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{jT809Bodies.SubBusinessType.ToString()}"); - } - return jT809Bodies; - } - - public void Serialize(ref JT809MessagePackWriter writer, TJT809Bodies value, IJT809Config config) - { - writer.WriteStringPadRight(value.VehicleNo, 21); - writer.WriteByte((byte)value.VehicleColor); - writer.WriteUInt16(value.SubBusinessType); - try - { - // 先写入内容,然后在根据内容反写内容长度 - writer.Skip(4, out int subContentLengthPosition); - if (value.SubBodies != null) - { - JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( - config.GetMessagePackFormatterByType(value.SubBodies.GetType()), - ref writer, value.SubBodies, - config); - } - writer.WriteInt32Return(writer.GetCurrentPosition()- subContentLengthPosition - 4, subContentLengthPosition); - } - catch - { - throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); - } - } - } -} diff --git a/src/JT809.Protocol/Interfaces/IJT809BusinessTypeFactory.cs b/src/JT809.Protocol/Interfaces/IJT809BusinessTypeFactory.cs index 8782b82..8725ed4 100644 --- a/src/JT809.Protocol/Interfaces/IJT809BusinessTypeFactory.cs +++ b/src/JT809.Protocol/Interfaces/IJT809BusinessTypeFactory.cs @@ -1,17 +1,12 @@ using System; +using System.Collections.Generic; namespace JT809.Protocol.Interfaces { - public interface IJT809BusinessTypeFactory + public interface IJT809BusinessTypeFactory : IJT809ExternalRegister { - Type GetBodiesImplTypeByBusinessType(ushort businessType, uint msgGNSSCENTERID); - IJT809BusinessTypeFactory SetMap(ushort businessType) - where TJT809Bodies : JT809Bodies; - IJT809BusinessTypeFactory SetMap(ushort businessType,Type bodiesImplType); - IJT809BusinessTypeFactory ReplaceMap(ushort businessType) - where TJT809Bodies : JT809Bodies; - IJT809BusinessTypeFactory CustomSetMap(ushort businessType, uint msgGNSSCENTERID) - where TJT809Bodies : JT809Bodies; - IJT809BusinessTypeFactory CustomSetMap(ushort businessType,uint msgGNSSCENTERID,Type bodiesImplType); + IDictionary Map { get; } + bool TryGetValue(ushort msgId, out object instance); + IJT809BusinessTypeFactory SetMap() where TJT809Bodies : JT809Bodies; } } diff --git a/src/JT809.Protocol/Interfaces/IJT809SubBusinessTypeFactory.cs b/src/JT809.Protocol/Interfaces/IJT809SubBusinessTypeFactory.cs index 13a5380..fa44346 100644 --- a/src/JT809.Protocol/Interfaces/IJT809SubBusinessTypeFactory.cs +++ b/src/JT809.Protocol/Interfaces/IJT809SubBusinessTypeFactory.cs @@ -1,17 +1,12 @@ using System; +using System.Collections.Generic; namespace JT809.Protocol.Interfaces { - public interface IJT809SubBusinessTypeFactory + public interface IJT809SubBusinessTypeFactory : IJT809ExternalRegister { - Type GetSubBodiesImplTypeBySubBusinessType(ushort subBusinessType); - IJT809SubBusinessTypeFactory SetMap(ushort subBusinessType) - where TJT809SubBodies : JT809SubBodies; - IJT809SubBusinessTypeFactory SetMap(ushort subBusinessType,Type subBodiesImplType); - IJT809SubBusinessTypeFactory ReplaceMap(ushort subBusinessType) - where TJT809SubBodies : JT809SubBodies; - IJT809SubBusinessTypeFactory CustomSetMap(ushort subBusinessType) - where TJT809SubBodies : JT809SubBodies; - IJT809SubBusinessTypeFactory CustomSetMap(ushort subBusinessType,Type subBodiesImplType); + IDictionary Map { get; } + bool TryGetValue(ushort msgId, out object instance); + IJT809SubBusinessTypeFactory SetMap() where TJT809SubBodies : JT809SubBodies; } } diff --git a/src/JT809.Protocol/Internal/JT809BusinessTypeFactory.cs b/src/JT809.Protocol/Internal/JT809BusinessTypeFactory.cs index 6831106..576acdc 100644 --- a/src/JT809.Protocol/Internal/JT809BusinessTypeFactory.cs +++ b/src/JT809.Protocol/Internal/JT809BusinessTypeFactory.cs @@ -5,123 +5,74 @@ using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; using System; using System.Collections.Generic; +using System.Linq; +using System.Reflection; namespace JT808.Protocol.Internal { internal class JT809BusinessTypeFactory : IJT809BusinessTypeFactory { - private readonly Dictionary map; - - private readonly Dictionary> customMap; + public IDictionary Map { get; } internal JT809BusinessTypeFactory() { - map = new Dictionary(); - customMap = new Dictionary>(); - InitMap(); + Map = new Dictionary(); + InitMap(Assembly.GetExecutingAssembly()); } - private void InitMap() + private void InitMap(Assembly assembly) { - foreach (var item in Enum.GetNames(typeof(JT809BusinessType))) + // var types = assembly.GetTypes().Where(w => w.BaseType == typeof(JT809Bodies)).Where(w=>w != typeof(JT809ExchangeMessageBodies)).ToList(); + var types = assembly.GetTypes() + .Where(w => w.BaseType == typeof(JT809Bodies) || w.BaseType == typeof(JT809ExchangeMessageBodies)).ToList(); + foreach (var type in types) { - JT809BusinessType businessType = item.ToEnum(); - if (!map.ContainsKey((ushort)businessType)) + if (type.Name == nameof(JT809ExchangeMessageBodies)) continue; + var instance = Activator.CreateInstance(type); + ushort msgId = 0; + try { - JT809BodiesTypeAttribute jT809BodiesTypeAttribute = businessType.GetAttribute(); - if (jT809BodiesTypeAttribute != null) - { - map.Add((ushort)businessType, jT809BodiesTypeAttribute.JT809BodiesType); - } + msgId = (ushort)type.GetProperty(nameof(JT809Bodies.MsgId)).GetValue(instance); } - } - } - - public Type GetBodiesImplTypeByBusinessType(ushort businessType, uint msgGNSSCENTERID) - { - //判断有无自定义消息Id类型 - if (customMap.TryGetValue(msgGNSSCENTERID, out var dict)) - { - if (dict != null) + catch (Exception ex) { - return dict.TryGetValue(businessType, out Type bodiesImptType)? bodiesImptType:null; + continue; + } + if (Map.ContainsKey(msgId)) + { + throw new ArgumentException($"{type.FullName} {msgId} An element with the same key already exists."); + } + else + { + Map.Add(msgId, instance); } } - return map.TryGetValue(businessType, out Type type) ? type : null; - } - - public IJT809BusinessTypeFactory SetMap(ushort businessType) - where TJT809Bodies : JT809Bodies - { - if (!map.ContainsKey(businessType)) - { - map.Add(businessType, typeof(TJT809Bodies)); - } - return this; } - public IJT809BusinessTypeFactory SetMap(ushort businessType, Type bodiesImplType) + public bool TryGetValue(ushort msgId, out object instance) { - if (!map.ContainsKey(businessType)) - { - map.Add(businessType, bodiesImplType); - } - return this; + return Map.TryGetValue(msgId, out instance); } - public IJT809BusinessTypeFactory ReplaceMap(ushort businessType) where TJT809Bodies : JT809Bodies + public IJT809BusinessTypeFactory SetMap() where TJT809Bodies : JT809Bodies { - if (!map.ContainsKey(businessType)) + Type type = typeof(TJT809Bodies); + var instance = Activator.CreateInstance(type); + var msgId = (ushort)type.GetProperty(nameof(JT809Bodies.MsgId)).GetValue(instance); + if (Map.ContainsKey(msgId)) { - map.Add(businessType, typeof(TJT809Bodies)); + throw new ArgumentException($"{type.FullName} {msgId} An element with the same key already exists."); } else { - map[businessType] = typeof(TJT809Bodies); + Map.Add(msgId, instance); } return this; } - public IJT809BusinessTypeFactory CustomSetMap(ushort businessType, uint msgGNSSCENTERID) where TJT809Bodies : JT809Bodies - { - if (!customMap.TryGetValue(msgGNSSCENTERID, out var dict)) - { - if (dict == null) - { - Dictionary tmp = new Dictionary(); - tmp.Add(businessType, typeof(TJT809Bodies)); - customMap.Add(businessType, tmp); - } - else - { - if (!dict.ContainsKey(businessType)) - { - dict.Add(businessType, typeof(TJT809Bodies)); - } - } - } - return this; - } - - public IJT809BusinessTypeFactory CustomSetMap(ushort businessType, uint msgGNSSCENTERID, Type bodiesImplType) + public void Register(Assembly externalAssembly) { - if (!customMap.TryGetValue(msgGNSSCENTERID, out var dict)) - { - if (dict == null) - { - Dictionary tmp = new Dictionary(); - tmp.Add(businessType, bodiesImplType); - customMap.Add(businessType, tmp); - } - else - { - if (!dict.ContainsKey(businessType)) - { - dict.Add(businessType, bodiesImplType); - } - } - } - return this; + InitMap(externalAssembly); } } } diff --git a/src/JT809.Protocol/Internal/JT809FormatterFactory.cs b/src/JT809.Protocol/Internal/JT809FormatterFactory.cs index e301295..a13b772 100644 --- a/src/JT809.Protocol/Internal/JT809FormatterFactory.cs +++ b/src/JT809.Protocol/Internal/JT809FormatterFactory.cs @@ -33,6 +33,10 @@ namespace JT809.Protocol.Internal var genericImplType = firstType.GetGenericArguments().FirstOrDefault(); if (genericImplType != null) { + if (genericImplType.GUID == Guid.Empty) + { + continue; + } if (!FormatterDict.ContainsKey(genericImplType.GUID)) { FormatterDict.Add(genericImplType.GUID, Activator.CreateInstance(genericImplType)); diff --git a/src/JT809.Protocol/Internal/JT809SubBusinessTypeFactory.cs b/src/JT809.Protocol/Internal/JT809SubBusinessTypeFactory.cs index aefdc40..07feac2 100644 --- a/src/JT809.Protocol/Internal/JT809SubBusinessTypeFactory.cs +++ b/src/JT809.Protocol/Internal/JT809SubBusinessTypeFactory.cs @@ -5,91 +5,71 @@ using JT809.Protocol.Extensions; using JT809.Protocol.Interfaces; using System; using System.Collections.Generic; +using System.Linq; +using System.Reflection; namespace JT808.Protocol.Internal { internal class JT809SubBusinessTypeFactory : IJT809SubBusinessTypeFactory { - private readonly Dictionary map; + public IDictionary Map { get; } + internal JT809SubBusinessTypeFactory() { - map = new Dictionary(); - InitMap(); + Map = new Dictionary(); + InitMap(Assembly.GetExecutingAssembly()); } - private void InitMap() + private void InitMap(Assembly assembly) { - foreach (var item in Enum.GetNames(typeof(JT809SubBusinessType))) + var types = assembly.GetTypes().Where(w => w.BaseType == typeof(JT809SubBodies)).ToList(); + foreach (var type in types) { - JT809SubBusinessType subBusinessType = item.ToEnum(); - if (!map.ContainsKey((ushort)subBusinessType)) + var instance = Activator.CreateInstance(type); + ushort msgId = 0; + try { - JT809BodiesTypeAttribute jT809BodiesTypeAttribute = subBusinessType.GetAttribute(); - if (jT809BodiesTypeAttribute != null) - { - map.Add((ushort)subBusinessType, jT809BodiesTypeAttribute.JT809BodiesType); - } + msgId = (ushort)type.GetProperty(nameof(JT809SubBodies.SubMsgId)).GetValue(instance); + } + catch (Exception ex) + { + continue; + } + if (Map.ContainsKey(msgId)) + { + throw new ArgumentException($"{type.FullName} {msgId} An element with the same key already exists."); + } + else + { + Map.Add(msgId, instance); } } } - public Type GetSubBodiesImplTypeBySubBusinessType(ushort subBusinessType) - { - return map.TryGetValue(subBusinessType, out Type type) ? type : null; - } - - public IJT809SubBusinessTypeFactory SetMap(ushort subBusinessType) - where TJT809SubBodies : JT809SubBodies - { - if (!map.ContainsKey(subBusinessType)) - { - map.Add(subBusinessType, typeof(TJT809SubBodies)); - } - return this; - } - - public IJT809SubBusinessTypeFactory SetMap(ushort subBusinessType, Type subBodiesImplType) - { - if (!map.ContainsKey(subBusinessType)) - { - map.Add(subBusinessType, subBodiesImplType); - } - return this; - } - - public IJT809SubBusinessTypeFactory ReplaceMap(ushort subBusinessType) where TJT809SubBodies : JT809SubBodies + public bool TryGetValue(ushort msgId, out object instance) { - if (!map.ContainsKey(subBusinessType)) - { - map.Add(subBusinessType, typeof(TJT809SubBodies)); - } - else - { - map[subBusinessType] = typeof(TJT809SubBodies); - } - return this; + return Map.TryGetValue(msgId, out instance); } - public IJT809SubBusinessTypeFactory CustomSetMap(ushort subBusinessType) where TJT809SubBodies : JT809SubBodies + public IJT809SubBusinessTypeFactory SetMap() where TJT809SubBodies : JT809SubBodies { - if (!map.ContainsKey(subBusinessType)) + Type type = typeof(TJT809SubBodies); + var instance = Activator.CreateInstance(type); + var msgId = (ushort)type.GetProperty(nameof(JT809SubBodies.SubMsgId)).GetValue(instance); + if (Map.ContainsKey(msgId)) { - map.Add(subBusinessType, typeof(TJT809SubBodies)); + throw new ArgumentException($"{type.FullName} {msgId} An element with the same key already exists."); } else { - map[subBusinessType] = typeof(TJT809SubBodies); + Map.Add(msgId, instance); } return this; } - public IJT809SubBusinessTypeFactory CustomSetMap(ushort subBusinessType, Type subBodiesImplType) + public void Register(Assembly externalAssembly) { - if (!map.ContainsKey(subBusinessType)) - { - map.Add(subBusinessType, subBodiesImplType); - } - return this; + InitMap(externalAssembly); } } } diff --git a/src/JT809.Protocol/JT809.Protocol.csproj b/src/JT809.Protocol/JT809.Protocol.csproj index 95c6ed5..e9dfc6f 100644 --- a/src/JT809.Protocol/JT809.Protocol.csproj +++ b/src/JT809.Protocol/JT809.Protocol.csproj @@ -144,4 +144,8 @@ + + + + diff --git a/src/JT809.Protocol/JT809.Protocol.xml b/src/JT809.Protocol/JT809.Protocol.xml index afe7f78..b430d30 100644 --- a/src/JT809.Protocol/JT809.Protocol.xml +++ b/src/JT809.Protocol/JT809.Protocol.xml @@ -292,39 +292,39 @@ auto-generated - + - UP_CLOSELINK_INFORM - 下级平台主动关闭链路通知消息 + UP_CLOSELINK_INFORM - 下级平台主动关闭主从链路通知消息 auto-generated - UP_CLOSELINK_INFORM - 下级平台主动关闭链路通知消息 + UP_CLOSELINK_INFORM - 下级平台主动关闭主从链路通知消息 auto-generated - + - UP_CLOSELINK_INFORM - 下级平台主动关闭链路通知消息 + UP_CLOSELINK_INFORM - 下级平台主动关闭主从链路通知消息 auto-generated - + - UP_EXG_MSG - 主链路动态信息交换消息 + UP_EXG_MSG - 主链路车辆动态信息交换业务 auto-generated - UP_EXG_MSG - 主链路动态信息交换消息 + UP_EXG_MSG - 主链路车辆动态信息交换业务 auto-generated - + - UP_EXG_MSG - 主链路动态信息交换消息 + UP_EXG_MSG - 主链路车辆动态信息交换业务 auto-generated @@ -418,21 +418,21 @@ auto-generated - + - DOWN_CONNECT_RSP - 从链路连接应答消息 + DOWN_CONNECT_RSP - 从链路连接应答信息 auto-generated - DOWN_CONNECT_RSP - 从链路连接应答消息 + DOWN_CONNECT_RSP - 从链路连接应答信息 auto-generated - + - DOWN_CONNECT_RSP - 从链路连接应答消息 + DOWN_CONNECT_RSP - 从链路连接应答信息 auto-generated @@ -544,57 +544,57 @@ auto-generated - + - DOWN_TOTAL_RECV_BACK_MSG - 接收定位信息数量通知消息 + DOWN_TOTAL_RECV_BACK_MSG - 接收车辆定位信息数量通知消息 auto-generated - DOWN_TOTAL_RECV_BACK_MSG - 接收定位信息数量通知消息 + DOWN_TOTAL_RECV_BACK_MSG - 接收车辆定位信息数量通知消息 auto-generated - + - DOWN_TOTAL_RECV_BACK_MSG - 接收定位信息数量通知消息 + DOWN_TOTAL_RECV_BACK_MSG - 接收车辆定位信息数量通知消息 auto-generated - + - DOWN_EXG_MSG - 从链路动态信息交换消息 + DOWN_EXG_MSG - 从链路车辆动态信息交换业务 auto-generated - DOWN_EXG_MSG - 从链路动态信息交换消息 + DOWN_EXG_MSG - 从链路车辆动态信息交换业务 auto-generated - + - DOWN_EXG_MSG - 从链路动态信息交换消息 + DOWN_EXG_MSG - 从链路车辆动态信息交换业务 auto-generated - + - DOWN_PLATFORM_MSG - 从链路平台间信息交互消息 + DOWN_PLATFORM_MSG - 从链路平台间信息交互业务 auto-generated - DOWN_PLATFORM_MSG - 从链路平台间信息交互消息 + DOWN_PLATFORM_MSG - 从链路平台间信息交互业务 auto-generated - + - DOWN_PLATFORM_MSG - 从链路平台间信息交互消息 + DOWN_PLATFORM_MSG - 从链路平台间信息交互业务 auto-generated @@ -660,312 +660,317 @@ - 主链路动态信息交换消息 + 4608 UP_EXG_MSG_REGISTER - 上传车辆注册信息 auto-generated - 主链路动态信息交换消息 + 4608 UP_EXG_MSG_REAL_LOCATION - 实时上传车辆定位信息 auto-generated - + - 主链路动态信息交换消息 - UP_EXG_MSG_HISTORY_LOCATION - 车辆定位信息自动补报 + 4608 + UP_EXG_MSG_HISTORY_LOCATION - 车辆定位信息自动补报请求消息 auto-generated - + - 主链路动态信息交换消息 - UP_EXG_MSG_RETURN_STARTUP_ACK - 启动车辆定位信息交换应答 + 4608 + UP_EXG_MSG_RETURN_STARTUP_ACK - 启动车辆定位信息交换应答消息 auto-generated - + - 主链路动态信息交换消息 - UP_EXG_MSG_RETURN_END_ACK - 结束车辆定位信息交换应答 + 4608 + UP_EXG_MSG_RETURN_END_ACK - 结束车辆定位信息交换应答消息 auto-generated - + - 主链路动态信息交换消息 - UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP - 申请交换指定车辆定位信息请求 + 4608 + UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP - 申请交换指定车辆定位信息请求消息 auto-generated - 主链路动态信息交换消息 + 4608 UP_EXG_MSG_APPLY_FOR_MONITOR_END - 取消交换指定车辆定位信息请求 auto-generated - 主链路动态信息交换消息 + 4608 UP_EXG_MSG_APPLY_HISGNSSDATA_REQ - 补发车辆定位信息请求 auto-generated - + - 主链路动态信息交换消息 - UP_EXG_MSG_REPORT_DRIVER_INFO_ACK - 上报车辆驾驶员身份识别信息应答 + 4608 + UP_EXG_MSG_REPORT_DRIVER_INFO_ACK - 上报驾驶员身份识别信息应答消息 auto-generated - + - 主链路动态信息交换消息 - UP_EXG_MSG_TAKE_EWAYBILL_ACK - 上报车辆电子运单应答 + 4608 + UP_EXG_MSG_TAKE_EWAYBILL_ACK - 上报车辆电子运单应答消息 auto-generated - + - 主链路动态信息交换消息 - UP_EXG_MSG_REPORT_DRIVER_INFO - 主动上报驾驶员身份信息 + 4608 + UP_EXG_MSG_REPORT_DRIVER_INFO - 主动上报驾驶员身份信息消息 auto-generated - 主链路动态信息交换消息 + 4608 UP_EXG_MSG_REPORT_EWAYBILL_INFO - 主动上报车辆电子运单信息 auto-generated - + - 主链路平台间信息交互消息 - UP_PLATFORM_MSG_POST_QUERY_ACK - 平台查岗应答 + 4864 + UP_PLATFORM_MSG_POST_QUERY_ACK - 平台查岗应答消息 auto-generated - + - 主链路平台间信息交互消息 - UP_PLATFORM_MSG_INFO_ACK - 下发平台间报文应答 + 4864 + UP_PLATFORM_MSG_INFO_ACK - 下发平台间报文应答消息 auto-generated - + - 主链路报警信息交互消息 - UP_WARN_MSG_URGE_TODO_ACK - 报警督办应答 + 5120 + UP_WARN_MSG_URGE_TODO_ACK - 报警督办应答消息 auto-generated - + - 主链路报警信息交互消息 - UP_WARN_MSG_ADPT_INFO - 上报报警信息 + 5120 + UP_WARN_MSG_ADPT_INFO - 上报报警信息消息 auto-generated - 主链路报警信息交互消息 + 5120 UP_WARN_MSG_ADPT_TODO_INFO - 主动上报报警处理结果信息 auto-generated - 主链路车辆监管消息 + 5376 UP_CTRL_MSG_MONITOR_VEHICLE_ACK - 车辆单向监听应答 auto-generated - 主链路车辆监管消息 + 5376 UP_CTRL_MSG_TAKE_PHOTO_ACK - 车辆拍照应答 auto-generated - + - 主链路车辆监管消息 - UP_CTRL_MSG_TEXT_INFO_ACK - 下发车辆报文应答 + 5376 + UP_CTRL_MSG_TEXT_INFO_ACK - 下发车辆报文应答消息 auto-generated - + - 主链路车辆监管消息 - UP_CTRL_MSG_TAKE_TRAVEL_ACK - 上报车辆行驶记录应答 + 5376 + UP_CTRL_MSG_TAKE_TRAVEL_ACK - 上报车辆行驶记录应答消息 auto-generated - 主链路车辆监管消息 + 5376 UP_CTRL_MSG_EMERGENCY_MONITORING_ACK - 车辆应急接入监管平台应答消息 auto-generated - 主链路静态信息交换消息 + 5632 UP_BASE_MSG_VEHICLE_ADDED_ACK - 补报车辆静态信息应答 auto-generated - + - 从链路动态信息交换消息 - DOWN_EXG_MSG_CAR_LOCATION - 交换车辆定位信息 + 37376 + DOWN_EXG_MSG_CAR_LOCATION - 交换车辆定位信息消息 auto-generated - + - 从链路动态信息交换消息 - DOWN_EXG_MSG_HISTORY_ARCOSSAREA - 车辆定位信息交换补发 + 37376 + DOWN_EXG_MSG_HISTORY_ARCOSSAREA - 车辆定位信息交换补发消息 auto-generated - + - 从链路动态信息交换消息 - DOWN_EXG_MSG_CAR_INFO - 交换车辆静态信息 + 37376 + DOWN_EXG_MSG_CAR_INFO - 交换车辆静态信息消息 auto-generated - + - 从链路动态信息交换消息 - DOWN_EXG_MSG_RETURN_STARTUP - 启动车辆定位信息交换请求 + 37376 + DOWN_EXG_MSG_RETURN_STARTUP - 启动车辆定位信息交换请求消息 auto-generated - 从链路动态信息交换消息 + 37376 DOWN_EXG_MSG_RETURN_END - 结束车辆定位信息交换请求 auto-generated - 从链路动态信息交换消息 + 37376 DOWN_EXG_MSG_APPLY_FOR_MONITOR_STARTUP_ACK - 申请交换指定车辆定位信息应答 auto-generated - 从链路动态信息交换消息 + 37376 DOWN_EXG_MSG_APPLY_FOR_MONITOR_END_ACK - 取消交换指定车辆定位信息应答 auto-generated - 从链路动态信息交换消息 + 37376 DOWN_EXG_MSG_APPLY_HISGNSSDATA_ACK - 补发车辆定位信息应答 auto-generated - 从链路动态信息交换消息 + 37376 DOWN_EXG_MSG_REPORT_DRIVER_INFO - 上报车辆驾驶员身份识别信息请求 auto-generated - + - 从链路动态信息交换消息 - DOWN_EXG_MSG_TAKE_EWAYBILL_REQ - 上报车辆电子运单请求 + 37376 + DOWN_EXG_MSG_TAKE_EWAYBILL_REQ - 上报车辆电子运单请求消息 auto-generated - 从链路平台间信息交互消息 + 37632 DOWN_PLATFORM_MSG_POST_QUERY_REQ - 平台查岗请求 auto-generated - 从链路平台间信息交互消息 + 37632 DOWN_PLATFORM_MSG_INFO_REQ - 下发平台间报文请求 auto-generated - + - 从链路报警信息交互消息 - DOWN_WARN_MSG_URGE_TODO_REQ - 报警督办请求 + 37888 + DOWN_WARN_MSG_URGE_TODO_REQ - 报警督办请求消息 auto-generated - 从链路报警信息交互消息 + 37888 DOWN_WARN_MSG_INFORM_TIPS - 报警预警 auto-generated - 从链路报警信息交互消息 + 37888 DOWN_WARN_MSG_EXG_INFORM - 实时交换报警信息 auto-generated - + - 从链路车辆监管消息 - DOWN_CTRL_MSG_MONITOR_VEHICLE_REQ - 车辆单向监听请求 + 38144 + DOWN_CTRL_MSG_MONITOR_VEHICLE_REQ - 车辆单向监听请求消息 auto-generated - + - 从链路车辆监管消息 - DOWN_CTRL_MSG_TAKE_PHOTO_REQ - 车辆拍照请求 + 38144 + DOWN_CTRL_MSG_TAKE_PHOTO_REQ - 车辆拍照请求消息 auto-generated - 从链路车辆监管消息 + 38144 DOWN_CTRL_MSG_TEXT_INFO - 下发车辆报文请求 auto-generated - + - 从链路车辆监管消息 - DOWN_CTRL_MSG_TAKE_TRAVEL_REQ - 上报车辆行驶记录请求 + 38144 + DOWN_CTRL_MSG_TAKE_TRAVEL_REQ - 上报车辆行驶记录请求消息 auto-generated - 从链路车辆监管消息 + 38144 DOWN_CTRL_MSG_EMERGENCY_MONITORING_REQ - 车辆应急接入监管平台请求消息 auto-generated - + - 从链路静态信息交换消息 - DOWN_BASE_MSG_VEHICLE_ADDED - 补报车辆静态信息请求 + 38400 + DOWN_BASE_MSG_VEHICLE_ADDED - 补报车辆静态信息请求消息 auto-generated + + + 只用来标识2019版本增删改情况 + + 消息流水号 @@ -1005,6 +1010,13 @@ + + + 跳过数据体序列化 + 默认不跳过 + 当数据体为空的时候,使用null作为空包感觉不适合,所以就算使用空包也需要new一下来表达意思。 + + 日期限制于2000年 @@ -1147,6 +1159,13 @@ 子业务数据体 + + + 跳过数据体序列化 + 默认不跳过 + 当数据体为空的时候,使用null作为空包感觉不适合,所以就算使用空包也需要new一下来表达意思。 + + 主链路登录请求消息 @@ -1765,7 +1784,7 @@ - 取消交换指定车辆定位信息请 + 取消交换指定车辆定位信息请求 子业务类型标识:UP_EXG_MSG_APPLY_F0R_MONIOR_END 描述:下级平台上传该命令给上级平台,取消之前申请监控的特殊车辆 @@ -2198,7 +2217,7 @@ - 取消交换指定车辆定位信息应答 + 补发车辆定位信息应答 子业务类型标识:DOWN_EXG_MSG_APPLY_FOR_MONITOR_END_ACK @@ -2802,9 +2821,9 @@ UP_DISCONNECT_INFORM - + - 下级平台主动关闭链路通知消息 + 下级平台主动关闭主从链路通知消息 UP_CLOSELINK_INFORM @@ -2814,9 +2833,9 @@ DOWN_CONNECT_REQ - + - 从链路连接应答消息 + 从链路连接应答信息 DOWN_CONNECT_RSP @@ -2856,21 +2875,21 @@ DOWN_CLOSELINK_INFORM - + - 接收定位信息数量通知消息 + 接收车辆定位信息数量通知消息 DOWN_TOTAL_RECV_BACK_MSG - + 主链路动态信息交换消息 UP_EXG_MSG - + - 从链路动态信息交换消息 + 从链路车辆动态信息交换业务 DOWN_EXG_MSG @@ -2880,9 +2899,9 @@ UP_PLATFORM_MSG - + - 从链路平台间信息交互消息 + 从链路平台间信息交互业务 DOWN_PLATFORM_MSG @@ -2939,25 +2958,25 @@ UP_EXG_MSG_REAL_LOCATION - + - 车辆定位信息自动补报 + 车辆定位信息自动补报请求消息 UP_EXG_MSG_HISTORY_LOCATION - + - 启动车辆定位信息交换应答 + 启动车辆定位信息交换应答消息 UP_EXG_MSG_RETURN_STARTUP_ACK - + 结束车辆定位信息交换应答 UP_EXG_MSG_RETURN_END_ACK - + 申请交换指定车辆定位信息请求 UP_EXG_MSG_APPLY_FOR_MONITOR_STARTUP @@ -2975,21 +2994,21 @@ UP_EXG_MSG_APPLY_HISGNSSDATA_REQ - + 上报车辆驾驶员身份识别信息应答 UP_EXG_MSG_REPORT_DRIVER_INFO_ACK - + 上报车辆电子运单应答 UP_EXG_MSG_TAKE_EWAYBILL_ACK - + - 主动上报驾驶员身份信息 + 主动上报驾驶员身份信息消息 UP_EXG_MSG_REPORT_DRIVER_INFO @@ -2999,27 +3018,27 @@ UP_EXG_MSG_REPORT_EWAYBILL_INFO - + 交换车辆定位信息 DOWN_EXG_MSG_CAR_LOCATION - + 车辆定位信息交换补发 DOWN_EXG_MSG_HISTORY_ARCOSSAREA - + 交换车辆静态信息 DOWN_EXG_MSG_CAR_INFO - + - 启动车辆定位信息交换请求 + 启动车辆定位信息交换请求消息 DOWN_EXG_MSG_RETURN_STARTUP @@ -3052,21 +3071,21 @@ DOWN_EXG_MSG_REPORT_DRIVER_INFO - + 上报车辆电子运单请求 DOWN_EXG_MSG_TAKE_EWAYBILL_REQ - + - 平台查岗应答 + 平台查岗应答消息 UP_PLATFORM_MSG_POST_QUERY_ACK - + - 下发平台间报文应答 + 下发平台间报文应答消息 UP_PLATFORM_MSG_INFO_ACK @@ -3082,15 +3101,15 @@ DOWN_PLATFORM_MSG_INFO_REQ - + - 报警督办应答 + 报警督办应答消息 UP_WARN_MSG_URGE_TODO_ACK - + - 上报报警信息 + 上报报警信息消息 UP_WARN_MSG_ADPT_INFO @@ -3100,9 +3119,9 @@ UP_WARN_MSG_ADPT_TODO_INFO - + - 报警督办请求 + 报警督办请求消息 DOWN_WARN_MSG_URGE_TODO_REQ @@ -3130,15 +3149,15 @@ UP_CTRL_MSG_TAKE_PHOTO_ACK - + - 下发车辆报文应答 + 下发车辆报文应答消息 UP_CTRL_MSG_TEXT_INFO_ACK - + - 上报车辆行驶记录应答 + 上报车辆行驶记录应答消息 UP_CTRL_MSG_TAKE_TRAVEL_ACK @@ -3148,15 +3167,15 @@ UP_CTRL_MSG_EMERGENCY_MONITORING_ACK - + - 车辆单向监听请求 + 车辆单向监听请求消息 DOWN_CTRL_MSG_MONITOR_VEHICLE_REQ - + - 车辆拍照请求 + 车辆拍照请求消息 DOWN_CTRL_MSG_TAKE_PHOTO_REQ @@ -3166,9 +3185,9 @@ DOWN_CTRL_MSG_TEXT_INFO - + - 上报车辆行驶记录请求 + 上报车辆行驶记录请求消息 DOWN_CTRL_MSG_TAKE_TRAVEL_REQ @@ -3184,9 +3203,9 @@ UP_BASE_MSG_VEHICLE_ADDED_ACK - + - 补报车辆静态信息请求 + 补报车辆静态信息请求消息 DOWN_BASE_MSG_VEHICLE_ADDED @@ -3305,6 +3324,21 @@ 错误代码 + + + 链路类型 + + + + + 主链路 + + + + + 从链路 + + 定位信息是否使用国家测绘局批准的地图保密插件进行加密。 diff --git a/src/JT809.Protocol/JT809HeaderPackage.cs b/src/JT809.Protocol/JT809HeaderPackage.cs index 232ded1..5fd9a76 100644 --- a/src/JT809.Protocol/JT809HeaderPackage.cs +++ b/src/JT809.Protocol/JT809HeaderPackage.cs @@ -40,8 +40,7 @@ namespace JT809.Protocol // 3.初始化消息头 try { - //todo:JT809HeaderFormatter - //jT809Package.Header = JT809HeaderFormatter.Instance.Deserialize(ref reader, config); + jT809Package.Header = config.GetMessagePackFormatter().Deserialize(ref reader, config); } catch (Exception ex) { @@ -69,7 +68,7 @@ namespace JT809.Protocol } catch (Exception ex) { - throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); + throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength()}", ex); } } jT809Package.CRCCode = reader.CalculateCheckXorCode; diff --git a/src/JT809.Protocol/JT809Package.cs b/src/JT809.Protocol/JT809Package.cs index 890036c..5c15cde 100644 --- a/src/JT809.Protocol/JT809Package.cs +++ b/src/JT809.Protocol/JT809Package.cs @@ -47,45 +47,39 @@ namespace JT809.Protocol // 3.初始化消息头 try { - //todo:JT809HeaderFormatter - //jT809Package.Header = JT809HeaderFormatter.Instance.Deserialize(ref reader, config); + jT809Package.Header = config.GetMessagePackFormatter().Deserialize(ref reader, config); } catch (Exception ex) { - throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); - } + throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength()}", ex); + } // 5.数据体处理 // 5.1 判断是否有数据体(总长度-固定长度)> 0 - if ((jT809Package.Header.MsgLength - JT809Package.FixedByteLength) > 0) + if ((jT809Package.Header.MsgLength - FixedByteLength) > 0) { - try + if (config.BusinessTypeFactory.TryGetValue(jT809Package.Header.BusinessType, out object instance)) { - Type jT809BodiesImplType = config.BusinessTypeFactory.GetBodiesImplTypeByBusinessType(jT809Package.Header.BusinessType, jT809Package.Header.MsgGNSSCENTERID); - if (jT809BodiesImplType != null) + try { // 5.2 是否加密 switch (jT809Package.Header.EncryptFlag) { case JT809Header_Encrypt.None: // 5.3 处理消息体 - jT809Package.Bodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( - config.GetMessagePackFormatterByType(jT809BodiesImplType), - ref reader, config); + jT809Package.Bodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(instance,ref reader, config); break; case JT809Header_Encrypt.Common: // 5.4. 处理加密消息体 byte[] bodiesData = config.Encrypt.Decrypt(reader.ReadContent(), config.EncryptOptions, jT809Package.Header.EncryptKey); JT809MessagePackReader bodiesReader = new JT809MessagePackReader(bodiesData); - jT809Package.Bodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( - config.GetMessagePackFormatterByType(jT809BodiesImplType), - ref bodiesReader, config); + jT809Package.Bodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(instance,ref bodiesReader, config); break; } } - } - catch (Exception ex) - { - throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); + catch (Exception ex) + { + throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); + } } } jT809Package.CRCCode = reader.CalculateCheckXorCode; @@ -120,10 +114,7 @@ namespace JT809.Protocol // 3.2.写入数据对应数据体 if (value.Bodies != null) { - JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( - config.GetMessagePackFormatterByType(value.Bodies.GetType()), - ref writer, value.Bodies, - config); + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(value.Bodies,ref writer, value.Bodies,config); } // 3.3.记录当前结束位置 int endIndex = writer.GetCurrentPosition(); diff --git a/src/JT809.Protocol/JT809Serializer.cs b/src/JT809.Protocol/JT809Serializer.cs index 798061c..52d3b18 100644 --- a/src/JT809.Protocol/JT809Serializer.cs +++ b/src/JT809.Protocol/JT809Serializer.cs @@ -17,17 +17,16 @@ namespace JT809.Protocol public class JT809Serializer { private readonly IJT809Config jT809Config; - + private static readonly JT809Package jT809Package = new JT809Package(); + private static readonly JT809HeaderPackage jT809HeaderPackage = new JT809HeaderPackage(); public JT809Serializer(IJT809Config jT809Config) { this.jT809Config = jT809Config; } - public JT809Serializer():this(new DefaultGlobalConfig()) { } - public string SerializerId => jT809Config.ConfigId; public byte[] Serialize(JT809Package jT809Package, int minBufferSize = 4096) { @@ -35,8 +34,7 @@ namespace JT809.Protocol try { JT809MessagePackWriter jT809MessagePackWriter = new JT809MessagePackWriter(buffer); - //todo:JT809PackageFormatter - //JT809PackageFormatter.Instance.Serialize(ref jT809MessagePackWriter,jT809Package, jT809Config); + jT809Package.Serialize(ref jT809MessagePackWriter,jT809Package, jT809Config); return jT809MessagePackWriter.FlushAndGetEncodingArray(); } finally @@ -44,7 +42,6 @@ namespace JT809.Protocol JT809ArrayPool.Return(buffer); } } - public JT809Package Deserialize(ReadOnlySpan bytes, int minBufferSize = 4096) { byte[] buffer = JT809ArrayPool.Rent(minBufferSize); @@ -52,29 +49,24 @@ namespace JT809.Protocol { JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(bytes); jT809MessagePackReader.Decode(buffer); - //todo:JT809PackageFormatter - return default; - //return JT809PackageFormatter.Instance.Deserialize(ref jT809MessagePackReader, jT809Config); + return jT809Package.Deserialize(ref jT809MessagePackReader, jT809Config); } finally { JT809ArrayPool.Return(buffer); } } - private static bool CheckPackageType(Type type) { return type == typeof(JT809Package) || type == typeof(JT809HeaderPackage); } - public byte[] Serialize(T obj,int minBufferSize = 4096) { byte[] buffer = JT809ArrayPool.Rent(minBufferSize); try { JT809MessagePackWriter jT809MessagePackWriter = new JT809MessagePackWriter(buffer); - //todo:JT809MessagePackFormatterExtensions - //JT809MessagePackFormatterExtensions.GetFormatter().Serialize(ref jT809MessagePackWriter, obj,jT809Config); + JT809MessagePackFormatterExtensions.GetMessagePackFormatter(jT809Config).Serialize(ref jT809MessagePackWriter, obj,jT809Config); return jT809MessagePackWriter.FlushAndGetEncodingArray(); } finally @@ -82,7 +74,6 @@ namespace JT809.Protocol JT809ArrayPool.Return(buffer); } } - public T Deserialize(ReadOnlySpan bytes, int minBufferSize = 4096) { byte[] buffer = JT809ArrayPool.Rent(minBufferSize); @@ -91,15 +82,13 @@ namespace JT809.Protocol JT809MessagePackReader jT809MessagePackReader = new JT809MessagePackReader(bytes); if (CheckPackageType(typeof(T))) jT809MessagePackReader.Decode(buffer); - return default; - //return JT809MessagePackFormatterExtensions.GetFormatter().Deserialize(ref jT809MessagePackReader, jT809Config); + return JT809MessagePackFormatterExtensions.GetMessagePackFormatter(jT809Config).Deserialize(ref jT809MessagePackReader, jT809Config); } finally { JT809ArrayPool.Return(buffer); } } - public JT809HeaderPackage HeaderDeserialize(ReadOnlySpan bytes, int minBufferSize = 4096) { byte[] buffer = JT809ArrayPool.Rent(minBufferSize); @@ -107,9 +96,7 @@ namespace JT809.Protocol { JT809MessagePackReader jT808MessagePackReader = new JT809MessagePackReader(bytes); jT808MessagePackReader.Decode(buffer); - //todo:JT809HeaderPackageFormatter - return default; - //return JT809HeaderPackageFormatter.Instance.Deserialize(ref jT808MessagePackReader, jT809Config); + return jT809HeaderPackage.Deserialize(ref jT808MessagePackReader, jT809Config); } finally { diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1200.cs b/src/JT809.Protocol/MessageBody/JT809_0x1200.cs index 83232ba..57db2e5 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x1200.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x1200.cs @@ -1,6 +1,9 @@  using JT809.Protocol.Enums; +using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; namespace JT809.Protocol.MessageBody { @@ -11,10 +14,66 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:UP_EXG_MSG /// 描述:下级平台向上级平台发送车辆动态信息交换业务数据包 /// - public class JT809_0x1200: JT809ExchangeMessageBodies + public class JT809_0x1200: JT809ExchangeMessageBodies, IJT809MessagePackFormatter { public override ushort MsgId => JT809BusinessType.主链路车辆动态信息交换业务.ToUInt16Value(); public override string Description => "主链路车辆动态信息交换业务"; public override JT809_LinkType LinkType => JT809_LinkType.main; + + public JT809_0x1200 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809_0x1200 value = new JT809_0x1200(); + value.VehicleNo = reader.ReadString(21); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + return value; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200 value, IJT809Config config) + { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); + writer.WriteUInt16(value.SubBusinessType); + try + { + // 先写入内容,然后在根据内容反写内容长度 + writer.Skip(4, out int subContentLengthPosition); + if (value.SubBodies != null) + { + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } + } + writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } } } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1300.cs b/src/JT809.Protocol/MessageBody/JT809_0x1300.cs index 00a756a..b7ab1cc 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x1300.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x1300.cs @@ -21,39 +21,51 @@ namespace JT809.Protocol.MessageBody public override JT809_LinkType LinkType => JT809_LinkType.main; public JT809_0x1300 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x1300 jT809_0X1300 = new JT809_0x1300(); - jT809_0X1300.SubBusinessType = reader.ReadUInt16(); - jT809_0X1300.DataLength = reader.ReadUInt32(); + JT809_0x1300 value = new JT809_0x1300(); + //value.VehicleNo = reader.ReadString(21); + //value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); try { - //JT809.Protocol.Enums.JT809BusinessType 映射对应消息特性 - Type jT809SubBodiesImplType = config.SubBusinessTypeFactory.GetSubBodiesImplTypeBySubBusinessType(jT809_0X1300.SubBusinessType); - if (jT809SubBodiesImplType != null) - jT809_0X1300.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( - config.GetMessagePackFormatterByType(jT809SubBodiesImplType), - ref reader, config); + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } } catch { - throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{jT809_0X1300.SubBusinessType.ToString()}"); + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); } - return jT809_0X1300; + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1300 value, IJT809Config config) { + //writer.WriteStringPadRight(value.VehicleNo, 21); + //writer.WriteByte((byte)value.VehicleColor); writer.WriteUInt16(value.SubBusinessType); - //JT809.Protocol.Enums.JT809BusinessType 映射对应消息特性 try { // 先写入内容,然后在根据内容反写内容长度 writer.Skip(4, out int subContentLengthPosition); if (value.SubBodies != null) { - JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( - config.GetMessagePackFormatterByType(value.SubBodies.GetType()), - ref writer, value.SubBodies, - config); + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } } writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1400.cs b/src/JT809.Protocol/MessageBody/JT809_0x1400.cs index bdc7c6e..68ff0d7 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x1400.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x1400.cs @@ -1,5 +1,8 @@ using JT809.Protocol.Enums; +using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; namespace JT809.Protocol.MessageBody { @@ -11,10 +14,66 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:UP_WARN_MSG /// 描述:下级平台向上级平台发送车辆报警信息业务 /// - public class JT809_0x1400: JT809ExchangeMessageBodies + public class JT809_0x1400: JT809ExchangeMessageBodies, IJT809MessagePackFormatter { public override ushort MsgId => JT809BusinessType.主链路报警信息交互消息.ToUInt16Value(); public override string Description => "主链路报警信息交互消息"; public override JT809_LinkType LinkType => JT809_LinkType.main; + + public JT809_0x1400 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809_0x1400 value = new JT809_0x1400(); + value.VehicleNo = reader.ReadString(21); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + return value; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1400 value, IJT809Config config) + { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); + writer.WriteUInt16(value.SubBusinessType); + try + { + // 先写入内容,然后在根据内容反写内容长度 + writer.Skip(4, out int subContentLengthPosition); + if (value.SubBodies != null) + { + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } + } + writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } } } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1500.cs b/src/JT809.Protocol/MessageBody/JT809_0x1500.cs index 0775753..8b69d91 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x1500.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x1500.cs @@ -1,5 +1,8 @@ using JT809.Protocol.Enums; +using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; namespace JT809.Protocol.MessageBody { @@ -10,10 +13,65 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:UP_CTRL_MSG /// 描述:下级平台向上级平台发送车辆监管业务 /// - public class JT809_0x1500: JT809ExchangeMessageBodies + public class JT809_0x1500: JT809ExchangeMessageBodies, IJT809MessagePackFormatter { public override ushort MsgId => JT809BusinessType.主链路车辆监管消息.ToUInt16Value(); public override string Description => "主链路车辆监管消息"; public override JT809_LinkType LinkType => JT809_LinkType.main; + public JT809_0x1500 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809_0x1500 value = new JT809_0x1500(); + value.VehicleNo = reader.ReadString(21); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + return value; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1500 value, IJT809Config config) + { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); + writer.WriteUInt16(value.SubBusinessType); + try + { + // 先写入内容,然后在根据内容反写内容长度 + writer.Skip(4, out int subContentLengthPosition); + if (value.SubBodies != null) + { + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } + } + writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } } } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x1600.cs b/src/JT809.Protocol/MessageBody/JT809_0x1600.cs index c9d80e0..51d5bae 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x1600.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x1600.cs @@ -1,5 +1,8 @@ using JT809.Protocol.Enums; +using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; namespace JT809.Protocol.MessageBody { @@ -10,10 +13,66 @@ namespace JT809.Protocol.MessageBody /// 消息方向:下级平台往上级平台 /// 描述:下级平台向上级平台发送车辆睁态信息交换业务 /// - public class JT809_0x1600: JT809ExchangeMessageBodies + public class JT809_0x1600: JT809ExchangeMessageBodies, IJT809MessagePackFormatter { public override ushort MsgId => JT809BusinessType.主链路静态信息交换消息.ToUInt16Value(); public override string Description => "主链路静态信息交换消息"; public override JT809_LinkType LinkType => JT809_LinkType.main; + + public JT809_0x1600 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809_0x1600 value = new JT809_0x1600(); + value.VehicleNo = reader.ReadString(21); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + return value; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1600 value, IJT809Config config) + { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); + writer.WriteUInt16(value.SubBusinessType); + try + { + // 先写入内容,然后在根据内容反写内容长度 + writer.Skip(4, out int subContentLengthPosition); + if (value.SubBodies != null) + { + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } + } + writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } } } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9200.cs b/src/JT809.Protocol/MessageBody/JT809_0x9200.cs index f1dc60d..268bdcd 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9200.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9200.cs @@ -1,5 +1,8 @@ using JT809.Protocol.Enums; +using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; namespace JT809.Protocol.MessageBody { @@ -10,10 +13,66 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:DOWN_EXG_MSG /// 描述:上级平台作为客户端向下级平台服务端发送车辆动态信息交换业务 /// - public class JT809_0x9200: JT809ExchangeMessageBodies + public class JT809_0x9200: JT809ExchangeMessageBodies, IJT809MessagePackFormatter { public override ushort MsgId => JT809BusinessType.从链路车辆动态信息交换业务.ToUInt16Value(); public override string Description => "从链路车辆动态信息交换业务"; public override JT809_LinkType LinkType => JT809_LinkType.subordinate; + + public JT809_0x9200 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809_0x9200 value = new JT809_0x9200(); + value.VehicleNo = reader.ReadString(21); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + return value; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200 value, IJT809Config config) + { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); + writer.WriteUInt16(value.SubBusinessType); + try + { + // 先写入内容,然后在根据内容反写内容长度 + writer.Skip(4, out int subContentLengthPosition); + if (value.SubBodies != null) + { + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } + } + writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } } } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9300.cs b/src/JT809.Protocol/MessageBody/JT809_0x9300.cs index 28e506a..93c5dc0 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9300.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9300.cs @@ -21,39 +21,51 @@ namespace JT809.Protocol.MessageBody public override JT809_LinkType LinkType => JT809_LinkType.subordinate; public JT809_0x9300 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { - JT809_0x9300 jT809_0X9300 = new JT809_0x9300(); - jT809_0X9300.SubBusinessType = reader.ReadUInt16(); - jT809_0X9300.DataLength = reader.ReadUInt32(); - //JT809.Protocol.Enums.JT809BusinessType 映射对应消息特性 + JT809_0x9300 value = new JT809_0x9300(); + value.VehicleNo = reader.ReadString(21); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); try { - Type jT809SubBodiesImplType = config.SubBusinessTypeFactory.GetSubBodiesImplTypeBySubBusinessType(jT809_0X9300.SubBusinessType); - if (jT809SubBodiesImplType != null) - jT809_0X9300.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( - config.GetMessagePackFormatterByType(jT809SubBodiesImplType), - ref reader, config); + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } } catch { - throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{jT809_0X9300.SubBusinessType.ToString()}"); + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); } - return jT809_0X9300; + return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9300 value, IJT809Config config) { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); writer.WriteUInt16(value.SubBusinessType); - //JT809.Protocol.Enums.JT809BusinessType 映射对应消息特性 try { // 先写入内容,然后在根据内容反写内容长度 writer.Skip(4, out int subContentLengthPosition); if (value.SubBodies != null) { - JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( - config.GetMessagePackFormatterByType(value.SubBodies.GetType()), - ref writer, value.SubBodies, - config); + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } } writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9400.cs b/src/JT809.Protocol/MessageBody/JT809_0x9400.cs index af3826f..b711025 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9400.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9400.cs @@ -1,6 +1,9 @@  using JT809.Protocol.Enums; +using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; namespace JT809.Protocol.MessageBody { @@ -11,10 +14,65 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:DOWN_WARN_MSG /// 描述:上级平台向下级平台发送报瞥信息业务 /// - public class JT809_0x9400: JT809ExchangeMessageBodies + public class JT809_0x9400: JT809ExchangeMessageBodies, IJT809MessagePackFormatter { public override ushort MsgId => JT809BusinessType.从链路报警信息交互消息.ToUInt16Value(); public override string Description => "从链路报警信息交互消息"; public override JT809_LinkType LinkType => JT809_LinkType.subordinate; + public JT809_0x9400 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809_0x9400 value = new JT809_0x9400(); + value.VehicleNo = reader.ReadString(21); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + return value; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9400 value, IJT809Config config) + { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); + writer.WriteUInt16(value.SubBusinessType); + try + { + // 先写入内容,然后在根据内容反写内容长度 + writer.Skip(4, out int subContentLengthPosition); + if (value.SubBodies != null) + { + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } + } + writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } } } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9500.cs b/src/JT809.Protocol/MessageBody/JT809_0x9500.cs index 0be655d..3927371 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9500.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9500.cs @@ -1,5 +1,8 @@ using JT809.Protocol.Enums; +using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; namespace JT809.Protocol.MessageBody { @@ -10,10 +13,65 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:DOWN_CTRL_MSG /// 描述:上级平台向下级平台发送车辆监监管业务 /// - public class JT809_0x9500: JT809ExchangeMessageBodies + public class JT809_0x9500: JT809ExchangeMessageBodies, IJT809MessagePackFormatter { public override ushort MsgId => JT809BusinessType.从链路车辆监管消息.ToUInt16Value(); public override string Description => "从链路车辆监管消息"; public override JT809_LinkType LinkType => JT809_LinkType.subordinate; + public JT809_0x9500 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809_0x9500 value = new JT809_0x9500(); + value.VehicleNo = reader.ReadString(21); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + return value; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9500 value, IJT809Config config) + { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); + writer.WriteUInt16(value.SubBusinessType); + try + { + // 先写入内容,然后在根据内容反写内容长度 + writer.Skip(4, out int subContentLengthPosition); + if (value.SubBodies != null) + { + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } + } + writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } } } diff --git a/src/JT809.Protocol/MessageBody/JT809_0x9600.cs b/src/JT809.Protocol/MessageBody/JT809_0x9600.cs index 2d4413e..0938a19 100644 --- a/src/JT809.Protocol/MessageBody/JT809_0x9600.cs +++ b/src/JT809.Protocol/MessageBody/JT809_0x9600.cs @@ -1,6 +1,9 @@  using JT809.Protocol.Enums; +using JT809.Protocol.Exceptions; using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.MessagePack; namespace JT809.Protocol.MessageBody { @@ -11,10 +14,66 @@ namespace JT809.Protocol.MessageBody /// 业务数据类型标识:DOWN_BASE_MSG /// 描述:上级平台向下级平台发送车辆静态信息交换业务 /// - public class JT809_0x9600: JT809ExchangeMessageBodies + public class JT809_0x9600: JT809ExchangeMessageBodies, IJT809MessagePackFormatter { public override ushort MsgId => JT809BusinessType.从链路静态信息交换消息.ToUInt16Value(); public override string Description => "从链路静态信息交换消息"; public override JT809_LinkType LinkType => JT809_LinkType.subordinate; + + public JT809_0x9600 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809_0x9600 value = new JT809_0x9600(); + value.VehicleNo = reader.ReadString(21); + value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); + value.SubBusinessType = reader.ReadUInt16(); + value.DataLength = reader.ReadUInt32(); + try + { + if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) + { + if (instance is JT809SubBodies subBodies) + { + if (!subBodies.SkipSerialization) + { + value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( + instance, + ref reader, config); + } + } + } + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + return value; + } + + public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9600 value, IJT809Config config) + { + writer.WriteStringPadRight(value.VehicleNo, 21); + writer.WriteByte((byte)value.VehicleColor); + writer.WriteUInt16(value.SubBusinessType); + try + { + // 先写入内容,然后在根据内容反写内容长度 + writer.Skip(4, out int subContentLengthPosition); + if (value.SubBodies != null) + { + if (!value.SubBodies.SkipSerialization) + { + JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( + value.SubBodies, + ref writer, value.SubBodies, + config); + } + } + writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); + } + catch + { + throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}"); + } + } } } diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs index d7c8638..25dd473 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1203.cs @@ -44,9 +44,8 @@ namespace JT809.Protocol.SubMessageBody try { JT809MessagePackReader jT809_0x1200_0x1202Reader = new JT809MessagePackReader(reader.ReadArray(36)); - //todo:JT809_0x1200_0x1202_Formatter - //var jT809_0x1200_0x1202 = JT809_0x1200_0x1202_Formatter.Instance.Deserialize(ref jT809_0x1200_0x1202Reader, config); - //jT809_0X1200_0X1203.GNSS.Add(jT809_0x1200_0x1202); + var jT809_0x1200_0x1202 = config.GetMessagePackFormatter().Deserialize(ref jT809_0x1200_0x1202Reader, config); + jT809_0X1200_0X1203.GNSS.Add(jT809_0x1200_0x1202); } catch (Exception) { @@ -64,8 +63,7 @@ namespace JT809.Protocol.SubMessageBody { try { - //todo:JT809_0x1200_0x1202_Formatter - //JT809_0x1200_0x1202_Formatter.Instance.Serialize(ref writer, item, config); + item.Serialize(ref writer, item, config); } catch (Exception ex) { diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9203.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9203.cs index 6639786..510ea2c 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9203.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9203.cs @@ -38,9 +38,8 @@ namespace JT809.Protocol.SubMessageBody try { JT809MessagePackReader jT809_0x9200_0x9202Reader = new JT809MessagePackReader(reader.ReadArray(36)); - //todo:JT809_0x9200_0x9202 - //JT809_0x9200_0x9202 jT809_0x1200_0x1202 = JT809_0x9200_0x9202_Formatter.Instance.Deserialize(ref jT809_0x9200_0x9202Reader, config); - //jT809_0X1200_0x9203.GNSS.Add(jT809_0x1200_0x1202); + JT809_0x9200_0x9202 jT809_0x1200_0x1202 = config.GetMessagePackFormatter().Deserialize(ref jT809_0x9200_0x9202Reader, config); + jT809_0X1200_0x9203.GNSS.Add(jT809_0x1200_0x1202); } catch (Exception) { @@ -57,8 +56,7 @@ namespace JT809.Protocol.SubMessageBody { try { - //todo:JT809_0x9200_0x9202 - //JT809_0x9200_0x9202_Formatter.Instance.Serialize(ref writer, item, config); + item.Serialize(ref writer, item, config); } catch (Exception ex) { diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9401.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9401.cs index c1bc89e..79dc86c 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9401.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9400_0x9401.cs @@ -70,7 +70,7 @@ namespace JT809.Protocol.SubMessageBody public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9400_0x9401 value, IJT809Config config) { writer.WriteByte((byte)value.WarnSrc); - writer.WriteUInt16((ushort)value.WarnType); + writer.WriteUInt16(value.WarnType); writer.WriteUTCDateTime(value.WarnTime); writer.WriteHex(value.SupervisionID, 4); writer.WriteUTCDateTime(value.SupervisionEndTime);