using JT809.Protocol.Enums;
using JT809.Protocol.Formatters;
using JT809.Protocol.MessagePack;
using JT809.Protocol.Metadata;
using JT809.Protocol.Extensions;
using JT809.Protocol.Interfaces;
namespace JT809.Protocol.SubMessageBody
{
///
/// 实时上传车辆定位信息消息
/// 子业务类型标识:UP_EXG_MSG_REAL_LOCATION
/// 车辆的实时定位信息
/// 无需应答
///
public class JT809_0x1200_0x1202:JT809SubBodies, IJT809MessagePackFormatter,IJT809_2019_Version
{
public override ushort SubMsgId => JT809SubBusinessType.实时上传车辆定位信息.ToUInt16Value();
public override string Description => "实时上传车辆定位信息";
///
/// 车辆定位信息
///
public JT809VehiclePositionProperties VehiclePosition { get; set; }
public JT809VehiclePositionProperties_2019 GNSSData { get; set; }
public JT809_0x1200_0x1202 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
{
JT809_0x1200_0x1202 value = new JT809_0x1200_0x1202();
if (config.Version == JT809Version.JTT2011)
{
value.VehiclePosition = new JT809VehiclePositionProperties();
value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
value.VehiclePosition.Day = reader.ReadByte();
value.VehiclePosition.Month = reader.ReadByte();
value.VehiclePosition.Year = reader.ReadUInt16();
value.VehiclePosition.Hour = reader.ReadByte();
value.VehiclePosition.Minute = reader.ReadByte();
value.VehiclePosition.Second = reader.ReadByte();
value.VehiclePosition.Lon = reader.ReadUInt32();
value.VehiclePosition.Lat = reader.ReadUInt32();
value.VehiclePosition.Vec1 = reader.ReadUInt16();
value.VehiclePosition.Vec2 = reader.ReadUInt16();
value.VehiclePosition.Vec3 = reader.ReadUInt32();
value.VehiclePosition.Direction = reader.ReadUInt16();
value.VehiclePosition.Altitude = reader.ReadUInt16();
value.VehiclePosition.State = reader.ReadUInt32();
value.VehiclePosition.Alarm = reader.ReadUInt32();
}
else
{
value.GNSSData = new JT809VehiclePositionProperties_2019();
value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte();
value.GNSSData.DataLength = reader.ReadUInt32();
value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray();
value.GNSSData.PlatformId1 = reader.ReadString(11);
value.GNSSData.Alarm1 = reader.ReadUInt32();
value.GNSSData.PlatformId2 = reader.ReadString(11);
value.GNSSData.Alarm2 = reader.ReadUInt32();
value.GNSSData.PlatformId3 = reader.ReadString(11);
value.GNSSData.Alarm3 = reader.ReadUInt32();
}
return value;
}
public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x1202 value, IJT809Config config)
{
if (config.Version == JT809Version.JTT2011)
{
writer.WriteByte((byte)value.VehiclePosition.Encrypt);
writer.WriteByte(value.VehiclePosition.Day);
writer.WriteByte(value.VehiclePosition.Month);
writer.WriteUInt16(value.VehiclePosition.Year);
writer.WriteByte(value.VehiclePosition.Hour);
writer.WriteByte(value.VehiclePosition.Minute);
writer.WriteByte(value.VehiclePosition.Second);
writer.WriteUInt32(value.VehiclePosition.Lon);
writer.WriteUInt32(value.VehiclePosition.Lat);
writer.WriteUInt16(value.VehiclePosition.Vec1);
writer.WriteUInt16(value.VehiclePosition.Vec2);
writer.WriteUInt32(value.VehiclePosition.Vec3);
writer.WriteUInt16(value.VehiclePosition.Direction);
writer.WriteUInt16(value.VehiclePosition.Altitude);
writer.WriteUInt32(value.VehiclePosition.State);
writer.WriteUInt32(value.VehiclePosition.Alarm);
}
else
{
writer.WriteByte((byte)value.GNSSData.Encrypt);
writer.Skip(4, out int position);
writer.WriteArray(value.GNSSData.GnssData);
writer.WriteUInt32Return((uint)(writer.GetCurrentPosition() - position - 4), position);
writer.WriteStringPadRight(value.GNSSData.PlatformId1,11);
writer.WriteUInt32(value.GNSSData.Alarm1);
writer.WriteStringPadRight(value.GNSSData.PlatformId2,11);
writer.WriteUInt32(value.GNSSData.Alarm2);
writer.WriteStringPadRight(value.GNSSData.PlatformId3,11);
writer.WriteUInt32(value.GNSSData.Alarm3);
}
}
}
}