using JT809.Protocol.Enums;
using JT809.Protocol.Exceptions;
using JT809.Protocol.Extensions;
using JT809.Protocol.Formatters;
using JT809.Protocol.Interfaces;
using JT809.Protocol.MessagePack;
using System;
using System.Text.Json;
namespace JT809.Protocol.MessageBody
{
///
/// 从链路平台间信息交互业务
/// 链路类型:从链路
/// 消息方向:上级平台往下级平台
/// 业务数据类型标识:DOWN_PLATFORM_MSG
/// 描述:上级平台向下级平台发送平台问交互信息
///
public class JT809_0x9300: JT809ExchangeMessageBodies, IJT809MessagePackFormatter, IJT809Analyze
{
public override ushort MsgId => JT809BusinessType.从链路平台间信息交互业务.ToUInt16Value();
public override string Description => "从链路平台间信息交互业务";
public override JT809_LinkType LinkType => JT809_LinkType.subordinate;
public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
{
JT809_0x9300 value = new JT809_0x9300();
var virtualHex = reader.ReadVirtualArray(21);
value.VehicleNo = reader.ReadString(21);
writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo);
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString());
value.SubBusinessType = reader.ReadUInt16();
writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString());
value.DataLength = reader.ReadUInt32();
writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength);
try
{
if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
{
if (instance is JT809SubBodies subBodies)
{
if (!subBodies.SkipSerialization)
{
instance.Analyze(ref reader, writer, config);
}
}
}
}
catch
{
throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
}
}
public JT809_0x9300 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
{
JT809_0x9300 value = new JT809_0x9300();
value.VehicleNo = reader.ReadString(21);
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
value.SubBusinessType = reader.ReadUInt16();
value.DataLength = reader.ReadUInt32();
try
{
if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
{
if (instance is JT809SubBodies subBodies)
{
if (!subBodies.SkipSerialization)
{
value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(
instance,
ref reader, config);
}
}
}
}
catch
{
throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
}
return value;
}
public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9300 value, IJT809Config config)
{
writer.WriteStringPadRight(value.VehicleNo, 21);
writer.WriteByte((byte)value.VehicleColor);
writer.WriteUInt16(value.SubBusinessType);
try
{
// 先写入内容,然后在根据内容反写内容长度
writer.Skip(4, out int subContentLengthPosition);
if (value.SubBodies != null)
{
if (!value.SubBodies.SkipSerialization)
{
JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(
value.SubBodies,
ref writer, value.SubBodies,
config);
}
}
writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition);
}
catch
{
throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
}
}
}
}