diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0700Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0700Test.cs index 3d6bfcf..6de10d8 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0700Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0700Test.cs @@ -666,6 +666,7 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(50, body.JT808_CarDVR_Up_0x15_SpeedStatusLogs[0].JT808_CarDVR_Up_0x15_SpeedPerSeconds[0].RecordSpeed); Assert.Equal(40, body.JT808_CarDVR_Up_0x15_SpeedStatusLogs[0].JT808_CarDVR_Up_0x15_SpeedPerSeconds[0].ReferenceSpeed); } + [Fact] public void Test_Serialize_0x82() { @@ -689,5 +690,35 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(1, value.ReplyMsgNum); var body = value.JT808CarDVRUpPackage.Bodies as JT808_CarDVR_Up_0x82; } + + [Fact] + public void Test_Serialize_Error() + { + JT808_0x0700 value = new JT808_0x0700(); + value.CommandId = 0xFA; + value.ReplyMsgNum = 1; + value.JT808CarDVRUpPackage = new JT808CarDVRUpPackage + { + CommandId = 0xFA + }; + var hex = JT808Serializer.Serialize(value).ToHexString(); + Assert.Equal("0001FA557AFA00D5", hex); + } + + [Fact] + public void Test_Deserilize_Error() + { + byte[] bytes = "0001FA557AFA00D5".ToHexBytes(); + JT808_0x0700 value = JT808Serializer.Deserialize(bytes); + Assert.Equal(1, value.ReplyMsgNum); + Assert.True(value.JT808CarDVRUpPackage.ErrorFlag); + } + + [Fact] + public void Test_Json_Error() + { + byte[] bytes = "0001FA557AFA00D5".ToHexBytes(); + string json = JT808Serializer.Analyze(bytes); + } } } diff --git a/src/JT808.Protocol/JT808.Protocol.csproj b/src/JT808.Protocol/JT808.Protocol.csproj index fcc3fa1..8d00343 100644 --- a/src/JT808.Protocol/JT808.Protocol.csproj +++ b/src/JT808.Protocol/JT808.Protocol.csproj @@ -15,7 +15,7 @@ https://github.com/SmallChi/JT808/blob/master/LICENSE JT808.Protocol.xml false - 2.3.9 + 2.4.0 LICENSE latest true diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index f014a1a..0a398ef 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -4791,6 +4791,12 @@ 命令字 + + + 错误标志 + CommandId == 0xFA || CommandId == 0xFB + + 数据块长度 diff --git a/src/JT808.Protocol/JT808CarDVRUpPackage.cs b/src/JT808.Protocol/JT808CarDVRUpPackage.cs index 05e4091..44a2184 100644 --- a/src/JT808.Protocol/JT808CarDVRUpPackage.cs +++ b/src/JT808.Protocol/JT808CarDVRUpPackage.cs @@ -29,6 +29,11 @@ namespace JT808.Protocol /// public byte CommandId { get; set; } /// + /// 错误标志 + /// CommandId == 0xFA || CommandId == 0xFB + /// + public bool ErrorFlag { get; set; } + /// /// 数据块长度 /// public ushort DataLength { get; set; } @@ -58,9 +63,18 @@ namespace JT808.Protocol 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.ErrorFlag = value.CommandId == 0xFA || value.CommandId == 0xFB; + if (!value.ErrorFlag) + { + writer.WriteString($"[{value.CommandId.ReadNumber()}]命令字", ((JT808CarDVRCommandID)value.CommandId).ToString()); + value.DataLength = reader.ReadUInt16(); + writer.WriteNumber($"[{value.DataLength.ReadNumber()}]数据块长度", value.DataLength); + } + else + { + writer.WriteString($"[{value.CommandId.ReadNumber()}]出错标志字", value.CommandId.ToString()); + } value.KeepFields = reader.ReadByte(); writer.WriteNumber($"[{value.KeepFields.ReadNumber()}]保留字", value.KeepFields); if (value.DataLength > 0) @@ -97,7 +111,12 @@ namespace JT808.Protocol int currentPosition = reader.ReaderCount; value.Begin = reader.ReadUInt16(); value.CommandId = reader.ReadByte(); - value.DataLength = reader.ReadUInt16(); + //出错标志位 + value.ErrorFlag = value.CommandId == 0xFA || value.CommandId == 0xFB; + if (!value.ErrorFlag) + { + value.DataLength = reader.ReadUInt16(); + } value.KeepFields = reader.ReadByte(); if (value.DataLength > 0) { @@ -128,17 +147,25 @@ namespace JT808.Protocol var currentPosition = writer.GetCurrentPosition(); writer.WriteUInt16(value.Begin); writer.WriteByte(value.CommandId); - writer.Skip(2, out var datalengthPosition); + var isError = value.CommandId == 0xFA || value.CommandId == 0xFB; + int datalengthPosition=0; + if (!isError) + { + writer.Skip(2, out datalengthPosition); + } writer.WriteByte(value.KeepFields); - if (config.JT808_CarDVR_Up_Factory.Map.TryGetValue(value.CommandId, out var instance)) + if (datalengthPosition > 0) { - if (!value.Bodies.SkipSerialization) + if (config.JT808_CarDVR_Up_Factory.Map.TryGetValue(value.CommandId, out var instance)) { - //4.2.处理消息体 - JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(instance, ref writer, value.Bodies, config); + if (!value.Bodies.SkipSerialization) + { + //4.2.处理消息体 + JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(instance, ref writer, value.Bodies, config); + } } + writer.WriteUInt16Return((ushort)(writer.GetCurrentPosition() - 2 - 1 - datalengthPosition), datalengthPosition);//此处-2:减去数据长度字段2位,-1:减去保留字长度 } - writer.WriteUInt16Return((ushort)(writer.GetCurrentPosition() -2-1- datalengthPosition), datalengthPosition);//此处-2:减去数据长度字段2位,-1:减去保留字长度 writer.WriteCarDVRCheckCode(currentPosition); } }