Browse Source

修复0x0200经纬度为负数的及状态位的处理

tags/v2.1.3
smallchi 5 years ago
parent
commit
8a84da9c06
3 changed files with 215 additions and 39 deletions
  1. +167
    -10
      src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs
  2. +5
    -1
      src/JT808.Protocol/Enums/JT808ErrorCode.cs
  3. +43
    -28
      src/JT808.Protocol/Formatters/MessageBodyFormatters/JT808_0x0200_Formatter.cs

+ 167
- 10
src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs View File

@@ -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<byte, JT808_0x0200_BodyBase>()
};
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<JT808_0x0200>(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<byte, JT808_0x0200_BodyBase>()
};
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<JT808_0x0200>(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<byte, JT808_0x0200_BodyBase>()
};
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<JT808_0x0200>(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<JT808Exception>(() => {
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<byte, JT808_0x0200_BodyBase>()
};
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<byte, JT808_0x0200_BodyBase>()
};
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<JT808_0x0200>(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<byte, JT808_0x0200_BodyBase>()
};
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<JT808_0x0200>(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<JT808Exception>(() => {
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<byte, JT808_0x0200_BodyBase>()
};
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<byte, JT808_0x0200_BodyBase>()
};
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<JT808_0x0200>(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‬
}
}
}

+ 5
- 1
src/JT808.Protocol/Enums/JT808ErrorCode.cs View File

@@ -32,6 +32,10 @@
/// 没有全局注册格式化器
/// <see cref="JT808.Protocol.Formatters.IJT808MessagePackFormatter<T>"/>
/// </summary>
NotGlobalRegisterFormatterAssembly = 1008
NotGlobalRegisterFormatterAssembly = 1008,
/// <summary>
/// 经纬度错误
/// </summary>
LatOrLngError = 1009
}
}

+ 43
- 28
src/JT808.Protocol/Formatters/MessageBodyFormatters/JT808_0x0200_Formatter.cs View File

@@ -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);


Loading…
Cancel
Save