using JT808.Protocol.Enums; using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System.Collections.Generic; using System.Text.Json; namespace JT808.Protocol.MessageBody { /// /// 车辆控制 /// public class JT808_0x8500 : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze, IJT808_2019_Version { public override ushort MsgId { get; } = 0x8500; public override string Description => "车辆控制"; /// /// 控制标志 /// 控制指令标志位数据格式 /// 0:车门解锁;1:车门加锁 /// 1-7 保留 /// public byte ControlFlag { get; set; } /// /// 控制类型数量 /// public ushort ControlTypeCount { get; set; } /// /// 用于反序列化的时候,由于厂家自定义类型比较多,所以直接用byte数组存储 /// public byte[] ControlTypeBuffer { get; set; } /// /// 用于序列化的时候,由于厂家自定义类型比较多,所以直接用JT808_0x8500_ControlType /// public List ControlTypes { get; set; } public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x8500 value = new JT808_0x8500(); if (reader.Version == JT808Version.JTT2019) { value.ControlTypeCount = reader.ReadUInt16(); writer.WriteNumber($"[{ value.ControlTypeCount.ReadNumber()}]控制类型数量", value.ControlTypeCount); //todo:待完善 value.ControlTypeBuffer = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); writer.WriteString($"控制类型", value.ControlTypeBuffer.ToHexString()); } else { value.ControlFlag = reader.ReadByte(); writer.WriteNumber($"[{ value.ControlFlag.ReadNumber()}]控制标志", value.ControlFlag); } } public JT808_0x8500 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8500 value = new JT808_0x8500(); if(reader.Version== JT808Version.JTT2019) { value.ControlTypeCount = reader.ReadUInt16(); value.ControlTypeBuffer = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); } else { value.ControlFlag = reader.ReadByte(); } return value; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8500 value, IJT808Config config) { if (writer.Version == JT808Version.JTT2019) { if(value.ControlTypes!=null && value.ControlTypes.Count > 0) { writer.WriteUInt16((ushort)value.ControlTypes.Count); foreach (var item in value.ControlTypes) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } } else { writer.WriteUInt16(value.ControlTypeCount); if(value.ControlTypeBuffer!=null && value.ControlTypeBuffer.Length > 0) { writer.WriteArray(value.ControlTypeBuffer); } } } else { writer.WriteByte(value.ControlFlag); } } } }