using JT808.Protocol.Extensions; using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; namespace JT808.Protocol.MessageBody { /// /// 设置终端参数 /// public class JT808_0x8103 : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze { /// /// 0x8103 /// public override ushort MsgId { get; } = 0x8103; /// /// 设置终端参数 /// public override string Description => "设置终端参数"; /// /// 参数总数 /// internal byte ParamCount { get { if (CustomParamList != null) { return (byte)(ParamList.Count + CustomParamList.Count); } return (byte)(ParamList.Count); } } /// /// 参数列表 /// public List ParamList { get; set; } /// /// 自定义参数列表 /// public List CustomParamList { get; set; } /// /// /// /// /// /// public JT808_0x8103 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8103 value = new JT808_0x8103 { ParamList = new List(), CustomParamList = new List() }; var paramCount = reader.ReadByte();//参数总数 try { for (int i = 0; i < paramCount; i++) { var paramId = reader.ReadVirtualUInt32();//参数ID if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); value.ParamList.Add(attachImpl); } else if (config.JT808_0X8103_Custom_Factory.Map.TryGetValue(paramId, out object customInstance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customInstance, ref reader, config); value.CustomParamList.Add(attachImpl); } } } catch { } return value; } /// /// /// /// /// /// public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103 value, IJT808Config config) { writer.WriteByte(value.ParamCount); try { foreach (var item in value.ParamList) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } if (value.CustomParamList != null) { foreach (var item in value.CustomParamList) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } } } catch { } } /// /// /// /// /// /// public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { var paramCount = reader.ReadByte();//参数总数 writer.WriteNumber($"[{paramCount.ReadNumber()}]参数总数", paramCount); try { writer.WriteStartArray("参数项"); for (int i = 0; i < paramCount; i++) { var paramId = reader.ReadVirtualUInt32();//参数ID if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance)) { writer.WriteStartObject(); if(instance is IJT808Description description) { writer.WriteString("参数名称", description.Description); } instance.Analyze(ref reader, writer, config); writer.WriteEndObject(); } else if (config.JT808_0X8103_Custom_Factory.Map.TryGetValue(paramId, out object customInstance)) { writer.WriteStartObject(); if (customInstance is IJT808Description description) { writer.WriteString("自定义参数名称", description.Description); } customInstance.Analyze(ref reader, writer, config); writer.WriteEndObject(); } } writer.WriteEndArray(); } catch (Exception ex) { writer.WriteString($"异常信息", ex.StackTrace); } } } }