From 72948978024bdaa4688ca054d0dffca2ad7a3b8e Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Tue, 7 Jan 2020 15:34:29 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D0x0608=E5=8D=8F=E8=AE=AE=20?= =?UTF-8?q?2.=E5=A2=9E=E5=8A=A0808=E6=B6=88=E6=81=AF=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=8F=8A=E6=89=A9=E5=B1=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageBody/JT808_0x0608Test.cs | 258 +++++++++++++++++- src/JT808.Protocol/Enums/JT808MsgId.cs | 7 + .../JT808PackageExtensionsTemplate.cs | 35 +++ src/JT808.Protocol/JT808.Protocol.csproj | 2 +- src/JT808.Protocol/JT808.Protocol.xml | 54 ++++ .../MessageBody/JT808_0x0608.cs | 145 ++++++++-- 6 files changed, 480 insertions(+), 21 deletions(-) diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0608Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0608Test.cs index db1edbb..b516202 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0608Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0608Test.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Xunit; using JT808.Protocol.Metadata; +using JT808.Protocol.Enums; namespace JT808.Protocol.Test.MessageBody { @@ -16,23 +17,272 @@ namespace JT808.Protocol.Test.MessageBody { JT808_0x0608 value = new JT808_0x0608 { - QueryType=1, + QueryType=5, Ids=new List() { 1,2,3} }; var hex = JT808Serializer.Serialize(value).ToHexString(); - Assert.Equal("0100000003000000010000000200000003", hex); + Assert.Equal("0500000003000000010000000200000003", hex); } [Fact] public void Test2() { - byte[] bytes = "0100000003000000010000000200000003".ToHexBytes(); + byte[] bytes = "0500000003000000010000000200000003".ToHexBytes(); JT808_0x0608 value = JT808Serializer.Deserialize(bytes); - Assert.Equal(1, value.QueryType); + Assert.Equal(5, value.QueryType); Assert.Equal(3u, value.Count); Assert.Equal(1u, value.Ids[0]); Assert.Equal(2u, value.Ids[1]); Assert.Equal(3u, value.Ids[2]); } + + [Fact] + public void Test_JT808_0X8600s_1() + { + JT808_0x0608 value = new JT808_0x0608 + { + QueryType = 1, + JT808_0x8600s=new List() + { + new JT808_0x8600 + { + AreaItems =new List + { + new JT808CircleAreaProperty + { + AreaId = 1522, + AreaProperty = 222, + CenterPointLat = 123456789, + CenterPointLng = 123456789, + Radius = 200, + StartTime = DateTime.Parse("2020-01-07 00:00:12"), + EndTime = DateTime.Parse("2020-01-07 00:00:13"), + HighestSpeed = 60, + OverspeedDuration = 200, + NightMaximumSpeed=666, + AreaName="SmallChi" + } + }, + SettingAreaProperty= JT808SettingProperty.追加区域.ToByteValue() + } + } + }; + var hex = JT808Serializer.Serialize(value, JT808Version.JTT2019).ToHexString(); + Assert.Equal("01000000010101000005F200DE075BCD15075BCD15000000C8003CC8029A0008536D616C6C436869", hex); + } + + [Fact] + public void Test_JT808_0X8600s_2() + { + byte[] bytes = "01000000010101000005F200DE075BCD15075BCD15000000C8003CC8029A0008536D616C6C436869".ToHexBytes(); + JT808_0x0608 value = JT808Serializer.Deserialize(bytes, JT808Version.JTT2019); + Assert.Equal(1, value.QueryType); + Assert.Equal(1u, value.Count); + var jT808_0X8600 = value.JT808_0x8600s[0]; + Assert.Equal(JT808SettingProperty.追加区域.ToByteValue(), jT808_0X8600.SettingAreaProperty); + Assert.Equal(1, jT808_0X8600.AreaCount); + var item0 = jT808_0X8600.AreaItems[0]; + Assert.Equal((uint)1522, item0.AreaId); + Assert.Equal((ushort)222, item0.AreaProperty); + Assert.Equal((uint)123456789, item0.CenterPointLat); + Assert.Equal((uint)123456789, item0.CenterPointLng); + Assert.Equal((uint)200, item0.Radius); + Assert.Null(item0.StartTime); + Assert.Null(item0.EndTime); + Assert.Equal((ushort)60, item0.HighestSpeed); + Assert.Equal((byte)200, item0.OverspeedDuration); + Assert.Equal(666, item0.NightMaximumSpeed); + Assert.Equal("SmallChi", item0.AreaName); + } + + [Fact] + public void Test_JT808_0X8602s_1() + { + JT808_0x0608 value = new JT808_0x0608 + { + QueryType = 2, + JT808_0x8602s = new List() + { + new JT808_0x8602 + { + AreaItems =new List + { + new JT808RectangleAreaProperty + { + AreaId = 1522, + AreaProperty = 222, + LowRightPointLat= 123456789, + LowRightPointLng= 123456788, + UpLeftPointLat= 123456787, + UpLeftPointLng= 123456786, + StartTime = DateTime.Parse("2020-01-07 00:00:12"), + EndTime = DateTime.Parse("2020-01-07 00:00:13"), + HighestSpeed = 60, + OverspeedDuration = 200, + AreaName="smallchi" + } + }, + SettingAreaProperty= JT808SettingProperty.追加区域.ToByteValue() + } + } + }; + var hex = JT808Serializer.Serialize(value, JT808Version.JTT2019).ToHexString(); + Assert.Equal("02000000010101000005F200DE075BCD13075BCD12075BCD15075BCD14003CC800000008736D616C6C636869", hex); + } + + [Fact] + public void Test_JT808_0X8602s_2() + { + byte[] bytes = "02000000010101000005F200DE075BCD13075BCD12075BCD15075BCD14003CC800000008736D616C6C636869".ToHexBytes(); + JT808_0x0608 value = JT808Serializer.Deserialize(bytes, JT808Version.JTT2019); + Assert.Equal(2, value.QueryType); + Assert.Equal(1u, value.Count); + var jT808_0X8602 = value.JT808_0x8602s[0]; + Assert.Equal(JT808SettingProperty.追加区域.ToByteValue(), jT808_0X8602.SettingAreaProperty); + Assert.Equal(1, jT808_0X8602.AreaCount); + var item0 = jT808_0X8602.AreaItems[0]; + Assert.Equal((uint)1522, item0.AreaId); + Assert.Equal((ushort)222, item0.AreaProperty); + Assert.Equal((uint)123456789, item0.LowRightPointLat); + Assert.Equal((uint)123456788, item0.LowRightPointLng); + Assert.Equal((uint)123456787, item0.UpLeftPointLat); + Assert.Equal((uint)123456786, item0.UpLeftPointLng); + Assert.Null(item0.StartTime); + Assert.Null(item0.EndTime); + Assert.Equal((ushort)60, item0.HighestSpeed); + Assert.Equal((byte)200, item0.OverspeedDuration); + Assert.Equal(0, item0.NightMaximumSpeed); + Assert.Equal("smallchi", item0.AreaName); + } + + [Fact] + public void Test_JT808_0x8604s_1() + { + JT808_0x0608 value = new JT808_0x0608 + { + QueryType = 3, + JT808_0x8604s = new List() + { + new JT808_0x8604 + { AreaId = 1234, + AreaProperty = JT808SettingProperty.追加区域.ToByteValue(), + StartTime = DateTime.Parse("2020-01-07 00:00:12"), + EndTime = DateTime.Parse("2020-01-07 00:00:13"), + HighestSpeed = 62, + OverspeedDuration = 218, + PeakItems = new List() + { + new JT808PeakProperty + { + Lat= 123456789, + Lng= 123456788 + }, + new JT808PeakProperty + { + Lat = 123456700, + Lng = 123456701 + } + }, + AreaName="smallchi", + NightMaximumSpeed=66 + } + } + }; + var hex = JT808Serializer.Serialize(value, JT808Version.JTT2019).ToHexString(); + Assert.Equal("0300000001000004D200012001070000122001070000130002075BCD15075BCD14075BCCBC075BCCBD0008736D616C6C636869", hex); + } + + [Fact] + public void Test_JT808_0X8604s_2() + { + byte[] bytes = "0300000001000004D200012001070000122001070000130002075BCD15075BCD14075BCCBC075BCCBD0008736D616C6C636869".ToHexBytes(); + JT808_0x0608 value = JT808Serializer.Deserialize(bytes, JT808Version.JTT2019); + Assert.Equal(3, value.QueryType); + Assert.Equal(1u, value.Count); + var jT808_0X8604 = value.JT808_0x8604s[0]; + Assert.Equal((uint)1234, jT808_0X8604.AreaId); + Assert.Equal(JT808SettingProperty.追加区域.ToByteValue(), jT808_0X8604.AreaProperty); + Assert.Null(jT808_0X8604.HighestSpeed); + Assert.Null(jT808_0X8604.OverspeedDuration); + Assert.Equal(DateTime.Parse("2020-01-07 00:00:12"), jT808_0X8604.StartTime); + Assert.Equal(DateTime.Parse("2020-01-07 00:00:13"), jT808_0X8604.EndTime); + Assert.Equal(2, jT808_0X8604.PeakItems.Count); + Assert.Equal((uint)123456789, jT808_0X8604.PeakItems[0].Lat); + Assert.Equal((uint)123456788, jT808_0X8604.PeakItems[0].Lng); + Assert.Equal((uint)123456700, jT808_0X8604.PeakItems[1].Lat); + Assert.Equal((uint)123456701, jT808_0X8604.PeakItems[1].Lng); + Assert.Equal(0, jT808_0X8604.NightMaximumSpeed); + Assert.Equal("smallchi", jT808_0X8604.AreaName); + } + + [Fact] + public void Test_JT808_0x8606s_1() + { + JT808_0x0608 value = new JT808_0x0608 + { + QueryType = 4, + JT808_0x8606s = new List() + { + new JT808_0x8606 + { + RouteId = 9999, + RouteProperty = 51, + StartTime = DateTime.Parse("2020-01-07 00:00:12"), + EndTime = DateTime.Parse("2020-01-07 00:00:12"), + InflectionPointItems = new List() + { + new JT808InflectionPointProperty() + { + InflectionPointId = 1000, + InflectionPointLat = 123456789, + InflectionPointLng = 123456788, + SectionDrivingUnderThreshold = 123, + SectionHighestSpeed = 69, + SectionId = 1287, + SectionLongDrivingThreshold = 50, + SectionOverspeedDuration = 23, + SectionProperty = 3, + SectionWidth = 56, + NightMaximumSpeed=80 + } + }, + RouteName = "koike518" + } + } + }; + var hex = JT808Serializer.Serialize(value, JT808Version.JTT2019).ToHexString(); + Assert.Equal("04000000010000270F00332001070000122001070000120001000003E800000507075BCD15075BCD1438030032007B004517005000086B6F696B65353138", hex); + } + + [Fact] + public void Test_JT808_0X8606s_2() + { + byte[] bytes = "04000000010000270F00332001070000122001070000120001000003E800000507075BCD15075BCD1438030032007B004517005000086B6F696B65353138".ToHexBytes(); + JT808_0x0608 value = JT808Serializer.Deserialize(bytes, JT808Version.JTT2019); + Assert.Equal(4, value.QueryType); + Assert.Equal(1u, value.Count); + var jT808_0X8606 = value.JT808_0x8606s[0]; + Assert.Equal((uint)9999, jT808_0X8606.RouteId); + Assert.Equal((uint)51, jT808_0X8606.RouteProperty); + Assert.Equal(DateTime.Parse("2020-01-07 00:00:12"), jT808_0X8606.StartTime); + Assert.Equal(DateTime.Parse("2020-01-07 00:00:12"), jT808_0X8606.EndTime); + + Assert.Equal(1, jT808_0X8606.InflectionPointItems.Count); + + Assert.Equal((uint)1000, jT808_0X8606.InflectionPointItems[0].InflectionPointId); + Assert.Equal((uint)123456789, jT808_0X8606.InflectionPointItems[0].InflectionPointLat); + Assert.Equal((uint)123456788, jT808_0X8606.InflectionPointItems[0].InflectionPointLng); + + Assert.Equal((ushort)123, jT808_0X8606.InflectionPointItems[0].SectionDrivingUnderThreshold); + Assert.Equal((ushort)69, jT808_0X8606.InflectionPointItems[0].SectionHighestSpeed); + Assert.Equal((uint)1287, jT808_0X8606.InflectionPointItems[0].SectionId); + Assert.Equal((ushort)50, jT808_0X8606.InflectionPointItems[0].SectionLongDrivingThreshold); + Assert.Equal((byte)23, jT808_0X8606.InflectionPointItems[0].SectionOverspeedDuration); + Assert.Equal(3, jT808_0X8606.InflectionPointItems[0].SectionProperty); + Assert.Equal(56, jT808_0X8606.InflectionPointItems[0].SectionWidth); + Assert.Equal(80, jT808_0X8606.InflectionPointItems[0].NightMaximumSpeed.Value); + + Assert.Equal("koike518", jT808_0X8606.RouteName); + } } } diff --git a/src/JT808.Protocol/Enums/JT808MsgId.cs b/src/JT808.Protocol/Enums/JT808MsgId.cs index 5b4166b..ab1a106 100644 --- a/src/JT808.Protocol/Enums/JT808MsgId.cs +++ b/src/JT808.Protocol/Enums/JT808MsgId.cs @@ -498,5 +498,12 @@ namespace JT808.Protocol.Enums [JT808BodiesType(typeof(JT808_0x0608))] [JT808MsgIdDescription("0x0608", "查询区域或线路数据应答")] 查询区域或线路数据应答 = 0x0608, + /// + /// 存储多媒体数据检索应答 + /// 0x0802 + /// + [JT808BodiesType(typeof(JT808_0x0802))] + [JT808MsgIdDescription("0x0802", "存储多媒体数据检索应答")] + 存储多媒体数据检索应答 = 0x0802, } } diff --git a/src/JT808.Protocol/Extensions/JT808PackageExtensionsTemplate.cs b/src/JT808.Protocol/Extensions/JT808PackageExtensionsTemplate.cs index a4d2a5a..c23bcae 100644 --- a/src/JT808.Protocol/Extensions/JT808PackageExtensionsTemplate.cs +++ b/src/JT808.Protocol/Extensions/JT808PackageExtensionsTemplate.cs @@ -810,6 +810,41 @@ namespace JT808.Protocol.Extensions return Create2019(msgId,terminalPhoneNo,bodies); } /// + /// 0x0802 - 存储多媒体数据检索应答 + /// auto-generated + /// + public static JT808Package Create_存储多媒体数据检索应答(this JT808MsgId msgId, string terminalPhoneNo,JT808.Protocol.MessageBody.JT808_0x0802 bodies) + { + return Create(msgId,terminalPhoneNo,bodies); + } + + /// + /// 0x0802 - 存储多媒体数据检索应答 + /// auto-generated + /// + public static JT808Package Create(this JT808MsgId msgId, string terminalPhoneNo,JT808.Protocol.MessageBody.JT808_0x0802 bodies) + { + return Create(msgId,terminalPhoneNo,bodies); + } + + /// + /// 0x0802 - 存储多媒体数据检索应答 + /// auto-generated 2019 version + /// + public static JT808Package Create_存储多媒体数据检索应答_2019(this JT808MsgId msgId, string terminalPhoneNo,JT808.Protocol.MessageBody.JT808_0x0802 bodies) + { + return Create2019(msgId,terminalPhoneNo,bodies); + } + + /// + /// 0x0802 - 存储多媒体数据检索应答 + /// auto-generated 2019 version + /// + public static JT808Package Create2019(this JT808MsgId msgId, string terminalPhoneNo,JT808.Protocol.MessageBody.JT808_0x0802 bodies) + { + return Create2019(msgId,terminalPhoneNo,bodies); + } + /// /// 0x0805 - 摄像头立即拍摄命令应答 /// auto-generated /// diff --git a/src/JT808.Protocol/JT808.Protocol.csproj b/src/JT808.Protocol/JT808.Protocol.csproj index f461e52..b1f5de9 100644 --- a/src/JT808.Protocol/JT808.Protocol.csproj +++ b/src/JT808.Protocol/JT808.Protocol.csproj @@ -14,7 +14,7 @@ https://github.com/SmallChi/JT808/blob/master/LICENSE https://github.com/SmallChi/JT808/blob/master/LICENSE false - 2.2.4 + 2.2.5 LICENSE diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index 45bd743..aa40d13 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -716,6 +716,12 @@ 0x0608 + + + 存储多媒体数据检索应答 + 0x0802 + + 多媒体格式编码 @@ -1506,6 +1512,30 @@ auto-generated 2019 version + + + 0x0802 - 存储多媒体数据检索应答 + auto-generated + + + + + 0x0802 - 存储多媒体数据检索应答 + auto-generated + + + + + 0x0802 - 存储多媒体数据检索应答 + auto-generated 2019 version + + + + + 0x0802 - 存储多媒体数据检索应答 + auto-generated 2019 version + + 0x0805 - 摄像头立即拍摄命令应答 @@ -3884,6 +3914,30 @@ 查询的区域或线路的ID + + + 设置圆形区域 + 查询类型为1 + + + + + 设置矩形区域 + 查询类型为2 + + + + + 设置多边形区域 + 查询类型为3 + + + + + 设置路线 + 查询类型为4 + + 电子运单上报 diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0608.cs b/src/JT808.Protocol/MessageBody/JT808_0x0608.cs index fca63ca..83f2866 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0608.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0608.cs @@ -1,4 +1,5 @@ -using JT808.Protocol.Formatters; +using JT808.Protocol.Extensions; +using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System.Collections.Generic; @@ -20,11 +21,30 @@ namespace JT808.Protocol.MessageBody /// 查询的区域或线路的ID数量 /// public uint Count { get; set; } - /// /// 查询的区域或线路的ID /// public List Ids { get; set; } + /// + /// 设置圆形区域 + /// 查询类型为1 + /// + public List JT808_0x8600s { get; set; } + /// + /// 设置矩形区域 + /// 查询类型为2 + /// + public List JT808_0x8602s { get; set; } + /// + /// 设置多边形区域 + /// 查询类型为3 + /// + public List JT808_0x8604s { get; set; } + /// + /// 设置路线 + /// 查询类型为4 + /// + public List JT808_0x8606s { get; set; } public JT808_0x0608 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0608 value = new JT808_0x0608(); @@ -32,29 +52,122 @@ namespace JT808.Protocol.MessageBody value.Count = reader.ReadUInt32(); if (value.Count > 0) { - value.Ids = new List(); - for (int i = 0; i < value.Count; i++) + switch (value.QueryType) { - value.Ids.Add(reader.ReadUInt32()); + case 1: + value.JT808_0x8600s = new List(); + for (int i = 0; i < value.Count; i++) + { + if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8600).GUID, out object instance)) + { + dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); + value.JT808_0x8600s.Add(attachImpl); + } + } + break; + case 2: + value.JT808_0x8602s = new List(); + for (int i = 0; i < value.Count; i++) + { + if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8602).GUID, out object instance)) + { + dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); + value.JT808_0x8602s.Add(attachImpl); + } + } + break; + case 3: + value.JT808_0x8604s = new List(); + for (int i = 0; i < value.Count; i++) + { + if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8604).GUID, out object instance)) + { + dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); + value.JT808_0x8604s.Add(attachImpl); + } + } + break; + case 4: + value.JT808_0x8606s = new List(); + for (int i = 0; i < value.Count; i++) + { + if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8606).GUID, out object instance)) + { + dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); + value.JT808_0x8606s.Add(attachImpl); + } + } + break; + default: + value.Ids = new List(); + for (int i = 0; i < value.Count; i++) + { + value.Ids.Add(reader.ReadUInt32()); + } + break; } } return value; } - public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0608 value, IJT808Config config) { writer.WriteByte(value.QueryType); - if (value.Ids != null && value.Ids.Count > 0) - { - writer.WriteUInt32((uint)value.Ids.Count); - foreach (var item in value.Ids) - { - writer.WriteUInt32(item); - } - } - else + switch (value.QueryType) { - writer.WriteUInt32(0); + case 1: + if (value.JT808_0x8600s != null && value.JT808_0x8600s.Count > 0) + { + writer.WriteUInt32((uint)value.JT808_0x8600s.Count); + foreach (var item in value.JT808_0x8600s) + { + JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); + } + } + break; + case 2: + if (value.JT808_0x8602s != null && value.JT808_0x8602s.Count > 0) + { + writer.WriteUInt32((uint)value.JT808_0x8602s.Count); + foreach (var item in value.JT808_0x8602s) + { + JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); + } + } + break; + case 3: + if (value.JT808_0x8604s != null && value.JT808_0x8604s.Count > 0) + { + writer.WriteUInt32((uint)value.JT808_0x8604s.Count); + foreach (var item in value.JT808_0x8604s) + { + JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); + } + } + break; + case 4: + if(value.JT808_0x8606s != null && value.JT808_0x8606s.Count > 0) + { + writer.WriteUInt32((uint)value.JT808_0x8606s.Count); + foreach (var item in value.JT808_0x8606s) + { + JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); + } + } + break; + default: + if (value.Ids != null && value.Ids.Count > 0) + { + writer.WriteUInt32((uint)value.Ids.Count); + foreach (var item in value.Ids) + { + writer.WriteUInt32(item); + } + } + else + { + writer.WriteUInt32(0); + } + break; } } }