浏览代码

增加0x1203消息及测试

tags/v1.3.0
SmallChi 6 年前
父节点
当前提交
5712c5e5db
共有 5 个文件被更改,包括 241 次插入1 次删除
  1. +2
    -1
      README.md
  2. +136
    -0
      src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs
  3. +1
    -0
      src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs
  4. +71
    -0
      src/JT809.Protocol/JT809Formatters/JT809SubMessageBodyFormatters/JT809_0x1200_0x1203Formatter.cs
  5. +31
    -0
      src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1203.cs

+ 2
- 1
README.md 查看文件

@@ -45,4 +45,5 @@
|:------:|:------:|:------:|:------:|
| 1 | 0x1200 | √ | 主链路动态信息交换消息 |
| 2 | 0x1201 | √ | 上传车辆注册信息 |
| 3 | 0x1202 | √ | 实时上传车辆定位信息 |
| 3 | 0x1202 | √ | 实时上传车辆定位信息 |
| 4 | 0x1203 | √ | 车辆定位信息自动补报 |

+ 136
- 0
src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs 查看文件

@@ -0,0 +1,136 @@
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
using JT809.Protocol;
using JT809.Protocol.JT809Extensions;
using JT809.Protocol.JT809MessageBody;
using JT809.Protocol.JT809Exceptions;
using JT809.Protocol.JT809SubMessageBody;

namespace JT809.Protocol.Test.JT809SubMessageBody
{
public class JT809_0x1200_0x1203Test
{
[Fact]
public void Test1()
{
JT809_0x1200_0x1203 jT809_0X1200_0X1203 = new JT809_0x1200_0x1203();
jT809_0X1200_0X1203.GNSS = new List<JT809_0x1200_0x1202>();

JT809_0x1200_0x1202 jT809_0X1200_0X1202_1 = new JT809_0x1200_0x1202();
jT809_0X1200_0X1202_1.VehiclePosition.Day = 19;
jT809_0X1200_0X1202_1.VehiclePosition.Month = 7;
jT809_0X1200_0X1202_1.VehiclePosition.Year = 2012;
jT809_0X1200_0X1202_1.VehiclePosition.Hour = 15;
jT809_0X1200_0X1202_1.VehiclePosition.Minute = 15;
jT809_0X1200_0X1202_1.VehiclePosition.Second = 15;
jT809_0X1200_0X1202_1.VehiclePosition.Lon = 133123456;
jT809_0X1200_0X1202_1.VehiclePosition.Lat = 24123456;
jT809_0X1200_0X1202_1.VehiclePosition.Vec1 = 50;
jT809_0X1200_0X1202_1.VehiclePosition.Vec2 = 51;
jT809_0X1200_0X1202_1.VehiclePosition.Vec3 = 150;
jT809_0X1200_0X1202_1.VehiclePosition.Direction = 45;
jT809_0X1200_0X1202_1.VehiclePosition.Altitude = 45;
jT809_0X1200_0X1202_1.VehiclePosition.State = 3;
jT809_0X1200_0X1202_1.VehiclePosition.Alarm = 257;

JT809_0x1200_0x1202 jT809_0X1200_0X1202_2 = new JT809_0x1200_0x1202();
jT809_0X1200_0X1202_2.VehiclePosition.Day = 19;
jT809_0X1200_0X1202_2.VehiclePosition.Month = 7;
jT809_0X1200_0X1202_2.VehiclePosition.Year = 2012;
jT809_0X1200_0X1202_2.VehiclePosition.Hour = 16;
jT809_0X1200_0X1202_2.VehiclePosition.Minute = 16;
jT809_0X1200_0X1202_2.VehiclePosition.Second = 16;
jT809_0X1200_0X1202_2.VehiclePosition.Lon = 133123456;
jT809_0X1200_0X1202_2.VehiclePosition.Lat = 24123456;
jT809_0X1200_0X1202_2.VehiclePosition.Vec1 = 50;
jT809_0X1200_0X1202_2.VehiclePosition.Vec2 = 51;
jT809_0X1200_0X1202_2.VehiclePosition.Vec3 = 150;
jT809_0X1200_0X1202_2.VehiclePosition.Direction = 45;
jT809_0X1200_0X1202_2.VehiclePosition.Altitude = 45;
jT809_0X1200_0X1202_2.VehiclePosition.State = 3;
jT809_0X1200_0X1202_2.VehiclePosition.Alarm = 257;

JT809_0x1200_0x1202 jT809_0X1200_0X1202_3 = new JT809_0x1200_0x1202();
jT809_0X1200_0X1202_3.VehiclePosition.Day = 19;
jT809_0X1200_0X1202_3.VehiclePosition.Month = 7;
jT809_0X1200_0X1202_3.VehiclePosition.Year = 2012;
jT809_0X1200_0X1202_3.VehiclePosition.Hour = 17;
jT809_0X1200_0X1202_3.VehiclePosition.Minute = 17;
jT809_0X1200_0X1202_3.VehiclePosition.Second = 17;
jT809_0X1200_0X1202_3.VehiclePosition.Lon = 133123456;
jT809_0X1200_0X1202_3.VehiclePosition.Lat = 24123456;
jT809_0X1200_0X1202_3.VehiclePosition.Vec1 = 50;
jT809_0X1200_0X1202_3.VehiclePosition.Vec2 = 51;
jT809_0X1200_0X1202_3.VehiclePosition.Vec3 = 150;
jT809_0X1200_0X1202_3.VehiclePosition.Direction = 45;
jT809_0X1200_0X1202_3.VehiclePosition.Altitude = 45;
jT809_0X1200_0X1202_3.VehiclePosition.State = 3;
jT809_0X1200_0X1202_3.VehiclePosition.Alarm = 257;


jT809_0X1200_0X1203.GNSS.Add(jT809_0X1200_0X1202_1);
jT809_0X1200_0X1203.GNSS.Add(jT809_0X1200_0X1202_2);
jT809_0X1200_0X1203.GNSS.Add(jT809_0X1200_0X1202_3);

var hex = JT809Serializer.Serialize(jT809_0X1200_0X1203).ToHexString();
//"03 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 10 10 10 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 11 11 11 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01"
}

[Fact]
public void Test2()
{
var bytes = "03 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 10 10 10 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01 00 13 07 07 DC 11 11 11 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01".ToHexBytes();
JT809_0x1200_0x1203 jT809_0X1200_0X1203 = JT809Serializer.Deserialize<JT809_0x1200_0x1203>(bytes);

Assert.Equal(3, jT809_0X1200_0X1203.GNSSCount);


Assert.Equal(19, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Day);
Assert.Equal(7, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Month);
Assert.Equal(2012, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Year);
Assert.Equal(15, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Hour);
Assert.Equal(15, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Minute);
Assert.Equal(15, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Second);
Assert.Equal((uint)133123456, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Lon);
Assert.Equal((uint)24123456, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Lat);
Assert.Equal(50, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Vec1);
Assert.Equal(51, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Vec2);
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Direction);
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Altitude);
Assert.Equal((uint)3, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.State);
Assert.Equal((uint)257, jT809_0X1200_0X1203.GNSS[0].VehiclePosition.Alarm);

Assert.Equal(19, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Day);
Assert.Equal(7, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Month);
Assert.Equal(2012, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Year);
Assert.Equal(16, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Hour);
Assert.Equal(16, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Minute);
Assert.Equal(16, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Second);
Assert.Equal((uint)133123456, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Lon);
Assert.Equal((uint)24123456, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Lat);
Assert.Equal(50, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Vec1);
Assert.Equal(51, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Vec2);
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Direction);
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Altitude);
Assert.Equal((uint)3, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.State);
Assert.Equal((uint)257, jT809_0X1200_0X1203.GNSS[1].VehiclePosition.Alarm);

Assert.Equal(19, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Day);
Assert.Equal(7, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Month);
Assert.Equal(2012, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Year);
Assert.Equal(17, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Hour);
Assert.Equal(17, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Minute);
Assert.Equal(17, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Second);
Assert.Equal((uint)133123456, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Lon);
Assert.Equal((uint)24123456, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Lat);
Assert.Equal(50, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Vec1);
Assert.Equal(51, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Vec2);
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Direction);
Assert.Equal((ushort)45, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Altitude);
Assert.Equal((uint)3, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.State);
Assert.Equal((uint)257, jT809_0X1200_0X1203.GNSS[2].VehiclePosition.Alarm);
}
}
}

+ 1
- 0
src/JT809.Protocol/JT809Enums/JT809SubBusinessType.cs 查看文件

@@ -26,6 +26,7 @@ namespace JT809.Protocol.JT809Enums
///车辆定位信息自动补报
///</summary>
[Description("车辆定位信息自动补报")]
[JT809BodiesType(typeof(JT809_0x1200_0x1203))]
UP_EXG_MSG_HISTORY_LOCATION = 0x1203,
///<summary>
///启动车辆定位信息交换应答


+ 71
- 0
src/JT809.Protocol/JT809Formatters/JT809SubMessageBodyFormatters/JT809_0x1200_0x1203Formatter.cs 查看文件

@@ -0,0 +1,71 @@
using JT809.Protocol.JT809Enums;
using JT809.Protocol.JT809Extensions;
using JT809.Protocol.JT809Properties;
using JT809.Protocol.JT809SubMessageBody;
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Text;

namespace JT809.Protocol.JT809Formatters.JT809SubMessageBodyFormatters
{
public class JT809_0x1200_0x1203Formatter : IJT809Formatter<JT809_0x1200_0x1203>
{
public JT809_0x1200_0x1203 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
{
int offset = 0;
JT809_0x1200_0x1203 jT809_0X1200_0X1203 = new JT809_0x1200_0x1203();
jT809_0X1200_0X1203.GNSSCount= JT809BinaryExtensions.ReadByteLittle(bytes, ref offset);
if (jT809_0X1200_0X1203.GNSSCount > 0)
{
jT809_0X1200_0X1203.GNSS = new List<JT809_0x1200_0x1202>();
int bufReadSize;
int tempOffset = 0;
for (int i = 0; i < jT809_0X1200_0X1203.GNSSCount; i++)
{
try
{
if (i == 0)
{
tempOffset = offset + 36;
JT809_0x1200_0x1202 jT809_0x1200_0x1202 = JT809FormatterExtensions.GetFormatter<JT809_0x1200_0x1202>()
.Deserialize(bytes.Slice(offset, 36), out bufReadSize);
jT809_0X1200_0X1203.GNSS.Add(jT809_0x1200_0x1202);
}
else
{
JT809_0x1200_0x1202 jT809_0x1200_0x1202 = JT809FormatterExtensions.GetFormatter<JT809_0x1200_0x1202>()
.Deserialize(bytes.Slice(tempOffset, 36), out bufReadSize);
tempOffset += 36;
jT809_0X1200_0X1203.GNSS.Add(jT809_0x1200_0x1202);
}
}
catch (Exception)
{
tempOffset += 36;
}
}
}
readSize = jT809_0X1200_0X1203.GNSSCount * 36 + 1;
return jT809_0X1200_0X1203;
}

public int Serialize(IMemoryOwner<byte> memoryOwner, int offset, JT809_0x1200_0x1203 value)
{
offset += JT809BinaryExtensions.WriteByteLittle(memoryOwner, offset, (byte)value.GNSS.Count);
foreach(var item in value.GNSS)
{
try
{
int positionOffset = JT809FormatterExtensions.GetFormatter<JT809_0x1200_0x1202>().Serialize(memoryOwner, offset, item);
offset = positionOffset;
}
catch (Exception ex)
{

}
}
return offset;
}
}
}

+ 31
- 0
src/JT809.Protocol/JT809SubMessageBody/JT809_0x1200_0x1203.cs 查看文件

@@ -0,0 +1,31 @@
using JT809.Protocol.JT809Attributes;
using JT809.Protocol.JT809Formatters.JT809SubMessageBodyFormatters;
using JT809.Protocol.JT809Properties;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT809.Protocol.JT809SubMessageBody
{
/// <summary>
/// 车辆定位信息自动补报请求消息
/// <para>子业务类型标识:UP_EXG_MSG_HISTORY_LOCATION</para>
/// <para>描述:如果平台间传输链路中断,下级平台重新登录并与上级平台建立通信链路后,下级平台应将中断期间内车载终端上传的车辆定位信息自动补报到上级平台。
/// 如果系统断线期间,该车需发送的数据包条数大于 5,则以每包五条进行补发,直到补发完毕。
/// 多条数据以卫星定位时间先后顺序排列。
/// 本条消息上级平台采用定量回复,即收到一定数量的数据后,即通过从链路应答数据量。
/// </para>
/// </summary>
[JT809Formatter(typeof(JT809_0x1200_0x1203Formatter))]
public class JT809_0x1200_0x1203 : JT809SubBodies
{
/// <summary>
/// 卫星定位数据个数 1<=GNSS_CNT<=5。
/// </summary>
public byte GNSSCount { get; set; }
/// <summary>
/// 卫星定位数据集合
/// </summary>
public IList<JT809_0x1200_0x1202> GNSS { get; set; }
}
}

正在加载...
取消
保存