diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs index 94eb983..78f4600 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs @@ -1,4 +1,5 @@ using JT808.Protocol.Enums; +using JT808.Protocol.Exceptions; using JT808.Protocol.Extensions; using JT808.Protocol.Interfaces; using JT808.Protocol.Internal; @@ -370,9 +371,8 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal("7E0200005C11223344556622B8000000010000000200BA7F0E07E4F11C0028003C00001807151010100104000000640202003703020038040200011105010000000112060100000001011307000000020022012504000000172A0200F42B04000000F2300102310105167E", hex); //7E0200005C11223344556622B8000000010000000200BA7F0E07E4F11C0028003C00001807151010100104000000640202003703020038040200011105010000000112060100000001011307000000020022012504000000172A0200F42B04000000F2300102310105167E } - [Fact] - public void Test6() + public void LatLngTest1_1() { JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 { @@ -385,13 +385,12 @@ namespace JT808.Protocol.Test.MessageBody Direction = 0, JT808LocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.StatusFlag = 402653184; + jT808UploadLocationRequest.StatusFlag = 0x18000000; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); Assert.Equal("0000000118000000FF4580F2F81B0EE40028003C0000180715101010", hex); } - [Fact] - public void Test6_1() + public void LatLngTest1_2() { byte[] bodys = "0000000118000000FF4580F2F81B0EE40028003C0000180715101010".ToHexBytes(); JT808_0x0200 jT808UploadLocationRequest = JT808Serializer.Deserialize(bodys); @@ -402,28 +401,136 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(-132444444, jT808UploadLocationRequest.Lng); Assert.Equal(60, jT808UploadLocationRequest.Speed); //‭402653184‬ } - [Fact] - public void Test7() + public void LatLngTest2_1() { JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 { AlarmFlag = 1, Altitude = 40, GPSTime = DateTime.Parse("2018-07-15 10:10:10"), - Lat = 12222222, + Lat = -12222222, + Lng = -132444444, + Speed = 60, + Direction = 0, + JT808LocationAttachData = new Dictionary() + }; + jT808UploadLocationRequest.StatusFlag = 0x18000000 | 0x302; + var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); + Assert.Equal("0000000118000302FF4580F2F81B0EE40028003C0000180715101010", hex); + } + [Fact] + public void LatLngTest2_2() + { + byte[] bodys = "0000000118000302FF4580F2F81B0EE40028003C0000180715101010".ToHexBytes(); + JT808_0x0200 jT808UploadLocationRequest = JT808Serializer.Deserialize(bodys); + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal((uint)(0x18000000 | 0x302), jT808UploadLocationRequest.StatusFlag); + Assert.Equal(DateTime.Parse("2018-07-15 10:10:10"), jT808UploadLocationRequest.GPSTime); + Assert.Equal(-12222222, jT808UploadLocationRequest.Lat); + Assert.Equal(-132444444, jT808UploadLocationRequest.Lng); + Assert.Equal(60, jT808UploadLocationRequest.Speed); //‭402653184‬ + } + [Fact] + public void LatTest1_1() + { + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2018-07-15 10:10:10"), + Lat = -12222222, + Lng = 132444444, + Speed = 60, + Direction = 0, + JT808LocationAttachData = new Dictionary() + }; + jT808UploadLocationRequest.StatusFlag = 0x10000000; + var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); + Assert.Equal("0000000110000000FF4580F207E4F11C0028003C0000180715101010", hex); + } + [Fact] + public void LatTest1_2() + { + byte[] bodys = "0000000110000000FF4580F207E4F11C0028003C0000180715101010".ToHexBytes(); + JT808_0x0200 jT808UploadLocationRequest = JT808Serializer.Deserialize(bodys); + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal((uint)0x10000000, jT808UploadLocationRequest.StatusFlag); + Assert.Equal(DateTime.Parse("2018-07-15 10:10:10"), jT808UploadLocationRequest.GPSTime); + Assert.Equal(-12222222, jT808UploadLocationRequest.Lat); + Assert.Equal(132444444, jT808UploadLocationRequest.Lng); + Assert.Equal(60, jT808UploadLocationRequest.Speed); //‭402653184‬ + } + [Fact] + public void LatTest2() + { + JT808Exception exception= Assert.Throws(() => { + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2018-07-15 10:10:10"), + Lat = -12222222, + Lng = 132444444, + Speed = 60, + Direction = 0, + JT808LocationAttachData = new Dictionary() + }; + jT808UploadLocationRequest.StatusFlag = 1111; + var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); + }); + Assert.Equal(JT808ErrorCode.LatOrLngError, exception.ErrorCode); + } + [Fact] + public void LatTest3_1() + { + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2018-07-15 10:10:10"), + Lat = -12222222, Lng = 132444444, Speed = 60, Direction = 0, JT808LocationAttachData = new Dictionary() }; + jT808UploadLocationRequest.StatusFlag = 0x10000000 | 0x000300; + var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); + Assert.Equal("0000000110000300FF4580F207E4F11C0028003C0000180715101010", hex); + } + [Fact] + public void LatTest3_2() + { + byte[] bodys = "0000000110000300FF4580F207E4F11C0028003C0000180715101010".ToHexBytes(); + JT808_0x0200 jT808UploadLocationRequest = JT808Serializer.Deserialize(bodys); + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal((uint)(0x10000000 | 0x000300), jT808UploadLocationRequest.StatusFlag); + Assert.Equal(DateTime.Parse("2018-07-15 10:10:10"), jT808UploadLocationRequest.GPSTime); + Assert.Equal(-12222222, jT808UploadLocationRequest.Lat); + Assert.Equal(132444444, jT808UploadLocationRequest.Lng); + Assert.Equal(60, jT808UploadLocationRequest.Speed); //‭402653184‬ + } + [Fact] + public void LngTest1_1() + { + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2018-07-15 10:10:10"), + Lat = 12222222, + Lng = -132444444, + Speed = 60, + Direction = 0, + JT808LocationAttachData = new Dictionary() + }; jT808UploadLocationRequest.StatusFlag = 0x8000000; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); Assert.Equal("000000010800000000BA7F0EF81B0EE40028003C0000180715101010", hex); } - [Fact] - public void Test7_1() + public void LngTest1_2() { byte[] bodys = "000000010800000000BA7F0EF81B0EE40028003C0000180715101010".ToHexBytes(); JT808_0x0200 jT808UploadLocationRequest = JT808Serializer.Deserialize(bodys); @@ -434,5 +541,55 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(-132444444, jT808UploadLocationRequest.Lng); Assert.Equal(60, jT808UploadLocationRequest.Speed); //‭402653184‬ } + [Fact] + public void LngTest2() + { + JT808Exception exception = Assert.Throws(() => { + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2018-07-15 10:10:10"), + Lat = 12222222, + Lng = -132444444, + Speed = 60, + Direction = 0, + JT808LocationAttachData = new Dictionary() + }; + jT808UploadLocationRequest.StatusFlag = 1111; + var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); + }); + Assert.Equal(JT808ErrorCode.LatOrLngError, exception.ErrorCode); + } + [Fact] + public void LngTest3_1() + { + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2018-07-15 10:10:10"), + Lat = 12222222, + Lng = -132444444, + Speed = 60, + Direction = 0, + JT808LocationAttachData = new Dictionary() + }; + jT808UploadLocationRequest.StatusFlag = 0x8000000|0x6601; + var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); + Assert.Equal("000000010800660100BA7F0EF81B0EE40028003C0000180715101010", hex); + } + [Fact] + public void LngTest3_2() + { + byte[] bodys = "000000010800660100BA7F0EF81B0EE40028003C0000180715101010".ToHexBytes(); + JT808_0x0200 jT808UploadLocationRequest = JT808Serializer.Deserialize(bodys); + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal((uint)(0x8000000 | 0x6601), jT808UploadLocationRequest.StatusFlag); + Assert.Equal(DateTime.Parse("2018-07-15 10:10:10"), jT808UploadLocationRequest.GPSTime); + Assert.Equal(12222222, jT808UploadLocationRequest.Lat); + Assert.Equal(-132444444, jT808UploadLocationRequest.Lng); + Assert.Equal(60, jT808UploadLocationRequest.Speed); //‭402653184‬ + } } } diff --git a/src/JT808.Protocol/Enums/JT808ErrorCode.cs b/src/JT808.Protocol/Enums/JT808ErrorCode.cs index f36d2fe..92e9837 100644 --- a/src/JT808.Protocol/Enums/JT808ErrorCode.cs +++ b/src/JT808.Protocol/Enums/JT808ErrorCode.cs @@ -32,6 +32,10 @@ /// 没有全局注册格式化器 /// /// - NotGlobalRegisterFormatterAssembly = 1008 + NotGlobalRegisterFormatterAssembly = 1008, + /// + /// 经纬度错误 + /// + LatOrLngError = 1009 } } diff --git a/src/JT808.Protocol/Formatters/MessageBodyFormatters/JT808_0x0200_Formatter.cs b/src/JT808.Protocol/Formatters/MessageBodyFormatters/JT808_0x0200_Formatter.cs index f249095..8584ac7 100644 --- a/src/JT808.Protocol/Formatters/MessageBodyFormatters/JT808_0x0200_Formatter.cs +++ b/src/JT808.Protocol/Formatters/MessageBodyFormatters/JT808_0x0200_Formatter.cs @@ -5,6 +5,8 @@ using System; using System.Collections.Generic; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; +using JT808.Protocol.Exceptions; +using JT808.Protocol.Enums; namespace JT808.Protocol.Formatters.MessageBodyFormatters { @@ -15,21 +17,21 @@ namespace JT808.Protocol.Formatters.MessageBodyFormatters JT808_0x0200 jT808_0X0200 = new JT808_0x0200(); jT808_0X0200.AlarmFlag = reader.ReadUInt32(); jT808_0X0200.StatusFlag = reader.ReadUInt32(); - jT808_0X0200.Lng = reader.ReadInt32(); - jT808_0X0200.Lng = reader.ReadInt32(); -#warning 反解析的时候 负数 - switch (jT808_0X0200.StatusFlag) + if (((jT808_0X0200.StatusFlag >> 28) & 1) == 1) + { //南纬 268435456 0x10000000 + jT808_0X0200.Lat = (int)reader.ReadUInt32(); + } + else + { + jT808_0X0200.Lat = reader.ReadInt32(); + } + if (((jT808_0X0200.StatusFlag >> 27) & 1) == 1) + { //西经 ‭134217728‬ 0x8000000 + jT808_0X0200.Lng = (int)reader.ReadUInt32(); + } + else { - case 0x8000000: //西经 ‭134217728‬ - //jT808_0X0200.Lng = -lng; - break; - case 0x10000000: //南纬 268435456 - //jT808_0X0200.Lat = -lat; - break; - case 0x18000000: //西经-南纬 ‭402653184‬ - //jT808_0X0200.Lat = -lat; - //jT808_0X0200.Lng = -lng; - break; + jT808_0X0200.Lng = reader.ReadInt32(); } jT808_0X0200.Altitude = reader.ReadUInt16(); jT808_0X0200.Speed = reader.ReadUInt16(); @@ -87,22 +89,35 @@ namespace JT808.Protocol.Formatters.MessageBodyFormatters { writer.WriteUInt32(value.AlarmFlag); writer.WriteUInt32(value.StatusFlag); -#warning 反解析的时候 负数 - switch (value.StatusFlag) + //0x10000000 南纬 134217728 + //0x8000000 西经 ‭‬268435456 + //0x18000000 南纬-西经 134217728+268435456 + if (((value.StatusFlag >> 28) & 1) == 1) + { + uint lat=(uint)value.Lat; + writer.WriteUInt32(lat); + } + else + { + if (value.Lat < 0) + { + throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lat {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>28) !=1"); + } + writer.WriteInt32(value.Lat); + } + if (((value.StatusFlag >> 27) & 1) == 1) { - case 0x8000000: //西经 ‭134217728‬ - value.Lat = -value.Lat; - break; - case 0x10000000: //南纬 268435456 - value.Lng = -value.Lng; - break; - case 0x18000000: //西经-南纬 ‭402653184‬ - value.Lat = -value.Lat; - value.Lng = -value.Lng; - break; + uint lng = (uint)value.Lng; + writer.WriteUInt32(lng); + } + else + { + if (value.Lng < 0) + { + throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lng {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>29) !=1"); + } + writer.WriteInt32(value.Lng); } - writer.WriteInt32(value.Lat); - writer.WriteInt32(value.Lng); writer.WriteUInt16(value.Altitude); writer.WriteUInt16(value.Speed); writer.WriteUInt16(value.Direction);