From 8ccad9dbe3d530c5e317615bdf5c10edabeec860 Mon Sep 17 00:00:00 2001 From: waterliu99 Date: Tue, 24 Mar 2020 18:51:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=BB=AA=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E5=88=86=E6=9E=90=EF=BC=8C=E5=8F=8A=E5=8D=95=E5=85=83=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- .../JT808.Protocol.Test.csproj | 2 + .../MessageBody/JT808_0x0700Test.cs | 79 +++++- .../MessageBody/JT808_0x8700Test.cs | 96 +++++++ .../MessageBody/JT808_0x8701Test.cs | 241 ++++++++++++++++++ .../Interfaces/GlobalConfigBase.cs | 4 + src/JT808.Protocol/Interfaces/IJT808Config.cs | 12 +- .../Interfaces/IJT808_CarDVR_Down_Package.cs | 10 + .../Interfaces/IJT808_CarDVR_Up_Package.cs | 10 + src/JT808.Protocol/JT808.Protocol.xml | 27 +- src/JT808.Protocol/JT808CarDVRDownPackage.cs | 38 ++- src/JT808.Protocol/JT808CarDVRUpPackage.cs | 33 ++- .../CarDVR/JT808_CarDVR_Down_0x08.cs | 13 +- .../CarDVR/JT808_CarDVR_Down_0x09.cs | 13 +- .../CarDVR/JT808_CarDVR_Down_0x10.cs | 13 +- .../CarDVR/JT808_CarDVR_Down_0x11.cs | 13 +- .../CarDVR/JT808_CarDVR_Down_0x12.cs | 13 +- .../CarDVR/JT808_CarDVR_Down_0x13.cs | 13 +- .../CarDVR/JT808_CarDVR_Down_0x14.cs | 13 +- .../CarDVR/JT808_CarDVR_Down_0x15.cs | 13 +- .../CarDVR/JT808_CarDVR_Down_0x82.cs | 31 ++- .../CarDVR/JT808_CarDVR_Down_0x83.cs | 4 +- .../CarDVR/JT808_CarDVR_Down_0x84.cs | 78 ++++-- .../CarDVR/JT808_CarDVR_Down_0xC2.cs | 4 +- .../CarDVR/JT808_CarDVR_Down_0xC3.cs | 19 +- .../CarDVR/JT808_CarDVR_Down_0xC4.cs | 10 +- .../CarDVR/JT808_CarDVR_Down_0xE1.cs | 17 +- .../CarDVR/JT808_CarDVR_Up_0x00.cs | 6 +- .../CarDVR/JT808_CarDVR_Up_0x01.cs | 5 +- .../CarDVR/JT808_CarDVR_Up_0x02.cs | 5 +- .../CarDVR/JT808_CarDVR_Up_0x03.cs | 14 +- .../CarDVR/JT808_CarDVR_Up_0x04.cs | 9 +- .../CarDVR/JT808_CarDVR_Up_0x05.cs | 11 +- .../CarDVR/JT808_CarDVR_Up_0x06.cs | 31 ++- .../CarDVR/JT808_CarDVR_Up_0x07.cs | 17 +- .../CarDVR/JT808_CarDVR_Up_0x08.cs | 25 ++ .../CarDVR/JT808_CarDVR_Up_0x09.cs | 30 ++- .../CarDVR/JT808_CarDVR_Up_0x10.cs | 53 +++- .../CarDVR/JT808_CarDVR_Up_0x11.cs | 44 +++- .../CarDVR/JT808_CarDVR_Up_0x12.cs | 38 ++- .../CarDVR/JT808_CarDVR_Up_0x13.cs | 27 +- .../CarDVR/JT808_CarDVR_Up_0x14.cs | 18 +- .../CarDVR/JT808_CarDVR_Up_0x15.cs | 69 ++++- .../CarDVR/JT808_CarDVR_Up_0xE3.cs | 1 + .../MessageBody/JT808_0x0107.cs | 2 +- .../MessageBody/JT808_0x0700.cs | 19 +- .../MessageBody/JT808_0x8003.cs | 2 +- .../MessageBody/JT808_0x8700.cs | 16 +- .../MessageBody/JT808_0x8701.cs | 16 +- 49 files changed, 1159 insertions(+), 124 deletions(-) create mode 100644 src/JT808.Protocol.Test/MessageBody/JT808_0x8700Test.cs create mode 100644 src/JT808.Protocol.Test/MessageBody/JT808_0x8701Test.cs create mode 100644 src/JT808.Protocol/Interfaces/IJT808_CarDVR_Down_Package.cs create mode 100644 src/JT808.Protocol/Interfaces/IJT808_CarDVR_Up_Package.cs diff --git a/README.md b/README.md index 6be3c15..cd805e6 100644 --- a/README.md +++ b/README.md @@ -365,9 +365,9 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.1 | 40 | 0x8605 | √ | √ | 删除多边形区域 | | 41 | 0x8606 | √ | √ | 设置路线 |修改| | 42 | 0x8607 | √ | √ | 删除路线 | -| 43 | 0x8700 | x | x | 行驶记录仪数据采集命令 |待开发 -| 44 | 0x0700 | x | x | 行驶记录仪数据上传 |待开发 -| 45 | 0x8701 | x | x | 行驶记录仪参数下传命令 |待开发 +| 43 | 0x8700 | √ | √ | 行驶记录仪数据采集命令 |待开发 +| 44 | 0x0700 | √ | √ | 行驶记录仪数据上传 |待开发 +| 45 | 0x8701 | √ | √ | 行驶记录仪参数下传命令 |待开发 | 46 | 0x0701 | √ | √ | 电子运单上报 | | 47 | 0x0702 | √ | √ | 驾驶员身份信息采集上报 |修改| | 48 | 0x8702 | √ | 消息体为空| 上报驾驶员身份信息请求 | diff --git a/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj b/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj index 5627df8..4f51e08 100644 --- a/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj +++ b/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj @@ -89,6 +89,8 @@ + + diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0700Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0700Test.cs index b71783b..2babe78 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0700Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0700Test.cs @@ -25,6 +25,58 @@ namespace JT808.Protocol.Test.MessageBody JT808Serializer = new JT808Serializer(jT808Config); } [Fact] + public void Test_Analyze() + { + //0x00 + byte[] bytes = "000100557A00000200190135".ToHexBytes(); + var value = JT808Serializer.Analyze(bytes); + //0x01 + bytes = "000101557A0100120034333032323331393930303731323636383732".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x02 + bytes = "000102557A020006002003231010103B".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x03 + bytes = "000103557A03001400200322101010200323101010000010000000500079".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x04 + bytes = "000104557A04000800200323101010003201".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x05 + bytes = "000105557A050027003132333435363738393132333435363738D4C142313233343500000000D6D8D0CDBBF5B3B5000009".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x06 + bytes = "000106557A06005700200323101010FFD7D4B6A8D2E531000000D7D4B6A8D2E532000000D7D4B6A8D2E533000000BDFCB9E2B5C600000000D4B6B9E2B5C600000000D3D2D7AACFF200000000D7F3D7AACFF200000000D6C6B6AF00000000000084".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x07 + bytes = "000107557A0700230031323334353637313233343536373839313233343536372003233132333431323334003A".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x08 + bytes = "000108557A08007E002003230000000A14FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x09 + bytes = "000109557A09029A0020032300000006C6431601691B8800320AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x10 + bytes = "000110557A1000EA002003230000003433303232333139393030393230333639380A14FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06C6431601691B8800329D".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x11 + bytes = "000111557A1100320034333032323331393930303932303336393820032200000020032300000006C6431601691B88003206C6431701691B89003C09".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x12 + bytes = "000112557A12001900200323000000343330323233313939303039323033363938012F".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x13 + bytes = "000113557A13000700200323000000013A".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x14 + bytes = "000114557A14000700200323000000013D".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x15 + bytes = "000115557A15008500012003220000002003230000003228FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + } + [Fact] public void Test_Serialize_0x00() { JT808_0x0700 value = new JT808_0x0700(); @@ -86,6 +138,7 @@ namespace JT808.Protocol.Test.MessageBody var body = value.JT808CarDVRUpPackage.Bodies as JT808_CarDVR_Up_0x01; Assert.Equal("430223199007126687", body.DriverLicenseNo); } + [Fact] public void Test_Serialize_0x02() { @@ -393,7 +446,7 @@ namespace JT808.Protocol.Test.MessageBody GpsLng=113656598, Height=50, DriverLicenseNo="430223199009203698", - JT808_CarDVR_Up_0x09_DrivingStatuss=new List + JT808_CarDVR_Up_0x10_DrivingStatuss=new List { new JT808_CarDVR_Up_0x10_DrivingStatus{ Speed=10, @@ -419,8 +472,8 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(113656598, body.JT808_CarDVR_Up_0x10_AccidentSuspectins[0].GpsLng); Assert.Equal(50, body.JT808_CarDVR_Up_0x10_AccidentSuspectins[0].Height); Assert.Equal("430223199009203698", body.JT808_CarDVR_Up_0x10_AccidentSuspectins[0].DriverLicenseNo); - Assert.Equal(10, body.JT808_CarDVR_Up_0x10_AccidentSuspectins[0].JT808_CarDVR_Up_0x09_DrivingStatuss[0].Speed); - Assert.Equal(20, body.JT808_CarDVR_Up_0x10_AccidentSuspectins[0].JT808_CarDVR_Up_0x09_DrivingStatuss[0].StatusSignal); + Assert.Equal(10, body.JT808_CarDVR_Up_0x10_AccidentSuspectins[0].JT808_CarDVR_Up_0x10_DrivingStatuss[0].Speed); + Assert.Equal(20, body.JT808_CarDVR_Up_0x10_AccidentSuspectins[0].JT808_CarDVR_Up_0x10_DrivingStatuss[0].StatusSignal); } [Fact] public void Test_Serialize_0x11() @@ -449,13 +502,13 @@ namespace JT808.Protocol.Test.MessageBody } }; var hex = JT808Serializer.Serialize(value).ToHexString(); - Assert.Equal("000100557A00000300190134", hex); + Assert.Equal("000111557A1100320034333032323331393930303932303336393820032200000020032300000006C6431601691B88003206C6431701691B89003C09", hex); } [Fact] public void Test_Deserilize_0x11() { - byte[] bytes = "000100557A00000300190134".ToHexBytes(); + byte[] bytes = "000111557A1100320034333032323331393930303932303336393820032200000020032300000006C6431601691B88003206C6431701691B89003C09".ToHexBytes(); JT808_0x0700 value = JT808Serializer.Deserialize(bytes); Assert.Equal(1, value.ReplyMsgNum); var body = value.JT808CarDVRUpPackage.Bodies as JT808_CarDVR_Up_0x11; @@ -490,13 +543,13 @@ namespace JT808.Protocol.Test.MessageBody } }; var hex = JT808Serializer.Serialize(value).ToHexString(); - Assert.Equal("000100557A00000300190134", hex); + Assert.Equal("000112557A12001900200323000000343330323233313939303039323033363938012F", hex); } [Fact] public void Test_Deserilize_0x12() { - byte[] bytes = "000100557A00000300190134".ToHexBytes(); + byte[] bytes = "000112557A12001900200323000000343330323233313939303039323033363938012F".ToHexBytes(); JT808_0x0700 value = JT808Serializer.Deserialize(bytes); Assert.Equal(1, value.ReplyMsgNum); var body = value.JT808CarDVRUpPackage.Bodies as JT808_CarDVR_Up_0x12; @@ -524,13 +577,13 @@ namespace JT808.Protocol.Test.MessageBody } }; var hex = JT808Serializer.Serialize(value).ToHexString(); - Assert.Equal("000100557A00000300190134", hex); + Assert.Equal("000113557A13000700200323000000013A", hex); } [Fact] public void Test_Deserilize_0x13() { - byte[] bytes = "000100557A00000300190134".ToHexBytes(); + byte[] bytes = "000113557A13000700200323000000013A".ToHexBytes(); JT808_0x0700 value = JT808Serializer.Deserialize(bytes); Assert.Equal(1, value.ReplyMsgNum); var body = value.JT808CarDVRUpPackage.Bodies as JT808_CarDVR_Up_0x13; @@ -557,13 +610,13 @@ namespace JT808.Protocol.Test.MessageBody } }; var hex = JT808Serializer.Serialize(value).ToHexString(); - Assert.Equal("000100557A00000300190134", hex); + Assert.Equal("000114557A14000700200323000000013D", hex); } [Fact] public void Test_Deserilize_0x14() { - byte[] bytes = "000100557A00000300190134".ToHexBytes(); + byte[] bytes = "000114557A14000700200323000000013D".ToHexBytes(); JT808_0x0700 value = JT808Serializer.Deserialize(bytes); Assert.Equal(1, value.ReplyMsgNum); var body = value.JT808CarDVRUpPackage.Bodies as JT808_CarDVR_Up_0x14; @@ -597,13 +650,13 @@ namespace JT808.Protocol.Test.MessageBody } }; var hex = JT808Serializer.Serialize(value).ToHexString(); - Assert.Equal("000100557A00000300190134", hex); + Assert.Equal("000115557A15008500012003220000002003230000003228FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5", hex); } [Fact] public void Test_Deserilize_0x15() { - byte[] bytes = "000100557A00000300190134".ToHexBytes(); + byte[] bytes = "000115557A15008500012003220000002003230000003228FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5".ToHexBytes(); JT808_0x0700 value = JT808Serializer.Deserialize(bytes); Assert.Equal(1, value.ReplyMsgNum); var body = value.JT808CarDVRUpPackage.Bodies as JT808_CarDVR_Up_0x15; diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x8700Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x8700Test.cs new file mode 100644 index 0000000..4c879c2 --- /dev/null +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x8700Test.cs @@ -0,0 +1,96 @@ +using JT808.Protocol.MessageBody; +using JT808.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JT808.Protocol.Internal; +using JT808.Protocol.MessageBody.CarDVR; + +namespace JT808.Protocol.Test.MessageBody +{ + public class JT808_0x8700Test + { + JT808Serializer JT808Serializer; + + public JT808_0x8700Test() + { + IJT808Config jT808Config = new DefaultGlobalConfig(); + JT808Serializer = new JT808Serializer(jT808Config); + } + [Fact] + public void Test_Analyze() + { + //0x00 -- 0x07 指令和这个单元测试一样 + byte[] bytes = "00557A000000002F".ToHexBytes(); + var value = JT808Serializer.Analyze(bytes); + // 0x08 -- 0x15 测试用例一样 + bytes = "08557A08000E00200322101010200323101010000129".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + } + /// + /// 0x00 -- 0x07 指令和这个单元测试一样 + /// + [Fact] + public void Test_Serilize_0x00() + { + JT808_0x8700 value = new JT808_0x8700(); + value.CommandId = 0x00; + value.JT808CarDVRDownPackage = new JT808CarDVRDownPackage { + CommandId=0x00, + Bodies=new JT808_CarDVR_Down_0x00() + }; + var hex = JT808Serializer.Serialize(value).ToHexString(); + Assert.Equal("00557A000000002F", hex); + } + /// + /// 0x00 -- 0x07 指令和这个单元测试一样 + /// + [Fact] + public void Test_Deserilize_0x00() + { + byte[] bytes = "00557A000000002F".ToHexBytes(); + JT808_0x8700 value = JT808Serializer.Deserialize(bytes); + Assert.Equal(0, value.CommandId); + var body = value.JT808CarDVRDownPackage as JT808CarDVRDownPackage; + Assert.Equal(0, body.CommandId); + } + /// + /// 0x08 -- 0x15 测试用例一样 + /// + [Fact] + public void Test_Serilize_0x08() + { + JT808_0x8700 value = new JT808_0x8700(); + value.CommandId = 0x08; + value.JT808CarDVRDownPackage = new JT808CarDVRDownPackage + { + CommandId = 0x08, + Bodies = new JT808_CarDVR_Down_0x08() + { + StartTime = Convert.ToDateTime("2020-03-22 10:10:10"), + EndTime = Convert.ToDateTime("2020-03-23 10:10:10"), + Count =1 + } + }; + var hex = JT808Serializer.Serialize(value).ToHexString(); + Assert.Equal("08557A08000E00200322101010200323101010000129", hex); + } + /// + /// 0x08 -- 0x15 测试用例一样 + /// + [Fact] + public void Test_Deserilize_0x08() + { + byte[] bytes = "08557A08000E00200322101010200323101010000129".ToHexBytes(); + JT808_0x8700 value = JT808Serializer.Deserialize(bytes); + Assert.Equal(0x08, value.CommandId); + var body = value.JT808CarDVRDownPackage as JT808CarDVRDownPackage; + Assert.Equal(0x08, body.CommandId); + var subBody = body.Bodies as JT808_CarDVR_Down_0x08; + Assert.Equal("2020-03-22 10:10:10", subBody.StartTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal("2020-03-23 10:10:10", subBody.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(1, subBody.Count); + } + } +} diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x8701Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x8701Test.cs new file mode 100644 index 0000000..62db2a0 --- /dev/null +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x8701Test.cs @@ -0,0 +1,241 @@ +using JT808.Protocol.MessageBody; +using JT808.Protocol.Extensions; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JT808.Protocol.Internal; +using JT808.Protocol.MessageBody.CarDVR; + +namespace JT808.Protocol.Test.MessageBody +{ + public class JT808_0x8701Test + { + JT808Serializer JT808Serializer; + + public JT808_0x8701Test() + { + IJT808Config jT808Config = new DefaultGlobalConfig(); + JT808Serializer = new JT808Serializer(jT808Config); + } + [Fact] + public void Test_Analyze() + { + //0x82 + byte[] bytes = "82557A820027003132333435363738393132333435363738D4C142313233343500000000D6D8D0CDBBF5B3B500008E".ToHexBytes(); + var value = JT808Serializer.Analyze(bytes); + // 0x83 + bytes = "83557A83000600200323101010BA".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0x84 + bytes = "84557A84005700200323101010FFD7D4B6A8D2E531000000D7D4B6A8D2E532000000D7D4B6A8D2E533000000BDFCB9E2B5C600000000D4B6B9E2B5C600000000D3D2D7AACFF200000000D7F3D7AACFF200000000D6C6B6AF00000000000006".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + // 0xC2 + bytes = "C2557AC2000600200323101010FB".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + //0xC3 + bytes = "C3557AC30008002003231010100032C6".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + // 0xC4 + bytes = "C4557AC40014002003231010102003221010100000100000005000BE".ToHexBytes(); + value = JT808Serializer.Analyze(bytes); + } + [Fact] + public void Test_Serilize_0x82() + { + JT808_0x8701 value = new JT808_0x8701(); + value.CommandId = 0x82; + value.JT808CarDVRDownPackage = new JT808CarDVRDownPackage + { + CommandId = 0x82, + Bodies = new JT808_CarDVR_Down_0x82() { + VehicleNo="粤B12345", + VehicleType="重型货车", + Vin="12345678912345678" + } + }; + var hex = JT808Serializer.Serialize(value).ToHexString(); + Assert.Equal("82557A820027003132333435363738393132333435363738D4C142313233343500000000D6D8D0CDBBF5B3B500008E", hex); + } + + [Fact] + public void Test_Deserilize_0x82() + { + byte[] bytes = "82557A820027003132333435363738393132333435363738D4C142313233343500000000D6D8D0CDBBF5B3B500008E".ToHexBytes(); + JT808_0x8701 value = JT808Serializer.Deserialize(bytes); + Assert.Equal(0x82, value.CommandId); + var body = value.JT808CarDVRDownPackage as JT808CarDVRDownPackage; + Assert.Equal(0x82, body.CommandId); + var subBody = body.Bodies as JT808_CarDVR_Down_0x82; + Assert.Equal("粤B12345", subBody.VehicleNo); + Assert.Equal("重型货车", subBody.VehicleType); + Assert.Equal("12345678912345678", subBody.Vin); + } + [Fact] + public void Test_Serilize_0x83() + { + JT808_0x8701 value = new JT808_0x8701(); + value.CommandId = 0x83; + value.JT808CarDVRDownPackage = new JT808CarDVRDownPackage + { + CommandId = 0x83, + Bodies = new JT808_CarDVR_Down_0x83() + { + RealTime = Convert.ToDateTime("2020-03-23 10:10:10") + } + }; + var hex = JT808Serializer.Serialize(value).ToHexString(); + Assert.Equal("83557A83000600200323101010BA", hex); + } + + [Fact] + public void Test_Deserilize_0x83() + { + byte[] bytes = "83557A83000600200323101010BA".ToHexBytes(); + JT808_0x8701 value = JT808Serializer.Deserialize(bytes); + Assert.Equal(0x83, value.CommandId); + var body = value.JT808CarDVRDownPackage as JT808CarDVRDownPackage; + Assert.Equal(0x83, body.CommandId); + var subBody = body.Bodies as JT808_CarDVR_Down_0x83; + Assert.Equal("2020-03-23 10:10:10", subBody.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); + } + [Fact] + public void Test_Serilize_0x84() + { + JT808_0x8701 value = new JT808_0x8701(); + value.CommandId = 0x84; + value.JT808CarDVRDownPackage = new JT808CarDVRDownPackage + { + CommandId = 0x84, + Bodies = new JT808_CarDVR_Down_0x84() + { + FarLight = "远光灯", + Brake = "制动", + D0 = "自定义1", + D1 = "自定义2", + D2 = "自定义3", + LeftTurn = "左转向", + NearLight = "近光灯", + RealTime = Convert.ToDateTime("2020-03-23 10:10:10"), + RightTurn = "右转向", + SignalOperate = 255, + } + }; + var hex = JT808Serializer.Serialize(value).ToHexString(); + Assert.Equal("84557A84005700200323101010FFD7D4B6A8D2E531000000D7D4B6A8D2E532000000D7D4B6A8D2E533000000BDFCB9E2B5C600000000D4B6B9E2B5C600000000D3D2D7AACFF200000000D7F3D7AACFF200000000D6C6B6AF00000000000006", hex); + } + + [Fact] + public void Test_Deserilize_0x84() + { + byte[] bytes = "84557A84005700200323101010FFD7D4B6A8D2E531000000D7D4B6A8D2E532000000D7D4B6A8D2E533000000BDFCB9E2B5C600000000D4B6B9E2B5C600000000D3D2D7AACFF200000000D7F3D7AACFF200000000D6C6B6AF00000000000006".ToHexBytes(); + JT808_0x8701 value = JT808Serializer.Deserialize(bytes); + Assert.Equal(0x84, value.CommandId); + var body = value.JT808CarDVRDownPackage as JT808CarDVRDownPackage; + Assert.Equal(0x84, body.CommandId); + var subBody = body.Bodies as JT808_CarDVR_Down_0x84; + Assert.Equal("远光灯", subBody.FarLight); + Assert.Equal("制动", subBody.Brake); + Assert.Equal("自定义1", subBody.D0); + Assert.Equal("自定义2", subBody.D1); + Assert.Equal("自定义3", subBody.D2); + Assert.Equal("左转向", subBody.LeftTurn); + Assert.Equal("近光灯", subBody.NearLight); + Assert.Equal("2020-03-23 10:10:10", subBody.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal("右转向", subBody.RightTurn); + Assert.Equal(255, subBody.SignalOperate); + } + [Fact] + public void Test_Serilize_0xC2() + { + JT808_0x8701 value = new JT808_0x8701(); + value.CommandId = 0xC2; + value.JT808CarDVRDownPackage = new JT808CarDVRDownPackage + { + CommandId = 0xC2, + Bodies = new JT808_CarDVR_Down_0xC2() + { + RealTime = Convert.ToDateTime("2020-03-23 10:10:10") + } + }; + var hex = JT808Serializer.Serialize(value).ToHexString(); + Assert.Equal("C2557AC2000600200323101010FB", hex); + } + + [Fact] + public void Test_Deserilize_0xC2() + { + byte[] bytes = "C2557AC2000600200323101010FB".ToHexBytes(); + JT808_0x8701 value = JT808Serializer.Deserialize(bytes); + Assert.Equal(0xC2, value.CommandId); + var body = value.JT808CarDVRDownPackage as JT808CarDVRDownPackage; + Assert.Equal(0xC2, body.CommandId); + var subBody = body.Bodies as JT808_CarDVR_Down_0xC2; + Assert.Equal("2020-03-23 10:10:10", subBody.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); + } + [Fact] + public void Test_Serilize_0xC3() + { + JT808_0x8701 value = new JT808_0x8701(); + value.CommandId = 0xC3; + value.JT808CarDVRDownPackage = new JT808CarDVRDownPackage + { + CommandId = 0xC3, + Bodies = new JT808_CarDVR_Down_0xC3() + { + PulseCoefficient=50, + RealTime = Convert.ToDateTime("2020-03-23 10:10:10") + } + }; + var hex = JT808Serializer.Serialize(value).ToHexString(); + Assert.Equal("C3557AC30008002003231010100032C6", hex); + } + + [Fact] + public void Test_Deserilize_0xC3() + { + byte[] bytes = "C3557AC30008002003231010100032C6".ToHexBytes(); + JT808_0x8701 value = JT808Serializer.Deserialize(bytes); + Assert.Equal(0xC3, value.CommandId); + var body = value.JT808CarDVRDownPackage as JT808CarDVRDownPackage; + Assert.Equal(0xC3, body.CommandId); + var subBody = body.Bodies as JT808_CarDVR_Down_0xC3; + Assert.Equal("2020-03-23 10:10:10", subBody.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(50, subBody.PulseCoefficient); + } + [Fact] + public void Test_Serilize_0xC4() + { + JT808_0x8701 value = new JT808_0x8701(); + value.CommandId = 0xC4; + value.JT808CarDVRDownPackage = new JT808CarDVRDownPackage + { + CommandId = 0xC4, + Bodies = new JT808_CarDVR_Down_0xC4() + { + FirstInstallTime = Convert.ToDateTime("2020-03-22 10:10:10"), + RealTime = Convert.ToDateTime("2020-03-23 10:10:10"), + FirstMileage="1000", + TotalMilage="5000" + } + }; + var hex = JT808Serializer.Serialize(value).ToHexString(); + Assert.Equal("C4557AC40014002003231010102003221010100000100000005000BE", hex); + } + + [Fact] + public void Test_Deserilize_0xC4() + { + byte[] bytes = "C4557AC40014002003231010102003221010100000100000005000BE".ToHexBytes(); + JT808_0x8701 value = JT808Serializer.Deserialize(bytes); + Assert.Equal(0xC4, value.CommandId); + var body = value.JT808CarDVRDownPackage as JT808CarDVRDownPackage; + Assert.Equal(0xC4, body.CommandId); + var subBody = body.Bodies as JT808_CarDVR_Down_0xC4; + Assert.Equal("2020-03-22 10:10:10", subBody.FirstInstallTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal("2020-03-23 10:10:10", subBody.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal("1000", subBody.FirstMileage); + Assert.Equal("5000", subBody.TotalMilage); + } + } +} diff --git a/src/JT808.Protocol/Interfaces/GlobalConfigBase.cs b/src/JT808.Protocol/Interfaces/GlobalConfigBase.cs index 65ed62b..e996b07 100644 --- a/src/JT808.Protocol/Interfaces/GlobalConfigBase.cs +++ b/src/JT808.Protocol/Interfaces/GlobalConfigBase.cs @@ -28,6 +28,8 @@ namespace JT808.Protocol.Interfaces JT808_0x8500_2019_Factory = new JT808_0x8500_2019_Factory(); JT808_CarDVR_Up_Factory = new JT808_CarDVR_Up_Factory(); JT808_CarDVR_Down_Factory = new JT808_CarDVR_Down_Factory(); + IJT808_CarDVR_Up_Package = new JT808CarDVRUpPackage(); + IJT808_CarDVR_Down_Package = new JT808CarDVRDownPackage(); TerminalPhoneNoLength = 12; Trim = true; } @@ -50,6 +52,8 @@ namespace JT808.Protocol.Interfaces public virtual IJT808_0x8500_2019_Factory JT808_0x8500_2019_Factory { get; set; } public IJT808_CarDVR_Up_Factory JT808_CarDVR_Up_Factory { get; set; } public IJT808_CarDVR_Down_Factory JT808_CarDVR_Down_Factory { get; set; } + public IJT808_CarDVR_Up_Package IJT808_CarDVR_Up_Package { get; set; } + public IJT808_CarDVR_Down_Package IJT808_CarDVR_Down_Package { get; set; } public bool SkipCarDVRCRCCode { get; set; } public virtual IJT808Config Register(params Assembly[] externalAssemblies) diff --git a/src/JT808.Protocol/Interfaces/IJT808Config.cs b/src/JT808.Protocol/Interfaces/IJT808Config.cs index 8c0037b..a8111dc 100644 --- a/src/JT808.Protocol/Interfaces/IJT808Config.cs +++ b/src/JT808.Protocol/Interfaces/IJT808Config.cs @@ -61,14 +61,22 @@ namespace JT808.Protocol /// IJT808_0x8500_2019_Factory JT808_0x8500_2019_Factory { get; set; } /// - /// 记录仪上行工厂 + /// 记录仪上行命令字工厂 /// IJT808_CarDVR_Up_Factory JT808_CarDVR_Up_Factory { get; set; } /// - /// 记录仪下行工厂 + /// 记录仪下行命令字工厂 /// IJT808_CarDVR_Down_Factory JT808_CarDVR_Down_Factory { get; set; } /// + /// 记录仪上行包 + /// + public IJT808_CarDVR_Up_Package IJT808_CarDVR_Up_Package { get; set; } + /// + /// 记录仪下行包 + /// + public IJT808_CarDVR_Down_Package IJT808_CarDVR_Down_Package { get; set; } + /// /// 统一编码 /// Encoding Encoding { get; set; } diff --git a/src/JT808.Protocol/Interfaces/IJT808_CarDVR_Down_Package.cs b/src/JT808.Protocol/Interfaces/IJT808_CarDVR_Down_Package.cs new file mode 100644 index 0000000..fbc4582 --- /dev/null +++ b/src/JT808.Protocol/Interfaces/IJT808_CarDVR_Down_Package.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Interfaces +{ + public interface IJT808_CarDVR_Down_Package + { + } +} diff --git a/src/JT808.Protocol/Interfaces/IJT808_CarDVR_Up_Package.cs b/src/JT808.Protocol/Interfaces/IJT808_CarDVR_Up_Package.cs new file mode 100644 index 0000000..d821b4a --- /dev/null +++ b/src/JT808.Protocol/Interfaces/IJT808_CarDVR_Up_Package.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Interfaces +{ + public interface IJT808_CarDVR_Up_Package + { + } +} diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index ddc028f..f96ec26 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -2706,12 +2706,22 @@ - 记录仪上行工厂 + 记录仪上行命令字工厂 - 记录仪下行工厂 + 记录仪下行命令字工厂 + + + + + 记录仪上行包 + + + + + 记录仪下行包 @@ -3794,14 +3804,9 @@ 当前时间 - + - 脉冲系数高字节 - - - - - 仪脉冲系数低字节 + 脉冲系数 @@ -3966,7 +3971,7 @@ - 脉冲系数高字节 + 脉冲系数 @@ -4202,7 +4207,7 @@ 机动车驾驶证号码 - + 每 0.2s 间隔采集 1 次,共 100组 20s 的事故疑点记录,按时间倒序排列 diff --git a/src/JT808.Protocol/JT808CarDVRDownPackage.cs b/src/JT808.Protocol/JT808CarDVRDownPackage.cs index a51509f..b4ef5dc 100644 --- a/src/JT808.Protocol/JT808CarDVRDownPackage.cs +++ b/src/JT808.Protocol/JT808CarDVRDownPackage.cs @@ -2,14 +2,16 @@ using JT808.Protocol.Exceptions; using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; using System.Collections.Generic; using System.Text; +using System.Text.Json; namespace JT808.Protocol { - public class JT808CarDVRDownPackage : IJT808MessagePackFormatter + public class JT808CarDVRDownPackage : IJT808_CarDVR_Down_Package,IJT808MessagePackFormatter, IJT808Analyze { public const ushort BeginFlag = 0x557A; /// @@ -82,5 +84,39 @@ namespace JT808.Protocol value.CheckCode = reader.ReadByte(); return value; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808CarDVRDownPackage value = new JT808CarDVRDownPackage(); + writer.WriteStartObject("行车记录仪下行数据包"); + int currentPosition = reader.ReaderCount; + value.Begin = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Begin.ReadNumber()}]起始字头", value.Begin); + value.CommandId = reader.ReadByte(); + writer.WriteString($"[{value.Begin.ReadNumber()}]命令字", ((JT808CarDVRCommandID)value.CommandId).ToString()); + value.DataLength = reader.ReadUInt16(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}]数据块长度", value.DataLength); + value.KeepFields = reader.ReadByte(); + writer.WriteNumber($"[{value.KeepFields.ReadNumber()}]保留字", value.KeepFields); + if (value.DataLength > 0) + { + if (config.JT808_CarDVR_Down_Factory.Map.TryGetValue(value.CommandId, out var instance)) + { + //4.2.处理消息体 + writer.WriteStartObject(((JT808CarDVRCommandID)value.CommandId).ToString()); + instance.Analyze(ref reader, writer, config); + writer.WriteEndObject(); + } + } + var carDVRCheckCode = reader.ReadCarDVRCheckCode(currentPosition); + if (!config.SkipCarDVRCRCCode) + { + if (carDVRCheckCode.RealXorCheckCode != carDVRCheckCode.CalculateXorCheckCode) + throw new JT808Exception(JT808ErrorCode.CarDVRCheckCodeNotEqual, $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}"); + } + value.CheckCode = reader.ReadByte(); + writer.WriteNumber($"[{value.CheckCode.ReadNumber()}]校验位", value.CheckCode); + writer.WriteEndObject(); + } } } diff --git a/src/JT808.Protocol/JT808CarDVRUpPackage.cs b/src/JT808.Protocol/JT808CarDVRUpPackage.cs index 4af3b33..9a3ef63 100644 --- a/src/JT808.Protocol/JT808CarDVRUpPackage.cs +++ b/src/JT808.Protocol/JT808CarDVRUpPackage.cs @@ -14,7 +14,7 @@ namespace JT808.Protocol /// /// 行车记录仪上行数据包 /// - public class JT808CarDVRUpPackage : IJT808MessagePackFormatter, IJT808Analyze + public class JT808CarDVRUpPackage : IJT808_CarDVR_Up_Package,IJT808MessagePackFormatter, IJT808Analyze { public const ushort BeginFlag = 0x557A; /// @@ -44,7 +44,36 @@ namespace JT808.Protocol public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - throw new NotImplementedException(); + JT808CarDVRUpPackage value = new JT808CarDVRUpPackage(); + writer.WriteStartObject("行车记录仪上行数据包"); + int currentPosition = reader.ReaderCount; + value.Begin = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Begin.ReadNumber()}]起始字头", value.Begin); + value.CommandId = reader.ReadByte(); + writer.WriteString($"[{value.Begin.ReadNumber()}]命令字", ((JT808CarDVRCommandID)value.CommandId).ToString()); + value.DataLength = reader.ReadUInt16(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}]数据块长度", value.DataLength); + value.KeepFields = reader.ReadByte(); + writer.WriteNumber($"[{value.KeepFields.ReadNumber()}]保留字", value.KeepFields); + if (value.DataLength > 0) + { + if (config.JT808_CarDVR_Up_Factory.Map.TryGetValue(value.CommandId, out var instance)) + { + //4.2.处理消息体 + writer.WriteStartObject(((JT808CarDVRCommandID)value.CommandId).ToString()); + instance.Analyze(ref reader,writer, config); + writer.WriteEndObject(); + } + } + var carDVRCheckCode = reader.ReadCarDVRCheckCode(currentPosition); + if (!config.SkipCarDVRCRCCode) + { + if (carDVRCheckCode.RealXorCheckCode != carDVRCheckCode.CalculateXorCheckCode) + throw new JT808Exception(JT808ErrorCode.CarDVRCheckCodeNotEqual, $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}"); + } + value.CheckCode = reader.ReadByte(); + writer.WriteNumber($"[{value.CheckCode.ReadNumber()}]校验位", value.CheckCode); + writer.WriteEndObject(); } public JT808CarDVRUpPackage Deserialize(ref JT808MessagePackReader reader, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x08.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x08.cs index 9b3e4b9..898b41e 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x08.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x08.cs @@ -15,7 +15,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// 返回:符合条件的行驶速度记录 /// 如在指定的时间范围内无数据记录,则本数据块数据为空 /// - public class JT808_CarDVR_Down_0x08 : JT808CarDVRDownBodies, IJT808MessagePackFormatter + public class JT808_CarDVR_Down_0x08 : JT808CarDVRDownBodies, IJT808MessagePackFormatter, IJT808Analyze { public override byte CommandId => JT808CarDVRCommandID.采集指定的行驶速度记录.ToByteValue(); /// @@ -47,5 +47,16 @@ namespace JT808.Protocol.MessageBody.CarDVR value.Count = reader.ReadUInt16(); return value; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_CarDVR_Down_0x08 value = new JT808_CarDVR_Down_0x08(); + value.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.StartTime.ToString("yyMMddHHmmss")}]开始时间", value.StartTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.EndTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.Count = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Count.ReadNumber()}]最大单位数据块个数", value.Count); + } } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x09.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x09.cs index d3ff1a4..892b4ef 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x09.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x09.cs @@ -15,7 +15,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// 返回:符合条件的位置信息记录 /// 指定的时间范围内无数据记录,则本数据块数据为空 /// - public class JT808_CarDVR_Down_0x09 : JT808CarDVRDownBodies, IJT808MessagePackFormatter + public class JT808_CarDVR_Down_0x09 : JT808CarDVRDownBodies, IJT808MessagePackFormatter, IJT808Analyze { public override byte CommandId => JT808CarDVRCommandID.采集指定的位置信息记录.ToByteValue(); @@ -48,5 +48,16 @@ namespace JT808.Protocol.MessageBody.CarDVR value.Count = reader.ReadUInt16(); return value; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_CarDVR_Down_0x09 value = new JT808_CarDVR_Down_0x09(); + value.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.StartTime.ToString("yyMMddHHmmss")}]开始时间", value.StartTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.EndTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.Count = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Count.ReadNumber()}]最大单位数据块个数", value.Count); + } } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x10.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x10.cs index ff6dd37..9a46241 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x10.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x10.cs @@ -15,7 +15,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// 返回:符合条件的事故疑点记录 /// 指定的时间范围内无数据记录,则本数据块数据为空 /// - public class JT808_CarDVR_Down_0x10 : JT808CarDVRDownBodies, IJT808MessagePackFormatter + public class JT808_CarDVR_Down_0x10 : JT808CarDVRDownBodies, IJT808MessagePackFormatter, IJT808Analyze { public override byte CommandId => JT808CarDVRCommandID.采集指定的事故疑点记录.ToByteValue(); @@ -48,5 +48,16 @@ namespace JT808.Protocol.MessageBody.CarDVR value.Count = reader.ReadUInt16(); return value; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_CarDVR_Down_0x10 value = new JT808_CarDVR_Down_0x10(); + value.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.StartTime.ToString("yyMMddHHmmss")}]开始时间", value.StartTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.EndTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.Count = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Count.ReadNumber()}]最大单位数据块个数", value.Count); + } } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x11.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x11.cs index 532cef6..344fc1f 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x11.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x11.cs @@ -14,7 +14,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// 采集指定的超时驾驶记录 /// 返回:符合条件的超时驾驶记录 /// - public class JT808_CarDVR_Down_0x11 : JT808CarDVRDownBodies, IJT808MessagePackFormatter + public class JT808_CarDVR_Down_0x11 : JT808CarDVRDownBodies, IJT808MessagePackFormatter, IJT808Analyze { public override byte CommandId => JT808CarDVRCommandID.采集指定的超时驾驶记录.ToByteValue(); @@ -47,5 +47,16 @@ namespace JT808.Protocol.MessageBody.CarDVR value.Count = reader.ReadUInt16(); return value; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_CarDVR_Down_0x11 value = new JT808_CarDVR_Down_0x11(); + value.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.StartTime.ToString("yyMMddHHmmss")}]开始时间", value.StartTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.EndTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.Count = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Count.ReadNumber()}]最大单位数据块个数", value.Count); + } } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x12.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x12.cs index a4af480..13e6003 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x12.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x12.cs @@ -14,7 +14,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// 采集指定的驾驶人身份记录 /// 返回:符合条件的驾驶人登录退出记录 /// - public class JT808_CarDVR_Down_0x12 : JT808CarDVRDownBodies, IJT808MessagePackFormatter + public class JT808_CarDVR_Down_0x12 : JT808CarDVRDownBodies, IJT808MessagePackFormatter, IJT808Analyze { public override byte CommandId => JT808CarDVRCommandID.采集指定的驾驶人身份记录.ToByteValue(); @@ -47,5 +47,16 @@ namespace JT808.Protocol.MessageBody.CarDVR value.Count = reader.ReadUInt16(); return value; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_CarDVR_Down_0x12 value = new JT808_CarDVR_Down_0x12(); + value.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.StartTime.ToString("yyMMddHHmmss")}]开始时间", value.StartTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.EndTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.Count = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Count.ReadNumber()}]最大单位数据块个数", value.Count); + } } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x13.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x13.cs index 70fd66c..6b5fa4b 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x13.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x13.cs @@ -14,7 +14,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// 采集指定的外部供电记录 /// 返回:符合条件的供电记录 /// - public class JT808_CarDVR_Down_0x13 : JT808CarDVRDownBodies, IJT808MessagePackFormatter + public class JT808_CarDVR_Down_0x13 : JT808CarDVRDownBodies, IJT808MessagePackFormatter, IJT808Analyze { public override byte CommandId => JT808CarDVRCommandID.采集指定的外部供电记录.ToByteValue(); @@ -47,5 +47,16 @@ namespace JT808.Protocol.MessageBody.CarDVR value.Count = reader.ReadUInt16(); return value; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_CarDVR_Down_0x13 value = new JT808_CarDVR_Down_0x13(); + value.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.StartTime.ToString("yyMMddHHmmss")}]开始时间", value.StartTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.EndTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.Count = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Count.ReadNumber()}]最大单位数据块个数", value.Count); + } } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x14.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x14.cs index 9730158..38746fd 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x14.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x14.cs @@ -14,7 +14,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// 采集指定的参数修改记录 /// 返回:符合条件的参数修改记录 /// - public class JT808_CarDVR_Down_0x14 : JT808CarDVRDownBodies, IJT808MessagePackFormatter + public class JT808_CarDVR_Down_0x14 : JT808CarDVRDownBodies, IJT808MessagePackFormatter, IJT808Analyze { public override byte CommandId => JT808CarDVRCommandID.采集指定的参数修改记录.ToByteValue(); @@ -47,5 +47,16 @@ namespace JT808.Protocol.MessageBody.CarDVR value.Count = reader.ReadUInt16(); return value; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_CarDVR_Down_0x14 value = new JT808_CarDVR_Down_0x14(); + value.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.StartTime.ToString("yyMMddHHmmss")}]开始时间", value.StartTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.EndTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.Count = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Count.ReadNumber()}]最大单位数据块个数", value.Count); + } } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x15.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x15.cs index 3118f1f..d957a1a 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x15.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x15.cs @@ -14,7 +14,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// 采集指定的速度状态日志 /// 返回:符合条件的速度状态日志 /// - public class JT808_CarDVR_Down_0x15 : JT808CarDVRDownBodies, IJT808MessagePackFormatter + public class JT808_CarDVR_Down_0x15 : JT808CarDVRDownBodies, IJT808MessagePackFormatter, IJT808Analyze { public override byte CommandId => JT808CarDVRCommandID.采集指定的速度状态日志.ToByteValue(); @@ -47,5 +47,16 @@ namespace JT808.Protocol.MessageBody.CarDVR value.Count = reader.ReadUInt16(); return value; } + + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_CarDVR_Down_0x15 value = new JT808_CarDVR_Down_0x15(); + value.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.StartTime.ToString("yyMMddHHmmss")}]开始时间", value.StartTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.EndTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.Count = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Count.ReadNumber()}]最大单位数据块个数", value.Count); + } } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x82.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x82.cs index 342d89c..b853d56 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x82.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x82.cs @@ -36,26 +36,37 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Down_0x82 value = new JT808_CarDVR_Down_0x82(); + var vinHex = reader.ReadVirtualArray(17); + value.Vin = reader.ReadASCII(17); + writer.WriteString($"[{vinHex.ToArray().ToHexString()}]车辆识别代号", value.Vin); + var vehicleNoHex = reader.ReadVirtualArray(12); + value.VehicleNo = reader.ReadString(12); + writer.WriteString($"[{vehicleNoHex.ToArray().ToHexString()}]机动车号牌号码", value.VehicleNo); + var vehicleTypeHex = reader.ReadVirtualArray(10); + value.VehicleType = reader.ReadString(10); + writer.WriteString($"[{vehicleTypeHex.ToArray().ToHexString()}]机动车号牌分类", value.VehicleType); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Down_0x82 value, IJT808Config config) { - writer.WriteASCII(value.Vin.PadRight(17, '0')); - writer.WriteASCII(value.VehicleNo.PadRight(9, '0')); - writer.Skip(3, out var reversed1); - writer.WriteString(value.VehicleType.PadRight(6, '0')); - writer.Skip(4, out var reversed2); + var currentPosition = writer.GetCurrentPosition(); + writer.WriteASCII(value.Vin); + writer.Skip(17 - (writer.GetCurrentPosition() - currentPosition), out var _); + currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.VehicleNo); + writer.Skip(12 - (writer.GetCurrentPosition() - currentPosition), out var _); + currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.VehicleType); + writer.Skip(10 - (writer.GetCurrentPosition() - currentPosition), out var _); } public JT808_CarDVR_Down_0x82 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_CarDVR_Down_0x82 value = new JT808_CarDVR_Down_0x82(); value.Vin = reader.ReadASCII(17); - value.VehicleNo = reader.ReadASCII(9); - reader.Skip(3); - value.VehicleType = reader.ReadString(6); - reader.Skip(4); + value.VehicleNo = reader.ReadString(12); + value.VehicleType = reader.ReadString(10); return value; } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x83.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x83.cs index 93e0754..f8283af 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x83.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x83.cs @@ -26,7 +26,9 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Down_0x83 value = new JT808_CarDVR_Down_0x83(); + value.RealTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.RealTime.ToString("yyMMddHHmmss")}]初次安装日期", value.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Down_0x83 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x84.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x84.cs index e63fb5d..b702617 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x84.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0x84.cs @@ -64,21 +64,65 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Down_0x84 value = new JT808_CarDVR_Down_0x84(); + value.RealTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.RealTime.ToString("yyMMddHHmmss")}]实时时间", value.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.SignalOperate = reader.ReadByte(); + writer.WriteNumber($"[{value.SignalOperate.ReadNumber()}]信号个数", value.SignalOperate); + var display = reader.ReadVirtualArray(10); + value.D0 = reader.ReadString(10); + writer.WriteString($"[{display.ToArray().ToHexString()}]D0", value.D0); + display = reader.ReadVirtualArray(10); + value.D1 = reader.ReadString(10); + writer.WriteString($"[{display.ToArray().ToHexString()}]D1", value.D1); + display = reader.ReadVirtualArray(10); + value.D2 = reader.ReadString(10); + writer.WriteString($"[{display.ToArray().ToHexString()}]D2", value.D2); + display = reader.ReadVirtualArray(10); + value.NearLight = reader.ReadString(10); + writer.WriteString($"[{display.ToArray().ToHexString()}]近光灯", value.NearLight); + display = reader.ReadVirtualArray(10); + value.FarLight = reader.ReadString(10); + writer.WriteString($"[{display.ToArray().ToHexString()}]远光灯", value.FarLight); + display = reader.ReadVirtualArray(10); + value.RightTurn = reader.ReadString(10); + writer.WriteString($"[{display.ToArray().ToHexString()}]右转向", value.RightTurn); + display = reader.ReadVirtualArray(10); + value.LeftTurn = reader.ReadString(10); + writer.WriteString($"[{display.ToArray().ToHexString()}]左转向", value.LeftTurn); + display = reader.ReadVirtualArray(10); + value.Brake = reader.ReadString(10); + writer.WriteString($"[{display.ToArray().ToHexString()}]制动", value.Brake); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Down_0x84 value, IJT808Config config) { writer.WriteDateTime6(value.RealTime); writer.WriteByte(value.SignalOperate); - writer.WriteASCII(value.D0.PadRight(0)); - writer.WriteASCII(value.D1.PadRight(0)); - writer.WriteASCII(value.D2.PadRight(0)); - writer.WriteASCII(value.NearLight.PadRight(0)); - writer.WriteASCII(value.FarLight.PadRight(0)); - writer.WriteASCII(value.RightTurn.PadRight(0)); - writer.WriteASCII(value.LeftTurn.PadRight(0)); - writer.WriteASCII(value.Brake.PadRight(0)); + var currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.D0); + writer.Skip(10 - (writer.GetCurrentPosition() - currentPosition), out var _); + currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.D1); + writer.Skip(10 - (writer.GetCurrentPosition() - currentPosition), out var _); + currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.D2); + writer.Skip(10 - (writer.GetCurrentPosition() - currentPosition), out var _); + currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.NearLight); + writer.Skip(10 - (writer.GetCurrentPosition() - currentPosition), out var _); + currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.FarLight); + writer.Skip(10 - (writer.GetCurrentPosition() - currentPosition), out var _); + currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.RightTurn); + writer.Skip(10 - (writer.GetCurrentPosition() - currentPosition), out var _); + currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.LeftTurn); + writer.Skip(10 - (writer.GetCurrentPosition() - currentPosition), out var _); + currentPosition = writer.GetCurrentPosition(); + writer.WriteString(value.Brake); + writer.Skip(10 - (writer.GetCurrentPosition() - currentPosition), out var _); } public JT808_CarDVR_Down_0x84 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) @@ -86,14 +130,14 @@ namespace JT808.Protocol.MessageBody.CarDVR JT808_CarDVR_Down_0x84 value = new JT808_CarDVR_Down_0x84(); value.RealTime = reader.ReadDateTime6(); value.SignalOperate = reader.ReadByte(); - value.D0 = reader.ReadASCII(10); - value.D1 = reader.ReadASCII(10); - value.D2 = reader.ReadASCII(10); - value.NearLight = reader.ReadASCII(10); - value.FarLight = reader.ReadASCII(10); - value.RightTurn = reader.ReadASCII(10); - value.LeftTurn = reader.ReadASCII(10); - value.Brake = reader.ReadASCII(10); + value.D0 = reader.ReadString(10); + value.D1 = reader.ReadString(10); + value.D2 = reader.ReadString(10); + value.NearLight = reader.ReadString(10); + value.FarLight = reader.ReadString(10); + value.RightTurn = reader.ReadString(10); + value.LeftTurn = reader.ReadString(10); + value.Brake = reader.ReadString(10); return value; } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC2.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC2.cs index c191769..5c71a0a 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC2.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC2.cs @@ -26,7 +26,9 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Down_0xC2 value = new JT808_CarDVR_Down_0xC2(); + value.RealTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.RealTime.ToString("yyMMddHHmmss")}]实时时间", value.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC3.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC3.cs index cb6a1d9..4f018ab 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC3.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC3.cs @@ -23,17 +23,18 @@ namespace JT808.Protocol.MessageBody.CarDVR /// public DateTime RealTime { get; set; } /// - /// 脉冲系数高字节 + /// 脉冲系数 /// - public byte PulseCoefficientHighByte { get; set; } - /// - /// 仪脉冲系数低字节 - /// - public byte PulseCoefficientLowByte { get; set; } + public ushort PulseCoefficient { get; set; } public override string Description => "记录仪脉冲系数"; public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { + JT808_CarDVR_Down_0xC3 value = new JT808_CarDVR_Down_0xC3(); + value.RealTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.RealTime.ToString("yyMMddHHmmss")}]当前时间", value.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.PulseCoefficient = reader.ReadUInt16(); + writer.WriteNumber($"[{value.PulseCoefficient.ReadNumber()}]脉冲系数", value.PulseCoefficient); } @@ -41,16 +42,14 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Down_0xC3 value, IJT808Config config) { writer.WriteDateTime6(value.RealTime); - writer.WriteByte(value.PulseCoefficientHighByte); - writer.WriteByte(value.PulseCoefficientLowByte); + writer.WriteUInt16(value.PulseCoefficient); } public JT808_CarDVR_Down_0xC3 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_CarDVR_Down_0xC3 value = new JT808_CarDVR_Down_0xC3(); value.RealTime = reader.ReadDateTime6(); - value.PulseCoefficientHighByte = reader.ReadByte(); - value.PulseCoefficientLowByte = reader.ReadByte(); + value.PulseCoefficient = reader.ReadUInt16(); return value; } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC4.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC4.cs index fdb6439..3feeb1a 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC4.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xC4.cs @@ -38,7 +38,15 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Down_0xC4 value = new JT808_CarDVR_Down_0xC4(); + value.RealTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.RealTime.ToString("yyMMddHHmmss")}]当前时间", value.RealTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.FirstInstallTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.FirstInstallTime.ToString("yyMMddHHmmss")}]初次安装时间", value.FirstInstallTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.FirstMileage = reader.ReadBCD(8); + writer.WriteString($"[{value.FirstMileage}]初始里程", value.FirstMileage); + value.TotalMilage = reader.ReadBCD(8); + writer.WriteString($"[{value.TotalMilage}]累计里程", value.TotalMilage); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Down_0xC4 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xE1.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xE1.cs index cc1bd17..287d29c 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xE1.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Down_0xE1.cs @@ -43,12 +43,25 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Down_0xE1 value = new JT808_CarDVR_Down_0xE1(); + var hex = reader.ReadVirtualArray(35); + value.UniqueNumber = reader.ReadASCII(35); + writer.WriteString($"[{hex.ToArray().ToHexString()}]记录仪唯一性编号", value.UniqueNumber); + value.PulseCoefficient = reader.ReadUInt16(); + writer.WriteNumber($"[{value.PulseCoefficient.ReadNumber()}]脉冲系数", value.PulseCoefficient); + value.Speed = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Speed.ReadNumber()}]当前速度", value.Speed); + value.TotalMileage = reader.ReadUInt32(); + writer.WriteNumber($"[{value.TotalMileage.ReadNumber()}]累计里程", value.TotalMileage); + value.StatusSignal = reader.ReadByte(); + writer.WriteNumber($"[{value.StatusSignal.ReadNumber()}]状态信号", value.StatusSignal); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Down_0xE1 value, IJT808Config config) { - writer.WriteASCII(value.UniqueNumber.PadRight(35, '0')); + var currentPosition = writer.GetCurrentPosition(); + writer.WriteASCII(value.UniqueNumber); + writer.Skip(35 - (writer.GetCurrentPosition() - currentPosition), out var _); writer.WriteUInt16(value.PulseCoefficient); writer.WriteUInt16(value.Speed); writer.WriteUInt32(value.TotalMileage); diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x00.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x00.cs index 7df4678..307f67b 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x00.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x00.cs @@ -32,7 +32,11 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x00 value = new JT808_CarDVR_Up_0x00(); + value.StandardYear = reader.ReadBCD(2); + writer.WriteString($"[{value.StandardYear}]记录仪执行标准年号", value.StandardYear); + value.ModifyNumber = reader.ReadByte(); + writer.WriteNumber($"[{value.ModifyNumber.ReadNumber()}]修改单号", value.ModifyNumber); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x00 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x01.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x01.cs index fbc47de..ea48799 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x01.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x01.cs @@ -27,7 +27,10 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x01 value = new JT808_CarDVR_Up_0x01(); + var hex = reader.ReadVirtualArray(18); + value.DriverLicenseNo = reader.ReadASCII(18); + writer.WriteString($"[{hex.ToArray().ToHexString()}]当前驾驶人的机动车驾驶证号码", value.DriverLicenseNo); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x01 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x02.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x02.cs index 9f28e5d..c83c36a 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x02.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x02.cs @@ -26,7 +26,10 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x02 value = new JT808_CarDVR_Up_0x02(); + var hex = reader.ReadVirtualArray(6); + value.RealTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]实时时间", value.RealTime); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x02 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x03.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x03.cs index 1d997f4..fbbed3a 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x03.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x03.cs @@ -38,7 +38,19 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x03 value = new JT808_CarDVR_Up_0x03(); + var hex = reader.ReadVirtualArray(6); + value.RealTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]实时时间", value.RealTime); + hex = reader.ReadVirtualArray(6); + value.FirstInstallTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]初次安装时间", value.RealTime); + hex = reader.ReadVirtualArray(4); + value.FirstMileage = reader.ReadBCD(8); + writer.WriteString($"[{hex.ToArray().ToHexString()}]初始里程", value.FirstMileage); + hex = reader.ReadVirtualArray(4); + value.TotalMilage = reader.ReadBCD(8); + writer.WriteString($"[{hex.ToArray().ToHexString()}]累计里程", value.TotalMilage); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x03 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x04.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x04.cs index 020e395..2df78dc 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x04.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x04.cs @@ -23,7 +23,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// public DateTime RealTime { get; set; } /// - /// 脉冲系数高字节 + /// 脉冲系数 /// public ushort PulseCoefficient { get; set; } @@ -31,7 +31,12 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x04 value = new JT808_CarDVR_Up_0x04(); + var hex = reader.ReadVirtualArray(6); + value.RealTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]当前时间", value.RealTime); + value.PulseCoefficient = reader.ReadUInt16(); + writer.WriteNumber($"[{value.PulseCoefficient.ReadNumber()}]脉冲系数",value.PulseCoefficient); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x04 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x05.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x05.cs index 28a7518..b1abb38 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x05.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x05.cs @@ -36,7 +36,16 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x05 value = new JT808_CarDVR_Up_0x05(); + var hex = reader.ReadVirtualArray(17); + value.Vin = reader.ReadASCII(17); + writer.WriteString($"[{hex.ToArray().ToHexString()}]车辆识别代号", value.Vin); + hex = reader.ReadVirtualArray(12); + value.VehicleNo = reader.ReadString(12); + writer.WriteString($"[{hex.ToArray().ToHexString()}]机动车号牌号码", value.VehicleNo); + hex = reader.ReadVirtualArray(10); + value.VehicleType = reader.ReadString(10); + writer.WriteString($"[{hex.ToArray().ToHexString()}]机动车号牌分类", value.VehicleType); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x05 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x06.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x06.cs index 35424be..2f00c90 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x06.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x06.cs @@ -65,7 +65,36 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x06 value = new JT808_CarDVR_Up_0x06(); + var hex = reader.ReadVirtualArray(6); + value.RealTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]实时时间", value.RealTime); + value.SignalOperate = reader.ReadByte(); + writer.WriteNumber($"[{value.SignalOperate.ReadNumber()}]信号个数", value.SignalOperate) ; + hex = reader.ReadVirtualArray(10); + value.D0 = reader.ReadString(10); + writer.WriteString($"[{hex.ToArray().ToHexString()}]D0", value.D0); + hex = reader.ReadVirtualArray(10); + value.D1 = reader.ReadString(10); + writer.WriteString($"[{hex.ToArray().ToHexString()}]D1", value.D1); + hex = reader.ReadVirtualArray(10); + value.D2 = reader.ReadString(10); + writer.WriteString($"[{hex.ToArray().ToHexString()}]D2", value.D2); + hex = reader.ReadVirtualArray(10); + value.NearLight = reader.ReadString(10); + writer.WriteString($"[{hex.ToArray().ToHexString()}]近光灯", value.NearLight); + hex = reader.ReadVirtualArray(10); + value.FarLight = reader.ReadString(10); + writer.WriteString($"[{hex.ToArray().ToHexString()}]远光灯", value.FarLight); + hex = reader.ReadVirtualArray(10); + value.RightTurn = reader.ReadString(10); + writer.WriteString($"[{hex.ToArray().ToHexString()}]右转向", value.RightTurn); + hex = reader.ReadVirtualArray(10); + value.LeftTurn = reader.ReadString(10); + writer.WriteString($"[{hex.ToArray().ToHexString()}]左转向", value.LeftTurn); + hex = reader.ReadVirtualArray(10); + value.Brake = reader.ReadString(10); + writer.WriteString($"[{hex.ToArray().ToHexString()}]制动", value.Brake); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x06 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x07.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x07.cs index 35983f6..dfc17ba 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x07.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x07.cs @@ -42,7 +42,22 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x07 value = new JT808_CarDVR_Up_0x07(); + var hex = reader.ReadVirtualArray(7); + value.ProductionPlantCCCCertificationCode = reader.ReadASCII(7); + writer.WriteString($"[{hex.ToArray().ToHexString()}]生产厂 CCC 认证代码", value.ProductionPlantCCCCertificationCode); + hex = reader.ReadVirtualArray(16); + value.CertifiedProductModels = reader.ReadASCII(16); + writer.WriteString($"[{hex.ToArray().ToHexString()}]认证产品型号", value.CertifiedProductModels); + hex = reader.ReadVirtualArray(3); + value.ProductionDate = reader.ReadDateTime3(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]生产日期", value.ProductionDate); + hex = reader.ReadVirtualArray(4); + value.ProductProductionFlowNumber = reader.ReadString(4); + writer.WriteString($"[{hex.ToArray().ToHexString()}]产品生产流水号", value.ProductProductionFlowNumber); + hex = reader.ReadVirtualArray(5); + value.Reversed = reader.ReadString(5); + writer.WriteString($"[{hex.ToArray().ToHexString()}]备用", value.Reversed); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x07 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x08.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x08.cs index c9f3b9b..74db22c 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x08.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x08.cs @@ -27,7 +27,32 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { + JT808_CarDVR_Up_0x08 value = new JT808_CarDVR_Up_0x08(); + writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); + var count = (reader.ReadCurrentRemainContentLength() - 1) / 126;//记录块个数, -1 去掉校验位 + for (int i = 0; i < count; i++) + { + JT808_CarDVR_Up_0x08_SpeedPerMinute jT808_CarDVR_Up_0X08_SpeedPerMinute = new JT808_CarDVR_Up_0x08_SpeedPerMinute(); + writer.WriteStartObject(); + writer.WriteStartObject($"第{i+1}分钟行驶速度记录数据块格式"); + var hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0X08_SpeedPerMinute.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]开始时间", jT808_CarDVR_Up_0X08_SpeedPerMinute.StartTime); + for (int j = 0; j < 60; j++)//60秒 + { + JT808_CarDVR_Up_0x08_SpeedPerSecond jT808_CarDVR_Up_0X08_SpeedPerSecond = new JT808_CarDVR_Up_0x08_SpeedPerSecond(); + writer.WriteStartObject($"开始时间之后第{j+1}秒钟的平均速度和状态信号"); + jT808_CarDVR_Up_0X08_SpeedPerSecond.AvgSpeedAfterStartTime = reader.ReadByte(); + writer.WriteNumber($"[{jT808_CarDVR_Up_0X08_SpeedPerSecond.AvgSpeedAfterStartTime.ReadNumber()}]平均速度", jT808_CarDVR_Up_0X08_SpeedPerSecond.AvgSpeedAfterStartTime); + jT808_CarDVR_Up_0X08_SpeedPerSecond.StatusSignalAfterStartTime = reader.ReadByte(); + writer.WriteNumber($"[{jT808_CarDVR_Up_0X08_SpeedPerSecond.StatusSignalAfterStartTime.ReadNumber()}]状态信号", jT808_CarDVR_Up_0X08_SpeedPerSecond.StatusSignalAfterStartTime); + writer.WriteEndObject(); + } + writer.WriteEndObject(); + writer.WriteEndObject(); + } + writer.WriteEndArray(); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x08 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x09.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x09.cs index ff3fe44..976c93c 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x09.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x09.cs @@ -27,7 +27,35 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x09 value = new JT808_CarDVR_Up_0x09(); + writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); + var count = (reader.ReadCurrentRemainContentLength() - 1) / 666;//记录块个数, -1 去掉校验位 + for (int i = 0; i < count; i++) + { + JT808_CarDVR_Up_0x09_PositionPerHour jT808_CarDVR_Up_0x09_PositionPerHour = new JT808_CarDVR_Up_0x09_PositionPerHour(); + writer.WriteStartObject(); + writer.WriteStartObject($"指定的结束时间之前最近的第{i+1}小时的位置信息记录"); + var hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0x09_PositionPerHour.StartTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]开始时间", jT808_CarDVR_Up_0x09_PositionPerHour.StartTime); + for (int j = 0; j < 60; j++)//60钟 + { + JT808_CarDVR_Up_0x09_PositionPerMinute jT808_CarDVR_Up_0X09_PositionPerMinute = new JT808_CarDVR_Up_0x09_PositionPerMinute(); + writer.WriteStartObject($"开始时间之后第{j+1}分钟的平均速度和位置信息"); + jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLng = reader.ReadInt32(); + writer.WriteNumber($"[{jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLng.ReadNumber()}]经度", jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLng); + jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLat = reader.ReadInt32(); + writer.WriteNumber($"[{jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLat.ReadNumber()}]纬度", jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLat); + jT808_CarDVR_Up_0X09_PositionPerMinute.Height = reader.ReadInt16(); + writer.WriteNumber($"[{jT808_CarDVR_Up_0X09_PositionPerMinute.Height.ReadNumber()}]高度", jT808_CarDVR_Up_0X09_PositionPerMinute.Height); + jT808_CarDVR_Up_0X09_PositionPerMinute.AvgSpeedAfterStartTime = reader.ReadByte(); + writer.WriteNumber($"[{jT808_CarDVR_Up_0X09_PositionPerMinute.AvgSpeedAfterStartTime.ReadNumber()}]平均速度", jT808_CarDVR_Up_0X09_PositionPerMinute.AvgSpeedAfterStartTime); + writer.WriteEndObject(); + } + writer.WriteEndObject(); + writer.WriteEndObject(); + } + writer.WriteEndArray(); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x09 value, IJT808Config config) { diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x10.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x10.cs index fcd3db7..cc7c793 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x10.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x10.cs @@ -28,7 +28,46 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x10 value = new JT808_CarDVR_Up_0x10(); + writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); + var count = (reader.ReadCurrentRemainContentLength() - 1) / 234;//记录块个数, -1 去掉校验位 + for (int i = 0; i < count; i++) + { + JT808_CarDVR_Up_0x10_AccidentSuspectin jT808_CarDVR_Up_0x10_AccidentSuspectin = new JT808_CarDVR_Up_0x10_AccidentSuspectin(); + writer.WriteStartObject(); + writer.WriteStartObject($"指定的结束时间之前最近的第{i+1}条事故疑点记录"); + var hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0x10_AccidentSuspectin.EndTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]行驶结束时间", jT808_CarDVR_Up_0x10_AccidentSuspectin.EndTime); + hex = reader.ReadVirtualArray(18); + jT808_CarDVR_Up_0x10_AccidentSuspectin.DriverLicenseNo = reader.ReadASCII(18); + writer.WriteString($"[{hex.ToArray().ToHexString()}]机动车驾驶证号码", jT808_CarDVR_Up_0x10_AccidentSuspectin.DriverLicenseNo); + for (int j = 0; j < 100; j++)//100组 + { + JT808_CarDVR_Up_0x10_DrivingStatus jT808_CarDVR_Up_0X10_DrivingStatus = new JT808_CarDVR_Up_0x10_DrivingStatus(); + if (j == 0) + { + writer.WriteStartObject("行驶结束时的速度"); + } + else { + writer.WriteStartObject($"行驶结束时间前 { (j * 0.2).ToString("F1")} 秒时的速度"); + } + jT808_CarDVR_Up_0X10_DrivingStatus.Speed = reader.ReadByte(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0X10_DrivingStatus.Speed.ReadNumber()}]速度", jT808_CarDVR_Up_0X10_DrivingStatus.Speed); + jT808_CarDVR_Up_0X10_DrivingStatus.StatusSignal = reader.ReadByte(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0X10_DrivingStatus.StatusSignal.ReadNumber()}]状态信号", jT808_CarDVR_Up_0X10_DrivingStatus.StatusSignal); + writer.WriteEndObject(); + } + jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLng = reader.ReadInt32(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLng.ReadNumber()}]经度", jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLng); + jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLat = reader.ReadInt32(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLat.ReadNumber()}]纬度", jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLat); + jT808_CarDVR_Up_0x10_AccidentSuspectin.Height = reader.ReadInt16(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0x10_AccidentSuspectin.Height.ReadNumber()}]高度", jT808_CarDVR_Up_0x10_AccidentSuspectin.Height); + writer.WriteEndObject(); + writer.WriteEndObject(); + } + writer.WriteEndArray(); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x10 value, IJT808Config config) @@ -41,10 +80,10 @@ namespace JT808.Protocol.MessageBody.CarDVR writer.Skip(18 - (writer.GetCurrentPosition() - currentPosition), out var _); for (int i = 0; i < 100; i++) { - if (i < accidentSuspectin.JT808_CarDVR_Up_0x09_DrivingStatuss.Count) + if (i < accidentSuspectin.JT808_CarDVR_Up_0x10_DrivingStatuss.Count) { - writer.WriteByte(accidentSuspectin.JT808_CarDVR_Up_0x09_DrivingStatuss[i].Speed); - writer.WriteByte(accidentSuspectin.JT808_CarDVR_Up_0x09_DrivingStatuss[i].StatusSignal); + writer.WriteByte(accidentSuspectin.JT808_CarDVR_Up_0x10_DrivingStatuss[i].Speed); + writer.WriteByte(accidentSuspectin.JT808_CarDVR_Up_0x10_DrivingStatuss[i].StatusSignal); } else { @@ -68,10 +107,10 @@ namespace JT808.Protocol.MessageBody.CarDVR JT808_CarDVR_Up_0x10_AccidentSuspectin jT808_CarDVR_Up_0x10_AccidentSuspectin = new JT808_CarDVR_Up_0x10_AccidentSuspectin(); jT808_CarDVR_Up_0x10_AccidentSuspectin.EndTime = reader.ReadDateTime6(); jT808_CarDVR_Up_0x10_AccidentSuspectin.DriverLicenseNo = reader.ReadASCII(18); - jT808_CarDVR_Up_0x10_AccidentSuspectin.JT808_CarDVR_Up_0x09_DrivingStatuss = new List(); + jT808_CarDVR_Up_0x10_AccidentSuspectin.JT808_CarDVR_Up_0x10_DrivingStatuss = new List(); for (int j = 0; j < 100; j++)//100组 { - jT808_CarDVR_Up_0x10_AccidentSuspectin.JT808_CarDVR_Up_0x09_DrivingStatuss.Add(new JT808_CarDVR_Up_0x10_DrivingStatus + jT808_CarDVR_Up_0x10_AccidentSuspectin.JT808_CarDVR_Up_0x10_DrivingStatuss.Add(new JT808_CarDVR_Up_0x10_DrivingStatus { Speed = reader.ReadByte(), StatusSignal = reader.ReadByte() @@ -103,7 +142,7 @@ namespace JT808.Protocol.MessageBody.CarDVR /// /// 每 0.2s 间隔采集 1 次,共 100组 20s 的事故疑点记录,按时间倒序排列 /// - public List JT808_CarDVR_Up_0x09_DrivingStatuss { get; set; } + public List JT808_CarDVR_Up_0x10_DrivingStatuss { get; set; } /// /// 经度 /// diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x11.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x11.cs index 627ae55..89d1c86 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x11.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x11.cs @@ -26,21 +26,59 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x11 value = new JT808_CarDVR_Up_0x11(); + writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); + var count = (reader.ReadCurrentRemainContentLength() - 1) / 50;//记录块个数, -1 去掉校验位 + for (int i = 0; i < count; i++) + { + JT808_CarDVR_Up_0x11_DriveOverTime jT808_CarDVR_Up_0x11_DriveOverTime = new JT808_CarDVR_Up_0x11_DriveOverTime(); + writer.WriteStartObject(); + writer.WriteStartObject($"指定的结束时间前最近的第 {i+1}条超时驾驶记录"); + var hex = reader.ReadVirtualArray(18); + jT808_CarDVR_Up_0x11_DriveOverTime.DriverLicenseNo = reader.ReadASCII(18); + writer.WriteString($"[{hex.ToArray().ToHexString()}机动车驾驶证号码]", jT808_CarDVR_Up_0x11_DriveOverTime.DriverLicenseNo); + hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingStartTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}连续驾驶开始时间]", jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingStartTime); + hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingEndTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}连续驾驶结束时间]", jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingEndTime); + writer.WriteStartObject("连续驾驶开始时间所在的最近一次有效位置信息"); + jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLng = reader.ReadInt32(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLng.ReadNumber()}]经度", jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLng); + jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLat = reader.ReadInt32(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLat.ReadNumber()}纬度", jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLat); + jT808_CarDVR_Up_0x11_DriveOverTime.StartHeight = reader.ReadInt16(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.StartHeight.ReadNumber()}]高度", jT808_CarDVR_Up_0x11_DriveOverTime.StartHeight); + writer.WriteEndObject(); + writer.WriteStartObject("连续驾驶结束时间所在的最近一次有效位置信息"); + jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLng = reader.ReadInt32(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLng.ReadNumber()}]经度", jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLng); + jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLat = reader.ReadInt32(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLat.ReadNumber()}]纬度", jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLat); + jT808_CarDVR_Up_0x11_DriveOverTime.EndHeight = reader.ReadInt16(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.EndHeight.ReadNumber()}]高度", jT808_CarDVR_Up_0x11_DriveOverTime.EndHeight); + writer.WriteEndObject(); + writer.WriteEndObject(); + writer.WriteEndObject(); + } + writer.WriteEndArray(); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x11 value, IJT808Config config) { foreach (var driveOverTime in value.JT808_CarDVR_Up_0x11_DriveOverTimes) { - writer.WriteASCII(driveOverTime.DriverLicenseNo.PadRight(18, '0')); + var currentPosition = writer.GetCurrentPosition(); + writer.WriteASCII(driveOverTime.DriverLicenseNo); + writer.Skip(18 - (writer.GetCurrentPosition() - currentPosition), out var _); writer.WriteDateTime6(driveOverTime.ContinueDrivingStartTime); writer.WriteDateTime6(driveOverTime.ContinueDrivingEndTime); writer.WriteInt32(driveOverTime.GpsStartLng); writer.WriteInt32(driveOverTime.GpsStartLat); writer.WriteInt16(driveOverTime.StartHeight); writer.WriteInt32(driveOverTime.GpsEndLng); - writer.WriteInt32(driveOverTime.GpsStartLat); + writer.WriteInt32(driveOverTime.GpsEndLat); writer.WriteInt16(driveOverTime.EndHeight); } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x12.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x12.cs index 0e6dda1..666f2cd 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x12.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x12.cs @@ -26,7 +26,39 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x12 value = new JT808_CarDVR_Up_0x12(); + writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); + var count = (reader.ReadCurrentRemainContentLength() - 1) / 25;//记录块个数, -1 去掉校验位 + for (int i = 0; i < count; i++) + { + JT808_CarDVR_Up_0x12_DriveLogin jT808_CarDVR_Up_0x12_DriveLogin = new JT808_CarDVR_Up_0x12_DriveLogin(); + writer.WriteStartObject(); + writer.WriteStartObject($"指定的结束时间之前最近的第 {i+1}条驾驶人登录退出记录"); + var hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0x12_DriveLogin.LoginTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]登录/登出发生时间", jT808_CarDVR_Up_0x12_DriveLogin.LoginTime); + hex = reader.ReadVirtualArray(18); + jT808_CarDVR_Up_0x12_DriveLogin.DriverLicenseNo = reader.ReadASCII(18); + writer.WriteString($"[{hex.ToArray().ToHexString()}]机动车驾驶证号码", jT808_CarDVR_Up_0x12_DriveLogin.DriverLicenseNo); + jT808_CarDVR_Up_0x12_DriveLogin.LoginType = reader.ReadByte(); + writer.WriteString($"[{ jT808_CarDVR_Up_0x12_DriveLogin.LoginType.ReadNumber()}]登录/登出事件", LoginTypeDisplay(jT808_CarDVR_Up_0x12_DriveLogin.LoginType)); + writer.WriteEndObject(); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + string LoginTypeDisplay(byte loginType){ + if (loginType == 1) + { + return "登录"; + } + else if(loginType == 2) + { + return "退出"; + } + else { + return "保留"; + } + } } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x12 value, IJT808Config config) @@ -34,7 +66,9 @@ namespace JT808.Protocol.MessageBody.CarDVR foreach (var driveLogin in value.JT808_CarDVR_Up_0x12_DriveLogins) { writer.WriteDateTime6(driveLogin.LoginTime); - writer.WriteASCII(driveLogin.DriverLicenseNo.PadRight(18, '0')); + var currentPosition = writer.GetCurrentPosition(); + writer.WriteASCII(driveLogin.DriverLicenseNo); + writer.Skip(18 - (writer.GetCurrentPosition() - currentPosition), out var _); writer.WriteByte(driveLogin.LoginType); } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x13.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x13.cs index 61405b7..55404ca 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x13.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x13.cs @@ -26,7 +26,32 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x13 value = new JT808_CarDVR_Up_0x13(); + writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); + var count = (reader.ReadCurrentRemainContentLength() - 1) / 7;//记录块个数, -1 去掉校验位 + for (int i = 0; i < count; i++) + { + JT808_CarDVR_Up_0x13_ExternalPowerSupply jT808_CarDVR_Up_0x13_ExternalPowerSupply = new JT808_CarDVR_Up_0x13_ExternalPowerSupply(); + writer.WriteStartObject(); + writer.WriteStartObject($"从指定的结束时间之前最近的第{i+1}条外部电源记录"); + var hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0x13_ExternalPowerSupply.EventTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]事件发生时间", jT808_CarDVR_Up_0x13_ExternalPowerSupply.EventTime); + jT808_CarDVR_Up_0x13_ExternalPowerSupply.EventType = reader.ReadByte(); + writer.WriteString($"[{ jT808_CarDVR_Up_0x13_ExternalPowerSupply.EventType.ReadNumber()}]事件类型", EventTypeDisplay(jT808_CarDVR_Up_0x13_ExternalPowerSupply.EventType)); + writer.WriteEndObject(); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + string EventTypeDisplay(byte eventType) { + if (eventType == 1) + { + return "供电"; + } + else { + return "断电"; + } + } } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x13 value, IJT808Config config) { diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x14.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x14.cs index 5828463..700d0ae 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x14.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x14.cs @@ -26,7 +26,23 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x14 value = new JT808_CarDVR_Up_0x14(); + writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); + var count = (reader.ReadCurrentRemainContentLength() - 1) / 7;//记录块个数, -1 去掉校验位 + for (int i = 0; i < count; i++) + { + JT808_CarDVR_Up_0x14_ParameterModify jT808_CarDVR_Up_0x14_ParameterModify = new JT808_CarDVR_Up_0x14_ParameterModify(); + writer.WriteStartObject(); + writer.WriteStartObject($"指定的结束时间之前最近的第{i+1}条参数修改记录"); + var hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0x14_ParameterModify.EventTime = reader.ReadDateTime6(); + writer.WriteString($"[{hex.ToArray().ToHexString()}]事件发生时间", jT808_CarDVR_Up_0x14_ParameterModify.EventTime); + jT808_CarDVR_Up_0x14_ParameterModify.EventType = reader.ReadByte(); + writer.WriteString($"[{ jT808_CarDVR_Up_0x14_ParameterModify.EventType.ReadNumber()}]事件类型", ((JT808CarDVRCommandID)jT808_CarDVR_Up_0x14_ParameterModify.EventType).ToString()); + writer.WriteEndObject(); + writer.WriteEndObject(); + } + writer.WriteEndArray(); } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x14 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x15.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x15.cs index 85cd66e..638286d 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x15.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0x15.cs @@ -26,7 +26,61 @@ namespace JT808.Protocol.MessageBody.CarDVR public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - + JT808_CarDVR_Up_0x15 value = new JT808_CarDVR_Up_0x15(); + writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); + var count = (reader.ReadCurrentRemainContentLength() - 1) / 133;//记录块个数, -1 去掉校验位 + for (int i = 0; i < count; i++) + { + JT808_CarDVR_Up_0x15_SpeedStatusLog jT808_CarDVR_Up_0x15_SpeedStatusLog = new JT808_CarDVR_Up_0x15_SpeedStatusLog(); + writer.WriteStartObject(); + writer.WriteStartObject($"指定的结束时间之前最近的第{i+1} 条速度状态日志"); + jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatus = reader.ReadByte(); + writer.WriteString($"[{ jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatus.ReadNumber()}]速度状态", SpeedStatusDisplay(jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatus)); + var hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusStartTime = reader.ReadDateTime6(); + writer.WriteString($"[{ hex.ToArray().ToHexString()}]速度状态判定的开始时间", jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusStartTime); + hex = reader.ReadVirtualArray(6); + jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusEndTime = reader.ReadDateTime6(); + writer.WriteString($"[{ hex.ToArray().ToHexString()}]速度状态判定的结束时间", jT808_CarDVR_Up_0x15_SpeedStatusLog.SpeedStatusEndTime); + writer.WriteStartArray("前60s速度状态日志"); + for (int j = 0; j < 60; j++)//60组 + { + writer.WriteStartObject(); + JT808_CarDVR_Up_0x15_SpeedPerSecond jT808_CarDVR_Up_0X15_SpeedPerSecond = new JT808_CarDVR_Up_0x15_SpeedPerSecond(); + if (j == 0) + { + jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed = reader.ReadByte(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed.ReadNumber()}]开始时间对应的记录速度", jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed); + jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed = reader.ReadByte(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed.ReadNumber()}]开始时间对应的参考速度", jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed); + } + else + { + jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed = reader.ReadByte(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed.ReadNumber()}]开始时间后第{j}秒对应的记录速度", jT808_CarDVR_Up_0X15_SpeedPerSecond.RecordSpeed); + jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed = reader.ReadByte(); + writer.WriteNumber($"[{ jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed.ReadNumber()}]开始时间后第{j}秒对应的参考速度", jT808_CarDVR_Up_0X15_SpeedPerSecond.ReferenceSpeed); + } + writer.WriteEndObject(); + } + writer.WriteEndArray(); + writer.WriteEndObject(); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + string SpeedStatusDisplay(byte speedStatus) { + if (speedStatus == 0x01) + { + return "正常"; + } + else if (speedStatus == 0x02) + { + return "异常"; + } + else { + return "未知"; + } + } } public void Serialize(ref JT808MessagePackWriter writer, JT808_CarDVR_Up_0x15 value, IJT808Config config) @@ -36,10 +90,17 @@ namespace JT808.Protocol.MessageBody.CarDVR writer.WriteByte(speedStatusLog.SpeedStatus); writer.WriteDateTime6(speedStatusLog.SpeedStatusStartTime); writer.WriteDateTime6(speedStatusLog.SpeedStatusEndTime); - foreach (var speedPerSecond in speedStatusLog.JT808_CarDVR_Up_0x15_SpeedPerSeconds) + for (int i = 0; i < 60; i++) { - writer.WriteByte(speedPerSecond.RecordSpeed); - writer.WriteByte(speedPerSecond.ReferenceSpeed); + if (i < speedStatusLog.JT808_CarDVR_Up_0x15_SpeedPerSeconds.Count) + { + writer.WriteByte(speedStatusLog.JT808_CarDVR_Up_0x15_SpeedPerSeconds[i].RecordSpeed); + writer.WriteByte(speedStatusLog.JT808_CarDVR_Up_0x15_SpeedPerSeconds[i].ReferenceSpeed); + } + else { + writer.WriteByte(0xFF); + writer.WriteByte(0xFF); + } } } } diff --git a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0xE3.cs b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0xE3.cs index da10a00..fd991d6 100644 --- a/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0xE3.cs +++ b/src/JT808.Protocol/MessageBody/CarDVR/JT808_CarDVR_Up_0xE3.cs @@ -20,5 +20,6 @@ namespace JT808.Protocol.MessageBody.CarDVR public override byte CommandId => JT808CarDVRCommandID.进入实时时间误差测量.ToByteValue(); public override string Description => "通过 DB9 的 7 脚输出实时时钟的秒脉冲信号(TTL 电平)"; + public override bool SkipSerialization { get; set; } = true; } } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0107.cs b/src/JT808.Protocol/MessageBody/JT808_0x0107.cs index 4b2b5dc..891c003 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0107.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0107.cs @@ -180,7 +180,7 @@ namespace JT808.Protocol.MessageBody jT808_0X0107.TerminalId = reader.ReadString(7); writer.WriteString($"[{terminalIdSpan.ToArray().ToHexString()}]终端ID", jT808_0X0107.TerminalId); } - ReadOnlySpan iccidSpan = reader.ReadVirtualArray(20); + ReadOnlySpan iccidSpan = reader.ReadVirtualArray(10); jT808_0X0107.Terminal_SIM_ICCID = reader.ReadBCD(20, config.Trim); writer.WriteString($"[{iccidSpan.ToArray().ToHexString()}]终端SIM卡ICCID", jT808_0X0107.Terminal_SIM_ICCID); jT808_0X0107.Terminal_Hardware_Version_Length = reader.ReadByte(); diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0700.cs b/src/JT808.Protocol/MessageBody/JT808_0x0700.cs index 8ac20ef..9b9009f 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0700.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0700.cs @@ -1,4 +1,5 @@ -using JT808.Protocol.Extensions; +using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; @@ -29,6 +30,15 @@ namespace JT808.Protocol.MessageBody public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x0700 value = new JT808_0x0700(); + writer.WriteStartObject("行驶记录参数下传命令"); + value.ReplyMsgNum = reader.ReadUInt16(); + writer.WriteNumber($"[{value.ReplyMsgNum.ReadNumber()}]应答流水号", value.ReplyMsgNum); + value.CommandId = reader.ReadByte(); + writer.WriteString($"[{value.CommandId.ReadNumber()}]命令字", ((JT808CarDVRCommandID)value.CommandId).ToString()); + writer.WriteStartObject(((JT808CarDVRCommandID)value.CommandId).ToString()); + config.IJT808_CarDVR_Up_Package.Analyze(ref reader, writer, config); + writer.WriteEndObject(); + writer.WriteEndObject(); } public JT808_0x0700 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) @@ -36,7 +46,7 @@ namespace JT808.Protocol.MessageBody JT808_0x0700 value = new JT808_0x0700(); value.ReplyMsgNum = reader.ReadUInt16(); value.CommandId = reader.ReadByte(); - object obj = config.GetMessagePackFormatterByType(typeof( JT808CarDVRUpPackage)); + object obj = config.GetMessagePackFormatterByType(config.IJT808_CarDVR_Up_Package.GetType()); value.JT808CarDVRUpPackage = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(obj, ref reader, config); return value; } @@ -45,8 +55,9 @@ namespace JT808.Protocol.MessageBody { writer.WriteUInt16(value.ReplyMsgNum); writer.WriteByte(value.CommandId); - object obj = config.GetMessagePackFormatterByType(typeof(JT808CarDVRUpPackage)); - JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer,value.JT808CarDVRUpPackage, config); + object obj = config.GetMessagePackFormatterByType(config.IJT808_CarDVR_Up_Package.GetType()); + JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808CarDVRUpPackage, config); + } } } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8003.cs b/src/JT808.Protocol/MessageBody/JT808_0x8003.cs index 224c154..9f5ec19 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8003.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8003.cs @@ -15,7 +15,7 @@ namespace JT808.Protocol.MessageBody public override ushort MsgId { get; } = 0x8003; public override string Description => "补传分包请求"; /// - /// 原始消息流水号 + /// 原始消息流水号 /// 对应要求补传的原始消息第一包的消息流水号 /// public ushort OriginalMsgNum { get; set; } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8700.cs b/src/JT808.Protocol/MessageBody/JT808_0x8700.cs index e709193..96d8a7f 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8700.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8700.cs @@ -1,4 +1,5 @@ -using JT808.Protocol.Extensions; +using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; @@ -23,14 +24,21 @@ namespace JT808.Protocol.MessageBody public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - throw new NotImplementedException(); + JT808_0x8700 value = new JT808_0x8700(); + writer.WriteStartObject("行驶记录数据采集命令"); + value.CommandId = reader.ReadByte(); + writer.WriteString($"[{value.CommandId.ReadNumber()}]命令字", ((JT808CarDVRCommandID)value.CommandId).ToString()); + writer.WriteStartObject(((JT808CarDVRCommandID)value.CommandId).ToString()); + config.IJT808_CarDVR_Down_Package.Analyze(ref reader, writer, config); + writer.WriteEndObject(); + writer.WriteEndObject(); } public JT808_0x8700 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8700 value = new JT808_0x8700(); value.CommandId = reader.ReadByte(); - object obj = config.GetMessagePackFormatterByType(value.JT808CarDVRDownPackage.GetType()); + object obj = config.GetMessagePackFormatterByType(config.IJT808_CarDVR_Down_Package.GetType()); value.JT808CarDVRDownPackage = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(obj, ref reader, config); return value; } @@ -38,7 +46,7 @@ namespace JT808.Protocol.MessageBody public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8700 value, IJT808Config config) { writer.WriteByte(value.CommandId); - object obj = config.GetMessagePackFormatterByType(value.JT808CarDVRDownPackage.GetType()); + object obj = config.GetMessagePackFormatterByType(config.IJT808_CarDVR_Down_Package.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808CarDVRDownPackage, config); } } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8701.cs b/src/JT808.Protocol/MessageBody/JT808_0x8701.cs index ae55814..be6c3d0 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8701.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8701.cs @@ -1,4 +1,5 @@ -using JT808.Protocol.Extensions; +using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; @@ -26,14 +27,21 @@ namespace JT808.Protocol.MessageBody public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - throw new NotImplementedException(); + JT808_0x8701 value = new JT808_0x8701(); + writer.WriteStartObject("行驶记录参数下传命令"); + value.CommandId = reader.ReadByte(); + writer.WriteString($"[{value.CommandId.ReadNumber()}]命令字", ((JT808CarDVRCommandID)value.CommandId).ToString()); + writer.WriteStartObject(((JT808CarDVRCommandID)value.CommandId).ToString()); + config.IJT808_CarDVR_Down_Package.Analyze(ref reader, writer, config); + writer.WriteEndObject(); + writer.WriteEndObject(); } public JT808_0x8701 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8701 value = new JT808_0x8701(); value.CommandId = reader.ReadByte(); - object obj = config.GetMessagePackFormatterByType(value.JT808CarDVRDownPackage.GetType()); + object obj = config.GetMessagePackFormatterByType(config.IJT808_CarDVR_Down_Package.GetType()); value.JT808CarDVRDownPackage = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(obj, ref reader, config); return value; } @@ -41,7 +49,7 @@ namespace JT808.Protocol.MessageBody public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8701 value, IJT808Config config) { writer.WriteByte(value.CommandId); - object obj = config.GetMessagePackFormatterByType(value.JT808CarDVRDownPackage.GetType()); + object obj = config.GetMessagePackFormatterByType(config.IJT808_CarDVR_Down_Package.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808CarDVRDownPackage, config); } }